{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Archive",
  "home_page_url": "https://markata.dev/",
  "feed_url": "https://markata.dev/archive/feed.json",
  "description": "All posts",
  "authors": [
    {
      "name": "Markata"
    }
  ],
  "items": [
    {
      "id": "https://markata.dev/docs/guides/content-starters/",
      "url": "https://markata.dev/docs/guides/content-starters/",
      "title": "Shared Markdown content starters",
      "content_html": "\u003cp\u003eUse a Markdown starter to define how a new page begins. The same starter is\navailable to \u003ccode\u003emarkata-go new\u003c/code\u003e, its interactive TUI, and the web workbench.\u003c/p\u003e\n\u003cp\u003eCreate \u003ccode\u003econtent-templates/guide.md\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003estarter\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eguide\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eA structured guide with an introduction, steps, and summary.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ealiases\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003etutorial\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e_directory\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eguides\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplateKey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eguide\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{title}}\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{date}}\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Introduction\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Steps\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Summary\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe file name supplies the starter name when \u003ccode\u003ename\u003c/code\u003e is omitted. \u003ccode\u003e_directory\u003c/code\u003e\nsets its default output directory. \u003ccode\u003edescription\u003c/code\u003e and \u003ccode\u003ealiases\u003c/code\u003e help users find\nit in the editor. These metadata keys are not copied to the new page.\u003c/p\u003e\n\u003cp\u003eThe shared variables are \u003ccode\u003e{{title}}\u003c/code\u003e, \u003ccode\u003e{{slug}}\u003c/code\u003e, \u003ccode\u003e{{date}}\u003c/code\u003e, and\n\u003ccode\u003e{{datetime}}\u003c/code\u003e. They work in frontmatter and body text. Unknown variables stay\nas written, which lets another renderer use its own syntax.\u003c/p\u003e\n\u003cp\u003eRun \u003ccode\u003emarkata-go new --list\u003c/code\u003e to see starters, then create content with:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new \u003cspan class=\"s2\"\u003e\u0026#34;My Guide\u0026#34;\u003c/span\u003e --template guide\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe web workbench discovers starters from the same configured\n\u003ccode\u003econtent_templates.directory\u003c/code\u003e (default: \u003ccode\u003econtent-templates\u003c/code\u003e). The CLI and\ninteractive TUI use that same directory. Existing TOML-defined templates and\nbuilt-ins remain available.\u003c/p\u003e\n\u003cp\u003eSee the \u003ca href=\"../reference/cli.md#template-system\"\u003eCLI reference\u003c/a\u003e and\n\u003ca href=\"../../spec/spec/CONTENT_TEMPLATES.md\"\u003estarter specification\u003c/a\u003e for the full\nformat and precedence rules.\u003c/p\u003e\n",
      "content_text": "\nUse a Markdown starter to define how a new page begins. The same starter is\navailable to `markata-go new`, its interactive TUI, and the web workbench.\n\nCreate `content-templates/guide.md`:\n\n```markdown\n---\nstarter:\n  name: guide\n  description: A structured guide with an introduction, steps, and summary.\n  aliases:\n    - tutorial\n_directory: guides\ntemplateKey: guide\ntitle: \"{{title}}\"\ndate: \"{{date}}\"\npublished: false\ntags: []\n---\n\n## Introduction\n\n## Steps\n\n## Summary\n```\n\nThe file name supplies the starter name when `name` is omitted. `_directory`\nsets its default output directory. `description` and `aliases` help users find\nit in the editor. These metadata keys are not copied to the new page.\n\nThe shared variables are `{{title}}`, `{{slug}}`, `{{date}}`, and\n`{{datetime}}`. They work in frontmatter and body text. Unknown variables stay\nas written, which lets another renderer use its own syntax.\n\nRun `markata-go new --list` to see starters, then create content with:\n\n```sh\nmarkata-go new \"My Guide\" --template guide\n```\n\nThe web workbench discovers starters from the same configured\n`content_templates.directory` (default: `content-templates`). The CLI and\ninteractive TUI use that same directory. Existing TOML-defined templates and\nbuilt-ins remain available.\n\nSee the [CLI reference](../reference/cli.md#template-system) and\n[starter specification](../../spec/spec/CONTENT_TEMPLATES.md) for the full\nformat and precedence rules.\n",
      "summary": "Create reusable Markdown starters for the CLI, TUI, and web workbench.",
      "date_published": "2026-11-01T00:00:00Z",
      "date_modified": "2026-11-01T00:00:00Z",
      "tags": [
        "content",
        "templates",
        "editors"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/static-visualizations/",
      "url": "https://markata.dev/docs/guides/static-visualizations/",
      "title": "Static SVG visualization foundation",
      "content_html": "\u003cp\u003eMarkata is developing a shared backend rendering pipeline so diagrams and charts\ncan arrive as \u003cstrong\u003efinished SVG assets\u003c/strong\u003e, with no visualization engine running in the\nreader\u0026rsquo;s browser.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eAvailability:\u003c/strong\u003e This is a \u003cstrong\u003edeveloper-only foundation\u003c/strong\u003e in\n\u003ccode\u003epkg/visualizations\u003c/code\u003e. There is \u003cstrong\u003eno supported \u003ccode\u003ed2\u003c/code\u003e or \u003ccode\u003evega-lite\u003c/code\u003e Markdown\nfence\u003c/strong\u003e, site configuration section, or new \u003ccode\u003emarkata render\u003c/code\u003e capability yet.\nThe existing \u003ccode\u003emermaid\u003c/code\u003e and \u003ccode\u003echartjs\u003c/code\u003e syntax and output are unchanged.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"what-the-foundation-provides\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat the foundation provides\u003c/span\u003e \u003ca href=\"#what-the-foundation-provides\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA backend renderer produces SVG bytes from a request. The common package then\nchecks bounded SVG output, derives intrinsic dimensions, assigns a SHA-256-based\nfilename, publishes the asset and emits normal HTML for a \u003ccode\u003efigure\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esource + palette + font + renderer/version + options\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebackend Renderer.RenderSVG(ctx, request)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipeline (in-process cache and concurrent coalescing)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eNewSVGAsset -\u0026gt; Publish(outputDir, asset)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;figure\u0026gt;\u0026lt;img src=\u0026#34;/assets/visualizations/\u0026lt;sha256\u0026gt;.svg\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             width=\u0026#34;960\u0026#34; height=\u0026#34;540\u0026#34; alt=\u0026#34;...\u0026#34;\u0026gt;\u0026lt;/figure\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe filename depends on the exact SVG bytes; renderer cache identity also\nincludes the renderer version, theme content hash, and effective options.\nRepeated assets can be reused by the browser or a CDN.\u003c/p\u003e\n\u003ch2 id=\"integrate-a-backend-in-go\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIntegrate a backend in Go\u003c/span\u003e \u003ca href=\"#integrate-a-backend-in-go\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAn adapter implements this interface (shown here for reference, not as a\nworking D2 integration):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eRenderer\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eID\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eRenderSVG\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003evisualizations\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"kt\"\u003ebyte\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse \u003ccode\u003evisualizations.Pipeline.Compile(ctx, backend, request)\u003c/code\u003e for a rendered\n\u003ccode\u003eAsset\u003c/code\u003e. \u003ccode\u003evisualizations.Publish(outputDir, asset)\u003c/code\u003e writes a final static\nasset; \u003ccode\u003evisualizations.FigureHTML(asset, alt, caption, aboveFold)\u003c/code\u003e returns\nescaped markup with an explicit image width and height.\u003c/p\u003e\n\u003cp\u003eThe request must include all layout-affecting inputs, especially theme and\nfont contents. Renderers must obey context cancellation and return actionable\nerrors for unsupported syntax, oversized SVG output, or unavailable layout\ndependencies.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego \u003cspan class=\"nb\"\u003etest\u003c/span\u003e ./pkg/visualizations/...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego \u003cspan class=\"nb\"\u003etest\u003c/span\u003e -race ./pkg/visualizations/...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego vet ./pkg/visualizations/...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"why-the-constraints-matter\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhy the constraints matter\u003c/span\u003e \u003ca href=\"#why-the-constraints-matter\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eNo layout shift from unknown image dimensions:\u003c/strong\u003e the figure includes\nintrinsic \u003ccode\u003ewidth\u003c/code\u003e and \u003ccode\u003eheight\u003c/code\u003e. Responsive site CSS still has to preserve\nthe intended image aspect ratio.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNo visualization JavaScript on the published page:\u003c/strong\u003e the output is a\nnormal external SVG image, not a browser chart/canvas library.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSmaller repeat views:\u003c/strong\u003e a fingerprinted path enables stable cache\nidentities, but Brotli/gzip and appropriate response headers remain\nhosting responsibilities.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBounded processing:\u003c/strong\u003e one SVG has a 4 MiB uncompressed size limit, and\nthe in-process cache holds up to 128 assets or 32 MiB.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClear trust boundary:\u003c/strong\u003e the XML checks reject many active/remote\nconstructs but are not a complete SVG sanitizer, and do \u003cstrong\u003enot\u003c/strong\u003e guarantee\na fully offline page. Author-supplied images and linked resources still\nneed a separate output audit.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe current restrictions also reject some legitimate SVG features such\nas hyperlinks, embedded images, animation, and \u003ccode\u003eforeignObject\u003c/code\u003e. Test\nrepresentative outputs before using a new engine. Large embedded fonts and\ncomplex SVG paths can still increase network and browser-paint cost.\u003c/p\u003e\n\u003ch2 id=\"what-comes-next\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat comes next\u003c/span\u003e \u003ca href=\"#what-comes-next\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eD2 is the intended first backend adapter, followed by Vega-Lite through\n\u003ccode\u003evl-convert\u003c/code\u003e, once each meets compatibility and performance checks.\nSite-builder integration will need base-path-aware asset links and a\nversion-compatible addition to the existing render asset manifest.\u003c/p\u003e\n\u003cp\u003eMermaid and Chart.js remain the supported authoring tools until those\nfollow-ups land. See the \u003ca href=\"/docs/guides/markdown/\"\u003eMarkdown guide\u003c/a\u003e,\n\u003ca href=\"/docs/guides/markdown-chart-fallback/\"\u003eaccessible Chart.js figures\u003c/a\u003e,\nand \u003ca href=\"/docs/guides/python-renderer/\"\u003erenderer interoperability contract\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eFor exact technical invariants, see\n\u003ca href=\"https://github.com/WaylonWalker/markata/blob/main/spec/spec/STATIC_VISUALIZATIONS.md\"\u003e\u003ccode\u003espec/spec/STATIC_VISUALIZATIONS.md\u003c/code\u003e\u003c/a\u003e\n(after this PR merges).\u003c/p\u003e\n",
      "content_text": "\n\nMarkata is developing a shared backend rendering pipeline so diagrams and charts\ncan arrive as **finished SVG assets**, with no visualization engine running in the\nreader's browser.\n\n\u003e **Availability:** This is a **developer-only foundation** in\n\u003e `pkg/visualizations`. There is **no supported `d2` or `vega-lite` Markdown\n\u003e fence**, site configuration section, or new `markata render` capability yet.\n\u003e The existing `mermaid` and `chartjs` syntax and output are unchanged.\n\n## What the foundation provides\n\nA backend renderer produces SVG bytes from a request. The common package then\nchecks bounded SVG output, derives intrinsic dimensions, assigns a SHA-256-based\nfilename, publishes the asset and emits normal HTML for a `figure`:\n\n```text\nsource + palette + font + renderer/version + options\n       |\n       v\nbackend Renderer.RenderSVG(ctx, request)\n       |\n       v\nPipeline (in-process cache and concurrent coalescing)\n       |\n       v\nNewSVGAsset -\u003e Publish(outputDir, asset)\n       |\n       v\n\u003cfigure\u003e\u003cimg src=\"/assets/visualizations/\u003csha256\u003e.svg\"\n             width=\"960\" height=\"540\" alt=\"...\"\u003e\u003c/figure\u003e\n```\n\nThe filename depends on the exact SVG bytes; renderer cache identity also\nincludes the renderer version, theme content hash, and effective options.\nRepeated assets can be reused by the browser or a CDN.\n\n## Integrate a backend in Go\n\nAn adapter implements this interface (shown here for reference, not as a\nworking D2 integration):\n\n```go\ntype Renderer interface {\n    ID() string\n    Version() string\n    RenderSVG(context.Context, visualizations.Request) ([]byte, error)\n}\n```\n\nUse `visualizations.Pipeline.Compile(ctx, backend, request)` for a rendered\n`Asset`. `visualizations.Publish(outputDir, asset)` writes a final static\nasset; `visualizations.FigureHTML(asset, alt, caption, aboveFold)` returns\nescaped markup with an explicit image width and height.\n\nThe request must include all layout-affecting inputs, especially theme and\nfont contents. Renderers must obey context cancellation and return actionable\nerrors for unsupported syntax, oversized SVG output, or unavailable layout\ndependencies.\n\n```bash\ngo test ./pkg/visualizations/...\ngo test -race ./pkg/visualizations/...\ngo vet ./pkg/visualizations/...\n```\n\n## Why the constraints matter\n\n- **No layout shift from unknown image dimensions:** the figure includes\n  intrinsic `width` and `height`. Responsive site CSS still has to preserve\n  the intended image aspect ratio.\n- **No visualization JavaScript on the published page:** the output is a\n  normal external SVG image, not a browser chart/canvas library.\n- **Smaller repeat views:** a fingerprinted path enables stable cache\n  identities, but Brotli/gzip and appropriate response headers remain\n  hosting responsibilities.\n- **Bounded processing:** one SVG has a 4 MiB uncompressed size limit, and\n  the in-process cache holds up to 128 assets or 32 MiB.\n- **Clear trust boundary:** the XML checks reject many active/remote\n  constructs but are not a complete SVG sanitizer, and do **not** guarantee\n  a fully offline page. Author-supplied images and linked resources still\n  need a separate output audit.\n\nThe current restrictions also reject some legitimate SVG features such\nas hyperlinks, embedded images, animation, and `foreignObject`. Test\nrepresentative outputs before using a new engine. Large embedded fonts and\ncomplex SVG paths can still increase network and browser-paint cost.\n\n## What comes next\n\nD2 is the intended first backend adapter, followed by Vega-Lite through\n`vl-convert`, once each meets compatibility and performance checks.\nSite-builder integration will need base-path-aware asset links and a\nversion-compatible addition to the existing render asset manifest.\n\nMermaid and Chart.js remain the supported authoring tools until those\nfollow-ups land. See the [Markdown guide](/docs/guides/markdown/),\n[accessible Chart.js figures](/docs/guides/markdown-chart-fallback/),\nand [renderer interoperability contract](/docs/guides/python-renderer/).\n\nFor exact technical invariants, see\n[`spec/spec/STATIC_VISUALIZATIONS.md`](https://github.com/WaylonWalker/markata/blob/main/spec/spec/STATIC_VISUALIZATIONS.md)\n(after this PR merges).\n",
      "summary": "Developing backend-rendered SVG adapters with deterministic assets, dimensions, caching, and explicit limits.",
      "date_published": "2026-10-31T00:00:00Z",
      "date_modified": "2026-10-31T00:00:00Z",
      "tags": [
        "documentation",
        "rendering",
        "performance",
        "development"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/python-render-pool/",
      "url": "https://markata.dev/docs/guides/python-render-pool/",
      "title": "Warm renderer pool for FastAPI",
      "content_html": "\u003cp\u003eThe Python standalone render API normally starts the bundled Go executable for\neach call. Applications that render repeatedly can instead own a fixed pool of\npersistent renderer processes using \u003ccode\u003eRendererPool\u003c/code\u003e. The pool is started and\nstopped by the application\u0026rsquo;s lifespan; \u003cstrong\u003eno separate daemon or CLI setup is\nrequired\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"fastapi-lifespan-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFastAPI lifespan integration\u003c/span\u003e \u003ca href=\"#fastapi-lifespan-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003econtextlib\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003easynccontextmanager\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003efastapi\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eFastAPI\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003epydantic\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eBaseModel\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003emarkata\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eRendererPool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003ePreview\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eBaseModel\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@asynccontextmanager\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003easync\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003elifespan\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eFastAPI\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003easync\u003c/span\u003e \u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003eRendererPool\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eworkers\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003emax_pending\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e64\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eworkspace\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;.\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003epool\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estate\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erenderer_pool\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eyield\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eFastAPI\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003elifespan\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003elifespan\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@app.post\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/preview\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003easync\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003epreview\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ePreview\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eresult\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estate\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erenderer_pool\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erender\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;html\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eresult\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;features\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eresult\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efeatures\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s2\"\u003e\u0026#34;assets\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eresult\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eassets\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe pool starts all workers at startup, verifies the persistent protocol via\na capability request, and maintains a queue of idle renderers. Each worker is\none bundled Go process that handles sequential JSON-lines requests. Requests\ncan run concurrently across workers. The Go protocol caches configured parser\ninstances so subsequent requests avoid parser reinitialization too.\u003c/p\u003e\n\u003cp\u003eSet \u003ccode\u003einline_assets=True\u003c/code\u003e to embed styles and scripts in the returned result\nor serve \u003ccode\u003eresult.assets\u003c/code\u003e separately, as with \u003ccode\u003emarkata.render_async\u003c/code\u003e. Rendering\noptions \u003ccode\u003eunsafe\u003c/code\u003e, \u003ccode\u003easset_base\u003c/code\u003e, and \u003ccode\u003einline_assets\u003c/code\u003e can be supplied on individual\npool requests.\u003c/p\u003e\n\u003ch2 id=\"lifecycle-and-limits\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLifecycle and limits\u003c/span\u003e \u003ca href=\"#lifecycle-and-limits\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eworkers=2\u003c/code\u003e starts two subprocesses per running application process. With\n\u003ccode\u003euvicorn --workers 4\u003c/code\u003e, that is \u003cstrong\u003eeight\u003c/strong\u003e Go subprocesses. Size the pool\naccordingly; it does not share processes across Uvicorn workers.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emax_pending=64\u003c/code\u003e limits the number of waiting requests in addition to the\ncurrently active worker slots. When saturated, callers receive \u003ccode\u003eRenderError\u003c/code\u003e\nrather than growing an unbounded backlog.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erender(..., timeout=30)\u003c/code\u003e covers queue wait and rendering. A timed-out or\ncancelled in-flight request kills and replaces that worker so a late result\ncannot contaminate a later request.\u003c/li\u003e\n\u003cli\u003eUnexpected child exit or broken protocol also replaces the affected process.\nA failed replacement makes the pool report an error rather than hang forever.\u003c/li\u003e\n\u003cli\u003eExiting the lifespan terminates and reaps its child processes. Do not share\nthe pool across Python event loops or fork a process after starting it.\u003c/li\u003e\n\u003cli\u003eRequests retain the standalone renderer\u0026rsquo;s 200,000-byte source limit. The\nwire protocol has a 1 MiB request frame limit.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe pool requires a bundled Go executable supporting \u003ccode\u003emarkata render --stdio\u003c/code\u003e.\nThe original \u003ccode\u003erender()\u003c/code\u003e and \u003ccode\u003erender_async()\u003c/code\u003e remain backward-compatible one-shot\nAPIs and do \u003cstrong\u003enot\u003c/strong\u003e implicitly start a pool.\u003c/p\u003e\n\u003cp\u003eAn optional \u003ccode\u003eworkspace='.'\u003c/code\u003e loads Markata\u0026rsquo;s site configuration once at startup,\nmatching the standalone Python renderer\u0026rsquo;s workspace behavior. Restart the pool\nafter changing configuration. This is not an HTML sanitizer; keep \u003ccode\u003eunsafe=False\u003c/code\u003e for\nuntrusted authored HTML and apply your application\u0026rsquo;s own safety policy.\u003c/p\u003e\n\u003ch2 id=\"performance-verification\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePerformance verification\u003c/span\u003e \u003ca href=\"#performance-verification\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMeasure median and p95 of warm pool calls versus \u003ccode\u003erender_async()\u003c/code\u003e on the same\nmachine, with at least 100 requests for each fixture. Also measure throughput\nat concurrency 1, 2, and 4, resident memory per pool worker, initial startup\nlatency, and large Chart.js response transfer. The existing standalone Go\nbenchmarks are not end-to-end pool timings. Do not assume the same latency\nuntil the Python-to-Go pipe and JSON costs are measured.\u003c/p\u003e\n",
      "content_text": "\nThe Python standalone render API normally starts the bundled Go executable for\neach call. Applications that render repeatedly can instead own a fixed pool of\npersistent renderer processes using `RendererPool`. The pool is started and\nstopped by the application's lifespan; **no separate daemon or CLI setup is\nrequired**.\n\n## FastAPI lifespan integration\n\n```python\nfrom contextlib import asynccontextmanager\n\nfrom fastapi import FastAPI, Request\nfrom pydantic import BaseModel\nfrom markata import RendererPool\n\nclass Preview(BaseModel):\n    markdown: str\n\n@asynccontextmanager\nasync def lifespan(app: FastAPI):\n    async with RendererPool(workers=2, max_pending=64, workspace='.') as pool:\n        app.state.renderer_pool = pool\n        yield\n\napp = FastAPI(lifespan=lifespan)\n\n@app.post(\"/preview\")\nasync def preview(body: Preview, request: Request):\n    result = await request.app.state.renderer_pool.render(body.markdown)\n    return {\"html\": result.html, \"features\": result.features,\n            \"assets\": result.assets}\n```\n\nThe pool starts all workers at startup, verifies the persistent protocol via\na capability request, and maintains a queue of idle renderers. Each worker is\none bundled Go process that handles sequential JSON-lines requests. Requests\ncan run concurrently across workers. The Go protocol caches configured parser\ninstances so subsequent requests avoid parser reinitialization too.\n\nSet `inline_assets=True` to embed styles and scripts in the returned result\nor serve `result.assets` separately, as with `markata.render_async`. Rendering\noptions `unsafe`, `asset_base`, and `inline_assets` can be supplied on individual\npool requests.\n\n## Lifecycle and limits\n\n- `workers=2` starts two subprocesses per running application process. With\n  `uvicorn --workers 4`, that is **eight** Go subprocesses. Size the pool\n  accordingly; it does not share processes across Uvicorn workers.\n- `max_pending=64` limits the number of waiting requests in addition to the\n  currently active worker slots. When saturated, callers receive `RenderError`\n  rather than growing an unbounded backlog.\n- `render(..., timeout=30)` covers queue wait and rendering. A timed-out or\n  cancelled in-flight request kills and replaces that worker so a late result\n  cannot contaminate a later request.\n- Unexpected child exit or broken protocol also replaces the affected process.\n  A failed replacement makes the pool report an error rather than hang forever.\n- Exiting the lifespan terminates and reaps its child processes. Do not share\n  the pool across Python event loops or fork a process after starting it.\n- Requests retain the standalone renderer's 200,000-byte source limit. The\n  wire protocol has a 1 MiB request frame limit.\n\nThe pool requires a bundled Go executable supporting `markata render --stdio`.\nThe original `render()` and `render_async()` remain backward-compatible one-shot\nAPIs and do **not** implicitly start a pool.\n\nAn optional `workspace='.'` loads Markata's site configuration once at startup,\nmatching the standalone Python renderer's workspace behavior. Restart the pool\nafter changing configuration. This is not an HTML sanitizer; keep `unsafe=False` for\nuntrusted authored HTML and apply your application's own safety policy.\n\n## Performance verification\n\nMeasure median and p95 of warm pool calls versus `render_async()` on the same\nmachine, with at least 100 requests for each fixture. Also measure throughput\nat concurrency 1, 2, and 4, resident memory per pool worker, initial startup\nlatency, and large Chart.js response transfer. The existing standalone Go\nbenchmarks are not end-to-end pool timings. Do not assume the same latency\nuntil the Python-to-Go pipe and JSON costs are measured.\n",
      "summary": "Keep Markata renderer workers warm for concurrent FastAPI requests",
      "date_published": "2026-10-31T00:00:00Z",
      "date_modified": "2026-10-31T00:00:00Z",
      "tags": [
        "documentation",
        "python",
        "fastapi",
        "performance"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/pypi-binary-wheels/",
      "url": "https://markata.dev/docs/guides/pypi-binary-wheels/",
      "title": "PyPI installation of Go Markata using Simon Willison’s go-to-wheel",
      "content_html": "\u003cp\u003e\u003cstrong\u003eDecision (October 18, 2026): \u003ccode\u003epip install markata\u003c/code\u003e should install the Go\nimplementation.\u003c/strong\u003e This is an intentional handoff of the existing PyPI\ndistribution name, not a rename of the Python import-compatible library.\nMarkata remains on the \u003cstrong\u003e0.x\u003c/strong\u003e release line. Existing Python releases remain\nimmutable on PyPI and in \u003ca href=\"https://github.com/WaylonWalker/markata-py\"\u003eWaylonWalker/markata-py\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"packaging-tool\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePackaging tool\u003c/span\u003e \u003ca href=\"#packaging-tool\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWe use Simon Willison\u0026rsquo;s \u003ca href=\"https://github.com/simonw/go-to-wheel\"\u003ego-to-wheel\u003c/a\u003e\n(version \u003ccode\u003e0.2\u003c/code\u003e) to compile our \u003ccode\u003e./cmd/markata\u003c/code\u003e Go CLI into eight native wheels:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLinux amd64/arm64, both glibc and musl (four wheels).\u003c/li\u003e\n\u003cli\u003emacOS Intel and Apple Silicon (two wheels).\u003c/li\u003e\n\u003cli\u003eWindows amd64 and arm64 (two wheels).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ccode\u003ego-to-wheel\u003c/code\u003e requires the \u003ccode\u003ego.mod\u003c/code\u003e directory to also be the CLI package.\nMarkata\u0026rsquo;s CLI is under \u003ccode\u003ecmd/markata\u003c/code\u003e. Our\n\u003ca href=\"../../scripts/build-pypi-wheels.sh\"\u003e\u003ccode\u003escripts/build-pypi-wheels.sh\u003c/code\u003e\u003c/a\u003e\ntemporarily copies its existing \u003ccode\u003emain.go\u003c/code\u003e into the module root solely for\ncompilation, then removes it, preserving the canonical CLI implementation and\nnormal Go module. It sets version and commit metadata in the built binary.\u003c/p\u003e\n\u003cp\u003eWhen installed, \u003ccode\u003emarkata\u003c/code\u003e is a minimal Python entry point which executes the\nbundled Go binary, \u003cstrong\u003enot\u003c/strong\u003e the historical Python Markata CLI or library. There\nis no network download at first run and no Go compiler required on end-user\nmachines.\u003c/p\u003e\n\u003ch2 id=\"build-and-test-without-publishing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild and test, without publishing\u003c/span\u003e \u003ca href=\"#build-and-test-without-publishing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRun from the Go repository root with Go 1.27 and Python 3.10+:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython -m pip install \u003cspan class=\"s1\"\u003e\u0026#39;go-to-wheel==0.2\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebash scripts/build-pypi-wheels.sh 0.14.0.dev0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_WHEEL_VERSION\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e0.14.0.dev0 python scripts/check-pypi-wheels.py dist/pypi-wheels\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython -m venv .venv-markata\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e. .venv-markata/bin/activate\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython -m pip install ./dist/pypi-wheels/markata-0.14.0.dev0-py3-none-manylinux_2_17_x86_64.whl\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata --help\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe \u003ca href=\"../../.github/workflows/pypi-go-wheels.yml\"\u003ewheel CI workflow\u003c/a\u003e\nautomatically repeats the build and verifies tags, embedded OS executables,\nmetadata, installation in a clean venv, and \u003ccode\u003epython -m markata\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"publishing-the-name-handoff\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePublishing the name handoff\u003c/span\u003e \u003ca href=\"#publishing-the-name-handoff\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAs of this documentation change, \u003cstrong\u003ethe public PyPI project is still Python\nMarkata until a Go wheel upload succeeds and is confirmed on PyPI\u003c/strong\u003e.\nThe existing Python release \u003ccode\u003emarkata==0.10.0\u003c/code\u003e remains available as a pin.\nThe newest prior Python prerelease is \u003ccode\u003e0.11.0.dev11\u003c/code\u003e. PyPI does not permit\nreplacing those immutable files with Go binaries.\u003c/p\u003e\n\u003cp\u003eTo publish Go Markata (first proposed PyPI Go version: \u003cstrong\u003e\u003ccode\u003e0.14.0\u003c/code\u003e\u003c/strong\u003e), the\nowner must do the following once:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eSign into the existing \u003ca href=\"https://pypi.org/manage/project/markata/\"\u003ePyPI \u003ccode\u003emarkata\u003c/code\u003e project\u003c/a\u003e,\nopen \u003cstrong\u003ePublishing\u003c/strong\u003e, and add a \u003cstrong\u003eGitHub Actions Trusted Publisher\u003c/strong\u003e:\n\u003cul\u003e\n\u003cli\u003eowner: \u003ccode\u003eWaylonWalker\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003erepository: \u003ccode\u003emarkata\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eworkflow filename: \u003ccode\u003epypi-go-wheels.yml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eenvironment: \u003ccode\u003epypi\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eIn GitHub \u003ccode\u003eWaylonWalker/markata\u003c/code\u003e, create or verify a \u003cstrong\u003epypi\u003c/strong\u003e environment\nwith protection (reviewers and restrictions to \u003ccode\u003emain\u003c/code\u003e) so an unreviewed\nworkflow cannot publish packages.\u003c/li\u003e\n\u003cli\u003eOnce CI passes and the trusted publisher is configured, open \u003cstrong\u003eActions →\nGo Markata PyPI wheels → Run workflow\u003c/strong\u003e, on branch \u003ccode\u003emain\u003c/code\u003e, set:\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eversion\u003c/code\u003e: \u003ccode\u003e0.14.0\u003c/code\u003e (or another approved, \u003cem\u003eunpublished\u003c/em\u003e 0.x version)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epublish\u003c/code\u003e: true\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econfirm\u003c/code\u003e: \u003ccode\u003eREPLACE_PYTHON_MARKATA_WITH_GO\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eApprove the \u003ccode\u003epypi\u003c/code\u003e environment gate.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eCheck the resulting PyPI release and \u003cstrong\u003etest a new\u003c/strong\u003e \u003ccode\u003epython -m venv\u003c/code\u003e with\n\u003ccode\u003epython -m pip install markata\u003c/code\u003e and \u003ccode\u003emarkata version\u003c/code\u003e.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThe publish job is a separate, minimal-permission job using PyPA\n\u003ccode\u003epypa/gh-action-pypi-publish\u003c/code\u003e and short-lived OIDC tokens. Pull requests,\nmanual dry-runs, and non-main branches never publish. An explicit confirmation\nstring and GitHub environment gate prevent accidental uploads.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFreeze the Python repo\u0026rsquo;s old manual PyPI release workflow\u003c/strong\u003e as part of the\nhandoff so a future Python release does not retake the latest PyPI version.\nIt currently needs owner attention because GitHub rejects branch creation in\n\u003ccode\u003eWaylonWalker/markata-py\u003c/code\u003e. Do not reuse its existing \u003ccode\u003epypi_password\u003c/code\u003e secret.\u003c/p\u003e\n\u003ch2 id=\"compatibility-consequences\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCompatibility consequences\u003c/span\u003e \u003ca href=\"#compatibility-consequences\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUsers needing the historical Python library should pin the last Python\nrelease in a separate environment: \u003ccode\u003epython -m pip install markata==0.10.0\u003c/code\u003e.\nThis is \u003cstrong\u003enot\u003c/strong\u003e the Go executable and is not a maintained 0.x Go release.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eimport markata\u003c/code\u003e from a new Go wheel is only a tiny binary-launching\nwrapper; it is not API compatible with old Python Markata plugins.\u003c/li\u003e\n\u003cli\u003eExisting Go binaries, \u003ccode\u003emarkata-go\u003c/code\u003e entry points, Kubernetes Helm settings,\nand Go GitHub releases are unchanged by this PyPI handoff.\u003c/li\u003e\n\u003cli\u003eOn unsupported Python/platform/architecture combinations, pip may select an\n\u003cem\u003eolder Python release\u003c/em\u003e rather than the Go wheel. The eight-wheel matrix must\nbe checked before making blanket cross-platform promises.\u003c/li\u003e\n\u003cli\u003eNo stable Go \u003cstrong\u003e1.0\u003c/strong\u003e release or repository version tag is required.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThis release is an explicitly authorized new PyPI packaging path, distinct from\nthe earlier GitHub repository rename. The version is chosen on dispatch.\u003c/p\u003e\n\u003ch2 id=\"current-installation-status\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCurrent installation status\u003c/span\u003e \u003ca href=\"#current-installation-status\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe PyPI handoff has occurred: current \u003ccode\u003emarkata\u003c/code\u003e releases install the Go CLI after a version break from the Python implementation. Historical Python wheels remain immutable and can be pinned. This handoff does not imply Python API compatibility. The release preparation steps above document the transition process, not the present installer identity.\u003c/p\u003e\n",
      "content_text": "\n\n**Decision (October 18, 2026): `pip install markata` should install the Go\nimplementation.** This is an intentional handoff of the existing PyPI\ndistribution name, not a rename of the Python import-compatible library.\nMarkata remains on the **0.x** release line. Existing Python releases remain\nimmutable on PyPI and in [WaylonWalker/markata-py](https://github.com/WaylonWalker/markata-py).\n\n## Packaging tool\n\nWe use Simon Willison's [go-to-wheel](https://github.com/simonw/go-to-wheel)\n(version `0.2`) to compile our `./cmd/markata` Go CLI into eight native wheels:\n\n- Linux amd64/arm64, both glibc and musl (four wheels).\n- macOS Intel and Apple Silicon (two wheels).\n- Windows amd64 and arm64 (two wheels).\n\n`go-to-wheel` requires the `go.mod` directory to also be the CLI package.\nMarkata's CLI is under `cmd/markata`. Our\n[`scripts/build-pypi-wheels.sh`](../../scripts/build-pypi-wheels.sh)\ntemporarily copies its existing `main.go` into the module root solely for\ncompilation, then removes it, preserving the canonical CLI implementation and\nnormal Go module. It sets version and commit metadata in the built binary.\n\nWhen installed, `markata` is a minimal Python entry point which executes the\nbundled Go binary, **not** the historical Python Markata CLI or library. There\nis no network download at first run and no Go compiler required on end-user\nmachines.\n\n## Build and test, without publishing\n\nRun from the Go repository root with Go 1.27 and Python 3.10+:\n\n```bash\npython -m pip install 'go-to-wheel==0.2'\nbash scripts/build-pypi-wheels.sh 0.14.0.dev0\nMARKATA_WHEEL_VERSION=0.14.0.dev0 python scripts/check-pypi-wheels.py dist/pypi-wheels\n\npython -m venv .venv-markata\n. .venv-markata/bin/activate\npython -m pip install ./dist/pypi-wheels/markata-0.14.0.dev0-py3-none-manylinux_2_17_x86_64.whl\nmarkata --help\nmarkata version\n```\n\nThe [wheel CI workflow](../../.github/workflows/pypi-go-wheels.yml)\nautomatically repeats the build and verifies tags, embedded OS executables,\nmetadata, installation in a clean venv, and `python -m markata`.\n\n## Publishing the name handoff\n\nAs of this documentation change, **the public PyPI project is still Python\nMarkata until a Go wheel upload succeeds and is confirmed on PyPI**.\nThe existing Python release `markata==0.10.0` remains available as a pin.\nThe newest prior Python prerelease is `0.11.0.dev11`. PyPI does not permit\nreplacing those immutable files with Go binaries.\n\nTo publish Go Markata (first proposed PyPI Go version: **`0.14.0`**), the\nowner must do the following once:\n\n1. Sign into the existing [PyPI `markata` project](https://pypi.org/manage/project/markata/),\n   open **Publishing**, and add a **GitHub Actions Trusted Publisher**:\n   - owner: `WaylonWalker`\n   - repository: `markata`\n   - workflow filename: `pypi-go-wheels.yml`\n   - environment: `pypi`\n2. In GitHub `WaylonWalker/markata`, create or verify a **pypi** environment\n   with protection (reviewers and restrictions to `main`) so an unreviewed\n   workflow cannot publish packages.\n3. Once CI passes and the trusted publisher is configured, open **Actions →\n   Go Markata PyPI wheels → Run workflow**, on branch `main`, set:\n   - `version`: `0.14.0` (or another approved, *unpublished* 0.x version)\n   - `publish`: true\n   - `confirm`: `REPLACE_PYTHON_MARKATA_WITH_GO`\n   - Approve the `pypi` environment gate.\n4. Check the resulting PyPI release and **test a new** `python -m venv` with\n   `python -m pip install markata` and `markata version`.\n\nThe publish job is a separate, minimal-permission job using PyPA\n`pypa/gh-action-pypi-publish` and short-lived OIDC tokens. Pull requests,\nmanual dry-runs, and non-main branches never publish. An explicit confirmation\nstring and GitHub environment gate prevent accidental uploads.\n\n**Freeze the Python repo's old manual PyPI release workflow** as part of the\nhandoff so a future Python release does not retake the latest PyPI version.\nIt currently needs owner attention because GitHub rejects branch creation in\n`WaylonWalker/markata-py`. Do not reuse its existing `pypi_password` secret.\n\n## Compatibility consequences\n\n- Users needing the historical Python library should pin the last Python\n  release in a separate environment: `python -m pip install markata==0.10.0`.\n  This is **not** the Go executable and is not a maintained 0.x Go release.\n- `import markata` from a new Go wheel is only a tiny binary-launching\n  wrapper; it is not API compatible with old Python Markata plugins.\n- Existing Go binaries, `markata-go` entry points, Kubernetes Helm settings,\n  and Go GitHub releases are unchanged by this PyPI handoff.\n- On unsupported Python/platform/architecture combinations, pip may select an\n  *older Python release* rather than the Go wheel. The eight-wheel matrix must\n  be checked before making blanket cross-platform promises.\n- No stable Go **1.0** release or repository version tag is required.\n\nThis release is an explicitly authorized new PyPI packaging path, distinct from\nthe earlier GitHub repository rename. The version is chosen on dispatch.\n\n## Current installation status\n\nThe PyPI handoff has occurred: current `markata` releases install the Go CLI after a version break from the Python implementation. Historical Python wheels remain immutable and can be pinned. This handoff does not imply Python API compatibility. The release preparation steps above document the transition process, not the present installer identity.\n",
      "summary": "Decision (October 18, 2026): pip install markata should install the Go",
      "date_published": "2026-10-31T00:00:00Z",
      "date_modified": "2026-10-31T00:00:00Z",
      "tags": [
        "documentation"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/fast-pr-gate-rollout/",
      "url": "https://markata.dev/docs/guides/fast-pr-gate-rollout/",
      "title": "Fast PR gate rollout",
      "content_html": "\u003cp\u003eTracking issue: \u003ca href=\"https://github.com/WaylonWalker/markata/issues/1747\"\u003e#1747\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"current-stage-shadow-validation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCurrent stage: shadow validation\u003c/span\u003e \u003ca href=\"#current-stage-shadow-validation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe new \u003ca href=\"../../.github/workflows/pr-fast.yml\"\u003eFast PR validation\u003c/a\u003e workflow provides\nan always-present \u003ccode\u003ePR Gate\u003c/code\u003e job on pull requests, pushes to main, merge groups,\nand manual dispatch. It runs alongside existing \u003ccode\u003eCI\u003c/code\u003e; \u003cstrong\u003edo not replace any\nrequired check or weaken release gates until the new check has been observed\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003ePR classification is intentionally conservative:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOnly changes confined to \u003ccode\u003edocs/**\u003c/code\u003e, \u003ccode\u003edocs-site/**\u003c/code\u003e, \u003ccode\u003eREADME.md\u003c/code\u003e, or\n\u003ccode\u003eCONTRIBUTING.md\u003c/code\u003e qualify for the docs-only Go-test exemption. The existing\ndocumentation-site workflow still validates relevant documentation changes.\u003c/li\u003e\n\u003cli\u003eAll other changes check gofmt on changed Go files, run a CLI build and smoke check, and \u003ccode\u003ego test -short ./...\u003c/code\u003e\nwith the explicitly observational Build Lab characterization excluded.\u003c/li\u003e\n\u003cli\u003ePython-related source/packaging changes also run \u003ccode\u003epython/tests\u003c/code\u003e unit tests.\u003c/li\u003e\n\u003cli\u003eMain pushes, merge-group checks, and manual runs receive the broad path.\u003c/li\u003e\n\u003cli\u003eFailure to classify changed files is an error; unknown paths are \u003cstrong\u003enot\u003c/strong\u003e\nconsidered documentation-only. Patch whitespace is always verified.\u003c/li\u003e\n\u003cli\u003eUse the stable job name \u003ccode\u003ePR Gate\u003c/code\u003e (not the workflow name) for rulesets.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe full Linux race/coverage shards, macOS/Windows matrix, and specialized\nbrowser/packaging checks continue to run under existing workflows.\nThe Docker PR job no longer repeats a separate \u003ccode\u003ego test ./...\u003c/code\u003e; Docker image\nbuild and smoke tests remain in place, and publishing still tests source before\nadvancing images.\u003c/p\u003e\n\u003ch2 id=\"observed-baseline-2026-10-29-through-2026-10-31\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eObserved baseline: 2026-10-29 through 2026-10-31\u003c/span\u003e \u003ca href=\"#observed-baseline-2026-10-29-through-2026-10-31\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eQueried the repository\u0026rsquo;s completed Actions runs through October 31, identified\n91 completed pull-request runs of the \u003ccode\u003eCI\u003c/code\u003e workflow (47 cancelled, 32\nsuccessful, 11 failed, and 1 other conclusion), then selected the latest \u003cstrong\u003e25 non-cancelled runs\u003c/strong\u003e for latency\nstatistics. The sample is 19 successes and 6 failures; cancelled runs are\nexcluded from latency percentiles, \u003cstrong\u003enot\u003c/strong\u003e silently treated as successes.\u003c/p\u003e\n\u003cp\u003eWall time uses workflow \u003ccode\u003eupdated_at - created_at\u003c/code\u003e (an approximation which can\ninclude rerun elapsed time); job runtime uses \u003ccode\u003ecompleted_at - started_at\u003c/code\u003e.\nNearest-rank percentiles are reported in seconds, rounded to the nearest\nsecond.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eMeasure (25 sampled PR CI runs)\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003ep50\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003ep90\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eCI workflow wall time\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e323s (5m23s)\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e445s (7m25s)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWindows short tests\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e257s\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e409s\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003emacOS short tests\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e118s\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e140s\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLinux core race/coverage\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e264s\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e270s\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLinux CLI/search race/coverage\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e273s\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e287s\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLinux site integration race/coverage\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e280s\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e312s\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLint\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e186s\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e195s\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eWindows has the largest p90; Linux site/CLI also contribute substantially to\nthe critical path. \u003cstrong\u003eDo not assume Windows is always the bottleneck.\u003c/strong\u003e The\nsample\u0026rsquo;s longest observed CI wall time was 1307s, associated with a rerun.\nOne rerun exposed inconsistent job scheduling timestamps; do not subtract\njob creation times to claim accurate runner queue time without verifying the\nrun attempt and dependency waits.\u003c/p\u003e\n\u003cp\u003eRepresentative runs:\n\u003ca href=\"https://github.com/WaylonWalker/markata/actions/runs/41243717555\"\u003erecent success\u003c/a\u003e,\n\u003ca href=\"https://github.com/WaylonWalker/markata/actions/runs/41220799184\"\u003eLinux + Windows comparison\u003c/a\u003e,\n\u003ca href=\"https://github.com/WaylonWalker/markata/actions/runs/41133499891\"\u003eslow rerun\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThis baseline measures the \u003cstrong\u003eexisting\u003c/strong\u003e CI workflow, not the newly introduced\n\u003ccode\u003ePR Gate\u003c/code\u003e. Repeat the same sample method after its deployment; add separate\nrunner queue and dependency-wait metrics from attempt-specific timestamps.\u003c/p\u003e\n\u003ch2 id=\"baseline-and-progression\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBaseline and progression\u003c/span\u003e \u003ca href=\"#baseline-and-progression\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBefore switching branch protection, record at least 20 completed, non-cancelled\nPR runs with each workflow\u0026rsquo;s wall time (created to completion), queue delay,\njob-level duration, pass/fail and critical path. Report p50/p90, not only the\nfastest run. Report cancelled runs separately because frequent commits can bias\nthe successful sample. Include a mix of docs, Go, frontend and packaging PRs.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eShadow:\u003c/strong\u003e Compare \u003ccode\u003ePR Gate\u003c/code\u003e against the existing \u003ccode\u003eCI\u003c/code\u003e check. Investigate\nany disagreement (especially tests skipped by \u003ccode\u003e-short\u003c/code\u003e).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGate migration:\u003c/strong\u003e After evidence is accepted, make only \u003ccode\u003ePR Gate\u003c/code\u003e and\nrelevant focused checks required. Keep the broad matrix on main and nightly.\nCoordinate the change with the existing \u003ca href=\"../../spec/spec/CI.md\"\u003eCI specification\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRelease hardening:\u003c/strong\u003e Validate immutable SHAs and artifacts before any\nstable publishing or promotion. Preserve the existing release/test/sign/SBOM\nchecks throughout the transition.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"github-configuration-maintainer-action\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGitHub configuration (maintainer action)\u003c/span\u003e \u003ca href=\"#github-configuration-maintainer-action\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe workflow itself cannot configure repository branch protection. When ready:\nprotect \u003ccode\u003emain\u003c/code\u003e with \u003ccode\u003ePR Gate\u003c/code\u003e as a required check, require a current branch or\nmerge-queue validation, and forbid bypasses. Do \u003cstrong\u003enot\u003c/strong\u003e drop old required checks\nuntil both are green on real PRs and the policy change has been reviewed.\nFor merge queue, \u003ccode\u003emerge_group\u003c/code\u003e is already subscribed.\u003c/p\u003e\n\u003ch3 id=\"rollback\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRollback\u003c/span\u003e \u003ca href=\"#rollback\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eRestore the existing required check set and disable/remove \u003ccode\u003epr-fast.yml\u003c/code\u003e in a\nsmall revert PR. Docker source tests on actual publication are unchanged.\nNever roll back by bypassing a failed release test or forcing a publication.\u003c/p\u003e\n",
      "content_text": "\n\nTracking issue: [#1747](https://github.com/WaylonWalker/markata/issues/1747).\n\n## Current stage: shadow validation\n\nThe new [Fast PR validation](../../.github/workflows/pr-fast.yml) workflow provides\nan always-present `PR Gate` job on pull requests, pushes to main, merge groups,\nand manual dispatch. It runs alongside existing `CI`; **do not replace any\nrequired check or weaken release gates until the new check has been observed**.\n\nPR classification is intentionally conservative:\n\n- Only changes confined to `docs/**`, `docs-site/**`, `README.md`, or\n  `CONTRIBUTING.md` qualify for the docs-only Go-test exemption. The existing\n  documentation-site workflow still validates relevant documentation changes.\n- All other changes check gofmt on changed Go files, run a CLI build and smoke check, and `go test -short ./...`\n  with the explicitly observational Build Lab characterization excluded.\n- Python-related source/packaging changes also run `python/tests` unit tests.\n- Main pushes, merge-group checks, and manual runs receive the broad path.\n- Failure to classify changed files is an error; unknown paths are **not**\n  considered documentation-only. Patch whitespace is always verified.\n- Use the stable job name `PR Gate` (not the workflow name) for rulesets.\n\nThe full Linux race/coverage shards, macOS/Windows matrix, and specialized\nbrowser/packaging checks continue to run under existing workflows.\nThe Docker PR job no longer repeats a separate `go test ./...`; Docker image\nbuild and smoke tests remain in place, and publishing still tests source before\nadvancing images.\n\n## Observed baseline: 2026-10-29 through 2026-10-31\n\nQueried the repository's completed Actions runs through October 31, identified\n91 completed pull-request runs of the `CI` workflow (47 cancelled, 32\nsuccessful, 11 failed, and 1 other conclusion), then selected the latest **25 non-cancelled runs** for latency\nstatistics. The sample is 19 successes and 6 failures; cancelled runs are\nexcluded from latency percentiles, **not** silently treated as successes.\n\nWall time uses workflow `updated_at - created_at` (an approximation which can\ninclude rerun elapsed time); job runtime uses `completed_at - started_at`.\nNearest-rank percentiles are reported in seconds, rounded to the nearest\nsecond.\n\n| Measure (25 sampled PR CI runs) | p50 | p90 |\n| --- | ---: | ---: |\n| CI workflow wall time | 323s (5m23s) | 445s (7m25s) |\n| Windows short tests | 257s | 409s |\n| macOS short tests | 118s | 140s |\n| Linux core race/coverage | 264s | 270s |\n| Linux CLI/search race/coverage | 273s | 287s |\n| Linux site integration race/coverage | 280s | 312s |\n| Lint | 186s | 195s |\n\nWindows has the largest p90; Linux site/CLI also contribute substantially to\nthe critical path. **Do not assume Windows is always the bottleneck.** The\nsample's longest observed CI wall time was 1307s, associated with a rerun.\nOne rerun exposed inconsistent job scheduling timestamps; do not subtract\njob creation times to claim accurate runner queue time without verifying the\nrun attempt and dependency waits.\n\nRepresentative runs:\n[recent success](https://github.com/WaylonWalker/markata/actions/runs/41243717555),\n[Linux + Windows comparison](https://github.com/WaylonWalker/markata/actions/runs/41220799184),\n[slow rerun](https://github.com/WaylonWalker/markata/actions/runs/41133499891).\n\nThis baseline measures the **existing** CI workflow, not the newly introduced\n`PR Gate`. Repeat the same sample method after its deployment; add separate\nrunner queue and dependency-wait metrics from attempt-specific timestamps.\n\n## Baseline and progression\n\nBefore switching branch protection, record at least 20 completed, non-cancelled\nPR runs with each workflow's wall time (created to completion), queue delay,\njob-level duration, pass/fail and critical path. Report p50/p90, not only the\nfastest run. Report cancelled runs separately because frequent commits can bias\nthe successful sample. Include a mix of docs, Go, frontend and packaging PRs.\n\n1. **Shadow:** Compare `PR Gate` against the existing `CI` check. Investigate\n   any disagreement (especially tests skipped by `-short`).\n2. **Gate migration:** After evidence is accepted, make only `PR Gate` and\n   relevant focused checks required. Keep the broad matrix on main and nightly.\n   Coordinate the change with the existing [CI specification](../../spec/spec/CI.md).\n3. **Release hardening:** Validate immutable SHAs and artifacts before any\n   stable publishing or promotion. Preserve the existing release/test/sign/SBOM\n   checks throughout the transition.\n\n### GitHub configuration (maintainer action)\n\nThe workflow itself cannot configure repository branch protection. When ready:\nprotect `main` with `PR Gate` as a required check, require a current branch or\nmerge-queue validation, and forbid bypasses. Do **not** drop old required checks\nuntil both are green on real PRs and the policy change has been reviewed.\nFor merge queue, `merge_group` is already subscribed.\n\n### Rollback\n\nRestore the existing required check set and disable/remove `pr-fast.yml` in a\nsmall revert PR. Docker source tests on actual publication are unchanged.\nNever roll back by bypassing a failed release test or forcing a publication.\n",
      "summary": "Staged rollout of faster Markata pull-request checks and release-safe validation.",
      "date_published": "2026-10-31T00:00:00Z",
      "date_modified": "2026-10-31T00:00:00Z",
      "tags": [
        "documentation",
        "ci"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/renderer-site-tree/",
      "url": "https://markata.dev/docs/guides/renderer-site-tree/",
      "title": "Editor workspace file tree",
      "content_html": "\u003cp\u003eStart the Go editor for a cloned site:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata editor --workspace ~/git/my-site --port \u003cspan class=\"m\"\u003e8002\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor the Python example, set \u003ccode\u003eMARKATA_LSP_WORKSPACE\u003c/code\u003e to the same site directory\nbefore starting \u003ccode\u003eexamples/fastapi_editor.py\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThe Files tree lists content discovered by Markata\u0026rsquo;s glob plugin. The editor\nreads \u003ccode\u003emarkata-go.toml\u003c/code\u003e, YAML, or JSON configuration from the selected workspace.\nIt uses the configured glob patterns and gitignore behavior. Without a config,\nit discovers Markdown under \u003ccode\u003epages/\u003c/code\u003e and \u003ccode\u003eposts/\u003c/code\u003e with Markata\u0026rsquo;s defaults. The\nFeeds view groups posts selected by configured feed filters. The Tags view groups\nloaded documents by their frontmatter tags. The selector shows each view\u0026rsquo;s count.\u003c/p\u003e\n\u003cp\u003eSelect a file to load its original source, including frontmatter. Edit it and\nview the Go-rendered preview. The Go workbench saves selected Markdown files to\nthe site after a short pause and keeps a browser recovery copy. Scratch drafts\nand imported files stay in browser storage. Use the command palette to export\nthe active file or import a Markdown file. The scratch \u003ccode\u003edraft.md\u003c/code\u003e buffer remains\navailable for imported documents.\u003c/p\u003e\n\u003cp\u003eOnly discovered files inside the selected workspace can be read or written.\nFiles reached through symlinks outside the workspace are excluded. Reads and\nwrites are limited to 200,000 bytes; a failed read or save leaves the current\neditor buffer intact.\u003c/p\u003e\n\u003ch2 id=\"api-usage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAPI usage\u003c/span\u003e \u003ca href=\"#api-usage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGo applications can use \u003ccode\u003eeditorworkspace.New(root)\u003c/code\u003e, \u003ccode\u003eFiles()\u003c/code\u003e, \u003ccode\u003eRead(path)\u003c/code\u003e, and \u003ccode\u003eWrite(path, source)\u003c/code\u003e\nfrom \u003ccode\u003egithub.com/WaylonWalker/markata/pkg/editorworkspace\u003c/code\u003e. Discovery uses the\nexisting glob and load plugins without running a site build.\u003c/p\u003e\n\u003cp\u003ePython applications can use the same implementation through the bundled binary:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003emarkata\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eworkspace_files\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elisting\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eworkspace_files\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/path/to/site\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esource\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eworkspace_files\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/path/to/site\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;posts/hello.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe CLI exposes the JSON interface as \u003ccode\u003emarkata workspace --workspace /path/to/site\u003c/code\u003e\nand \u003ccode\u003emarkata workspace --workspace /path/to/site --file posts/hello.md\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThe Go and FastAPI servers provide \u003ccode\u003eGET /workspace\u003c/code\u003e and\n\u003ccode\u003eGET /workspace/file?path=posts/hello.md\u003c/code\u003e. The Go server also accepts\n\u003ccode\u003ePUT /workspace/file?path=posts/hello.md\u003c/code\u003e for autosave. The browser loads source\non demand.\nSee the \u003ca href=\"./go-workbench/\"\u003eGo editor guide\u003c/a\u003e and \u003ca href=\"./fastapi-editor/\"\u003ePython editor guide\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"site-defaults\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSite defaults\u003c/span\u003e \u003ca href=\"#site-defaults\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen the selected workspace has a config, the editor applies its palette,\nlight/dark fallback, aesthetic, fontpack, text size, palette variables, custom CSS,\nand Markdown highlighting settings. Local \u003ccode\u003epalettes/\u003c/code\u003e and \u003ccode\u003eaesthetics/\u003c/code\u003e catalogs\nresolve from that workspace, as does an explicit \u003ccode\u003efontpacks_file\u003c/code\u003e.\nSaved browser appearance preferences take priority over site defaults.\nThe preview remains an article preview; it does not run page templates or a site build.\u003c/p\u003e\n\u003cp\u003ePython hosts can pass \u003ccode\u003eworkspace=\u0026quot;/path/to/site\u0026quot;\u003c/code\u003e to \u003ccode\u003eappearance()\u003c/code\u003e, \u003ccode\u003erender()\u003c/code\u003e,\nand \u003ccode\u003erender_async()\u003c/code\u003e. The JSON command equivalent is\n\u003ccode\u003emarkata render --workspace /path/to/site --json\u003c/code\u003e (Markdown on stdin), or\n\u003ccode\u003emarkata render --workspace /path/to/site --appearance\u003c/code\u003e for controls and assets.\u003c/p\u003e\n\u003cp\u003eThe editor first discovers paths and opens the selected source. Titles, tags, and\nfeed membership\nload afterward in the background. The Tags view becomes available when metadata\nis ready and builds its tree when opened. Metadata errors do not block editing.\nUse \u003ccode\u003emarkata workspace --paths --workspace PATH\u003c/code\u003e or\n\u003ccode\u003eworkspace_files(PATH, metadata=False)\u003c/code\u003e for discovery without parsing documents.\nServer clients can request \u003ccode\u003eGET /workspace?metadata=true\u003c/code\u003e when they need metadata.\u003c/p\u003e\n\u003cp\u003eIf the workspace contains a real \u003ccode\u003edraft.md\u003c/code\u003e, the scratch buffer appears as\n\u003cstrong\u003eUnsaved draft.md\u003c/strong\u003e (or a numbered variant if that name also exists). Imports\nopen the scratch buffer, and real workspace files retain their own browser drafts.\u003c/p\u003e\n\u003ch2 id=\"reuse-server-state\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReuse server state\u003c/span\u003e \u003ca href=\"#reuse-server-state\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe Go editor retains discovered paths and parsed document metadata for its workspace.\nRepeated file requests check cached membership and read only the selected source.\nThe server reuses its Markdown renderer until the site configuration changes.\nBrowser LSP sessions share parsed workspace data and keep unsaved documents private.\u003c/p\u003e\n\u003cp\u003eA filesystem watcher refreshes changed documents after a short delay.\nConfiguration and appearance changes refresh the renderer on its next request.\nA periodic scan recovers missed filesystem events.\nThe Files, Feeds, and Tags trees refresh when you reload the browser page.\u003c/p\u003e\n\u003cp\u003eReopening a file or reloading the page loads its latest disk content if its browser draft has no edits.\nIf the draft has edits, the editor preserves them.\nA warning identifies disk changes when the saved draft has a source version.\nOlder saved drafts remain intact during migration.\nThe Go workbench automatically saves edits to selected workspace Markdown files.\nScratch drafts and imports stay in browser storage until you export them. The\nbrowser retains a recovery copy if a site save fails.\u003c/p\u003e\n\u003cp\u003eGo hosts can open retained state with \u003ccode\u003eeditorworkspace.Open(ctx, root)\u003c/code\u003e.\nUse \u003ccode\u003ePaths()\u003c/code\u003e, \u003ccode\u003eFiles()\u003c/code\u003e, \u003ccode\u003eRead(path)\u003c/code\u003e, and \u003ccode\u003eSnapshot()\u003c/code\u003e for cached access.\nCall \u003ccode\u003eClose()\u003c/code\u003e when the host stops, or cancel the parent context.\nThe existing \u003ccode\u003eeditorworkspace.New(root)\u003c/code\u003e and Python helpers keep their one-shot behavior.\u003c/p\u003e\n",
      "content_text": "\nStart the Go editor for a cloned site:\n\n```bash\nmarkata editor --workspace ~/git/my-site --port 8002\n```\n\nFor the Python example, set `MARKATA_LSP_WORKSPACE` to the same site directory\nbefore starting `examples/fastapi_editor.py`.\n\nThe Files tree lists content discovered by Markata's glob plugin. The editor\nreads `markata-go.toml`, YAML, or JSON configuration from the selected workspace.\nIt uses the configured glob patterns and gitignore behavior. Without a config,\nit discovers Markdown under `pages/` and `posts/` with Markata's defaults. The\nFeeds view groups posts selected by configured feed filters. The Tags view groups\nloaded documents by their frontmatter tags. The selector shows each view's count.\n\nSelect a file to load its original source, including frontmatter. Edit it and\nview the Go-rendered preview. The Go workbench saves selected Markdown files to\nthe site after a short pause and keeps a browser recovery copy. Scratch drafts\nand imported files stay in browser storage. Use the command palette to export\nthe active file or import a Markdown file. The scratch `draft.md` buffer remains\navailable for imported documents.\n\nOnly discovered files inside the selected workspace can be read or written.\nFiles reached through symlinks outside the workspace are excluded. Reads and\nwrites are limited to 200,000 bytes; a failed read or save leaves the current\neditor buffer intact.\n\n## API usage\n\nGo applications can use `editorworkspace.New(root)`, `Files()`, `Read(path)`, and `Write(path, source)`\nfrom `github.com/WaylonWalker/markata/pkg/editorworkspace`. Discovery uses the\nexisting glob and load plugins without running a site build.\n\nPython applications can use the same implementation through the bundled binary:\n\n```python\nfrom markata import workspace_files\n\nlisting = workspace_files(\"/path/to/site\")\nsource = workspace_files(\"/path/to/site\", path=\"posts/hello.md\")[\"source\"]\n```\n\nThe CLI exposes the JSON interface as `markata workspace --workspace /path/to/site`\nand `markata workspace --workspace /path/to/site --file posts/hello.md`.\n\nThe Go and FastAPI servers provide `GET /workspace` and\n`GET /workspace/file?path=posts/hello.md`. The Go server also accepts\n`PUT /workspace/file?path=posts/hello.md` for autosave. The browser loads source\non demand.\nSee the [Go editor guide](./go-workbench/) and [Python editor guide](./fastapi-editor/).\n\n## Site defaults\n\nWhen the selected workspace has a config, the editor applies its palette,\nlight/dark fallback, aesthetic, fontpack, text size, palette variables, custom CSS,\nand Markdown highlighting settings. Local `palettes/` and `aesthetics/` catalogs\nresolve from that workspace, as does an explicit `fontpacks_file`.\nSaved browser appearance preferences take priority over site defaults.\nThe preview remains an article preview; it does not run page templates or a site build.\n\nPython hosts can pass `workspace=\"/path/to/site\"` to `appearance()`, `render()`,\nand `render_async()`. The JSON command equivalent is\n`markata render --workspace /path/to/site --json` (Markdown on stdin), or\n`markata render --workspace /path/to/site --appearance` for controls and assets.\n\nThe editor first discovers paths and opens the selected source. Titles, tags, and\nfeed membership\nload afterward in the background. The Tags view becomes available when metadata\nis ready and builds its tree when opened. Metadata errors do not block editing.\nUse `markata workspace --paths --workspace PATH` or\n`workspace_files(PATH, metadata=False)` for discovery without parsing documents.\nServer clients can request `GET /workspace?metadata=true` when they need metadata.\n\nIf the workspace contains a real `draft.md`, the scratch buffer appears as\n**Unsaved draft.md** (or a numbered variant if that name also exists). Imports\nopen the scratch buffer, and real workspace files retain their own browser drafts.\n\n## Reuse server state\n\nThe Go editor retains discovered paths and parsed document metadata for its workspace.\nRepeated file requests check cached membership and read only the selected source.\nThe server reuses its Markdown renderer until the site configuration changes.\nBrowser LSP sessions share parsed workspace data and keep unsaved documents private.\n\nA filesystem watcher refreshes changed documents after a short delay.\nConfiguration and appearance changes refresh the renderer on its next request.\nA periodic scan recovers missed filesystem events.\nThe Files, Feeds, and Tags trees refresh when you reload the browser page.\n\nReopening a file or reloading the page loads its latest disk content if its browser draft has no edits.\nIf the draft has edits, the editor preserves them.\nA warning identifies disk changes when the saved draft has a source version.\nOlder saved drafts remain intact during migration.\nThe Go workbench automatically saves edits to selected workspace Markdown files.\nScratch drafts and imports stay in browser storage until you export them. The\nbrowser retains a recovery copy if a site save fails.\n\nGo hosts can open retained state with `editorworkspace.Open(ctx, root)`.\nUse `Paths()`, `Files()`, `Read(path)`, and `Snapshot()` for cached access.\nCall `Close()` when the host stops, or cancel the parent context.\nThe existing `editorworkspace.New(root)` and Python helpers keep their one-shot behavior.\n",
      "summary": "Browse a cloned Markata workspace in the Go and Python editors",
      "date_published": "2026-10-30T00:00:00Z",
      "date_modified": "2026-10-30T00:00:00Z",
      "tags": [
        "documentation",
        "editor"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/renderer-integration-benchmarks/",
      "url": "https://markata.dev/docs/guides/renderer-integration-benchmarks/",
      "title": "Renderer integration benchmarks",
      "content_html": "\u003cp\u003eThese measurements use existing repository fixtures with the \u003ca href=\"/docs/guides/fastapi-editor/\"\u003eFastAPI editor\u003c/a\u003e.\nThe benchmark includes the exact post that \u003ccode\u003eBenchmarkBuild_Incremental\u003c/code\u003e edits: \u003ccode\u003ebenchmarks/site/posts/blog/2024/01/post-001.md\u003c/code\u003e.\nThe other cases come from \u003ccode\u003erendering-fixtures/\u003c/code\u003e; they are visual regression fixtures, rather than existing performance benchmarks.\u003c/p\u003e\n\u003ch2 id=\"fixture-coverage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFixture coverage\u003c/span\u003e \u003ca href=\"#fixture-coverage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFile\u003c/th\u003e\n\u003cth\u003eCoverage\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost-001.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDeterministic site benchmark post, including code\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehome.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSmall page with minimal assets\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkdown-chart-fallback.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChart.js output and accessible data fallbacks\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-card-headings.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCards and expressive headings\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eroads.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRoads, layout styles, and initialization script\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estory-layout.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLonger structured page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etest-headings.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHeading syntax and typography\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eInputs retain their complete file contents, including frontmatter.\nThese calls measure the standalone renderer; they do not run the site build pipeline or its frontmatter loading stage.\u003c/p\u003e\n\u003ch2 id=\"measured-timings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeasured timings\u003c/span\u003e \u003ca href=\"#measured-timings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAll values are milliseconds. The Go column shows the median of three benchmark runs.\nThe other columns show medians across 15 calls, except the final column.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFixture\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eInput bytes\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eGo renderer\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003ePython render call\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eFastAPI render timer, edit\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eHTTP edit\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eHTTP edit p95\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost-001.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1,518\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e3.05\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e137.51\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e135.02\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e136.25\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e148.45\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehome.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e426\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.40\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e128.50\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e128.24\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e129.15\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e136.19\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkdown-chart-fallback.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1,550\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e33.04\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e476.93\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e260.01\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e264.50\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e470.84\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-card-headings.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1,104\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.89\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e151.58\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e152.03\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e153.45\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e167.69\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eroads.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1,598\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1.08\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e139.34\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e174.50\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e177.22\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e224.00\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estory-layout.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e3,900\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1.46\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e156.73\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e153.57\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e154.97\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e174.24\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etest-headings.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1,245\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.82\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e168.01\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e151.57\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e152.70\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e170.24\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eFor the existing site benchmark post, Go rendering takes about 3 ms, while a Python render call takes about 138 ms.\nThe Python API starts a Go process for each call and decodes its JSON output.\nThe gap includes process initialization, serialization, pipe transfer, and Python decoding; these measurements do not isolate each part.\u003c/p\u003e\n\u003cp\u003eChart.js has higher rendering and transfer costs because its response includes vendored JavaScript and generated initialization code.\nThe current fragment response still sends those feature assets with each chart edit.\nKeeping shared CSS loaded does not remove all repeated feature-asset bytes.\u003c/p\u003e\n\u003ch2 id=\"initial-document-versus-later-edits\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInitial document versus later edits\u003c/span\u003e \u003ca href=\"#initial-document-versus-later-edits\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eResponse sizes below are uncompressed JSON body bytes, rounded to KiB (1,024 bytes).\nThey exclude HTTP headers and separately requested appearance assets.\nInitial requests include a full document; edit requests set \u003ccode\u003einclude_document\u003c/code\u003e to \u003ccode\u003efalse\u003c/code\u003e.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFixture\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eInitial HTTP median, ms\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eEdit HTTP median, ms\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eInitial response, KiB\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eEdit response, KiB\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eFewer response bytes\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost-001.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e135.39\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e136.25\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e46.44\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e20.01\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e56.9%\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehome.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e130.10\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e129.15\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e8.13\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.86\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e89.4%\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkdown-chart-fallback.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e432.89\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e264.50\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e460.25\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e226.92\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e50.7%\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-card-headings.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e136.74\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e153.45\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e45.55\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e19.57\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e57.0%\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eroads.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e167.05\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e177.22\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e93.22\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e43.40\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e53.4%\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estory-layout.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e152.85\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e154.97\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e25.48\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e9.54\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e62.6%\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etest-headings.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e154.95\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e152.70\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e13.25\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e3.42\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e74.2%\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eOmitting the document shell reduces response bytes in every fixture.\nIt does not establish a latency improvement: each mode runs separately, and host load varies between modes.\nSome fragment requests therefore take longer despite their smaller responses.\u003c/p\u003e\n\u003ch2 id=\"timing-boundaries-and-limits\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTiming boundaries and limits\u003c/span\u003e \u003ca href=\"#timing-boundaries-and-limits\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eGo renderer:\u003c/strong\u003e \u003ccode\u003eRenderStandalone\u003c/code\u003e setup, Markdown processing, asset generation, and inline tag generation. Fixture reads occur before timing starts.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePython render call:\u003c/strong\u003e synchronous \u003ccode\u003erender(..., inline_assets=True, unsafe=True)\u003c/code\u003e, including process startup, output transfer, and JSON decoding.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFastAPI render timer:\u003c/strong\u003e asynchronous \u003ccode\u003erender_async(...)\u003c/code\u003e, including process startup and JSON decoding. Document construction and HTTP response encoding occur afterward.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHTTP time:\u003c/strong\u003e request object construction, a new localhost connection, FastAPI processing, response transfer, and body reading. Request JSON encoding and response JSON decoding are excluded.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEach Python and HTTP mode has two excluded warm-up calls and 15 measured calls per file.\nEvery render still starts a fresh Go process; these are warm filesystem measurements, rather than a persistent renderer process.\nThe nearest-rank p95 equals the maximum with only 15 samples. Use more samples for stable tail-latency decisions.\u003c/p\u003e\n\u003cp\u003eThe measurements ran sequentially on a shared workstation with normal background activity.\nThey are observations from this host, rather than service limits or a controlled before-and-after experiment.\nThey exclude the editor\u0026rsquo;s 350 ms debounce, browser layout, chart drawing, Mermaid execution, and user-perceived paint time.\nNo site build cache, encryption key, or site configuration participates in these standalone calls.\u003c/p\u003e\n\u003ch2 id=\"environment-and-raw-results\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment and raw results\u003c/span\u003e \u003ca href=\"#environment-and-raw-results\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDate: 2026-10-29 UTC.\u003c/li\u003e\n\u003cli\u003eSource revision: \u003ccode\u003ef226485ead9f91081e2eb3c848b3290bf1df040a\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eCPU: AMD Ryzen 5 3600, 6 cores and 12 logical CPUs.\u003c/li\u003e\n\u003cli\u003eOS: \u003ccode\u003eLinux-7.2.8-9-omarchy-x86_64-with-glibc2.44\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eGo: \u003ccode\u003ego1.26.3 linux/amd64\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003ePython: \u003ccode\u003e3.13.13\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eFastAPI: \u003ccode\u003e0.162.0\u003c/code\u003e; Uvicorn: \u003ccode\u003e0.54.0\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe \u003ca href=\"https://github.com/WaylonWalker/markata/blob/main/benchmarks/renderer-integration-2026-10-29.json\"\u003eJSON report\u003c/a\u003e\ncontains every measured sample, fixture SHA-256 hashes, and the installed binary and wrapper hashes.\nThe \u003ca href=\"https://github.com/WaylonWalker/markata/blob/main/benchmarks/renderer-go-2026-10-29.txt\"\u003eGo benchmark output\u003c/a\u003e\ncontains iteration counts, allocation counts, and all three runs.\u003c/p\u003e\n\u003ch2 id=\"reproduce\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReproduce\u003c/span\u003e \u003ca href=\"#reproduce\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse a virtual environment with the current Markata wheel, FastAPI, and Uvicorn.\nRun these commands from the repository root, sequentially:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython python/benchmark_editor.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego \u003cspan class=\"nb\"\u003etest\u003c/span\u003e ./pkg/plugins -run \u003cspan class=\"s1\"\u003e\u0026#39;^$\u0026#39;\u003c/span\u003e -bench \u003cspan class=\"s1\"\u003e\u0026#39;^BenchmarkRenderStandaloneFixtures$\u0026#39;\u003c/span\u003e -benchtime\u003cspan class=\"o\"\u003e=\u003c/span\u003e200ms -count\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe Python script starts a temporary localhost server and stops it when the run ends.\nIt writes \u003ccode\u003ebenchmarks/renderer-integration-YYYY-MM-DD.json\u003c/code\u003e using the UTC date.\nIt does not replace the live editor server.\u003c/p\u003e\n\u003cp\u003eBefore comparing changes, keep the fixture bytes, dependency versions, machine, and renderer options the same.\nCompare medians and raw samples as well as response sizes.\nUseful next measurements include process initialization, JSON encoding, asset transfer, browser paint, and memory retained after repeated diagram edits.\u003c/p\u003e\n\u003ch2 id=\"go-server-workbench\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGo server workbench\u003c/span\u003e \u003ca href=\"#go-server-workbench\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ca href=\"/docs/guides/go-workbench/\"\u003eGo workbench\u003c/a\u003e uses the same seven fixture files and the same HTTP timing boundaries.\nAll fixture hashes match the Python report above. The server renders directly in process and keeps one previous result in memory.\u003c/p\u003e\n\u003cp\u003eEach mode uses two excluded warm-up calls and 15 measured calls.\nBefore every cache-miss call, a separate unmeasured request renders a small invalidator document.\nThis keeps the measured fixture bytes unchanged while preventing an accidental cache hit.\nEvery measured response checks its \u003ccode\u003ecached\u003c/code\u003e field. Cached edits use the same source repeatedly without invalidation.\nThe invalidator request is excluded from the HTTP time and response size.\u003c/p\u003e\n\u003ch3 id=\"http-results\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHTTP results\u003c/span\u003e \u003ca href=\"#http-results\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eValues are milliseconds. Each median and p95 comes from 15 calls.\nThe Python column comes from the earlier report; the Go columns come from a separate run on the same workstation.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFixture\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003ePython HTTP edit median\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eGo initial miss median\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eGo edit miss median\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eGo edit miss p95\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eGo cached edit median\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost-001.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e136.245\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e2.247\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e2.143\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e3.599\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.365\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehome.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e129.152\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.645\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.466\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.867\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.324\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkdown-chart-fallback.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e264.495\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e36.032\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e28.571\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e53.724\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.295\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-card-headings.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e153.448\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.799\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1.504\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1.790\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.366\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eroads.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e177.217\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.957\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.973\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1.547\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.325\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estory-layout.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e154.968\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1.368\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1.326\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1.827\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.300\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etest-headings.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e152.701\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.838\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.805\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1.721\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.293\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eFor the site benchmark post, an uncached Go edit takes 2.143 ms over loopback HTTP.\nA repeated cached edit takes 0.365 ms.\nThe earlier Python HTTP measurement for that exact file is 136.25 ms.\u003c/p\u003e\n\u003cp\u003eThe Go server avoids a renderer subprocess per request. It also links feature assets instead of embedding their contents in each response.\nBoth differences contribute to the observed gap. These runs do not isolate language or process-startup costs.\nThe native Go renderer benchmark uses inline assets, so it can take longer than the Go HTTP path with linked assets.\u003c/p\u003e\n\u003ch3 id=\"response-sizes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eResponse sizes\u003c/span\u003e \u003ca href=\"#response-sizes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eValues are uncompressed JSON body KiB. Separately requested stylesheets, libraries, and fonts are excluded.\nInitial responses contain a complete document and fragment fields. Edit responses omit the document.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFixture\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003ePython edit response\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eGo initial response\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eGo edit response\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eGo initial-to-edit reduction\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost-001.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e20.01\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e24.62\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e8.82\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e64.2%\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehome.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.86\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e8.99\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1.02\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e88.6%\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkdown-chart-fallback.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e226.92\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e24.15\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e8.54\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e64.6%\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-card-headings.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e19.57\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e12.99\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e2.99\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e77.0%\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eroads.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e43.40\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e19.58\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e6.30\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e67.8%\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estory-layout.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e9.54\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e30.59\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e11.82\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e61.4%\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etest-headings.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e3.42\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e16.24\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e4.65\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e71.4%\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe Go editor retains loaded libraries and shared styles in the preview frame.\nThe linked-asset policy makes its chart response smaller, but the browser must fetch each dependency when it is first needed.\nResponse-size reductions do not include those initial asset transfers and do not establish a browser paint-time improvement.\u003c/p\u003e\n\u003ch3 id=\"go-measurements-and-reproduction\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGo measurements and reproduction\u003c/span\u003e \u003ca href=\"#go-measurements-and-reproduction\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe Go run uses runtime source revision \u003ccode\u003e059bb011f3314c43ca9e0c6e51d7ed735cf68790\u003c/code\u003e.\nThe merged parent adds benchmark tooling and documentation without changing that runtime.\nThe host is the same AMD Ryzen 5 3600 workstation, with 12 logical CPUs and Go 1.26.3.\nThe Go HTTP client uses Python 3.14.8; the earlier Python-reference client uses 3.13.13.\nThe comparison includes that client-version difference. The JSON report records its timestamp, OS, binary hash, and harness hash.\u003c/p\u003e\n\u003cp\u003eThe Go server timer includes rendering, asset registration, and optional document construction.\nIt excludes HTTP JSON encoding and network transfer. The Python server timer above excludes document construction.\nUse HTTP measurements to compare the complete request paths.\u003c/p\u003e\n\u003cp\u003eThese are sequential measurements on a shared workstation, rather than a controlled before-and-after experiment.\nThey exclude server startup, appearance generation, cache invalidation calls, separately fetched assets, editor debounce, browser layout, and drawing.\nThe Go editor debounce is 250 ms. The p95 equals the maximum with 15 samples; larger runs are needed for stable tail estimates.\nNo site configuration, site build cache, encryption keys, or site lifecycle stages participate.\u003c/p\u003e\n\u003cp\u003eThe \u003ca href=\"https://github.com/WaylonWalker/markata/blob/feat/go-render-workbench/benchmarks/go-workbench-2026-10-29.json\"\u003eGo HTTP report\u003c/a\u003e\ncontains every sample and fixture/binary/harness hashes.\nThe \u003ca href=\"https://github.com/WaylonWalker/markata/blob/feat/go-render-workbench/benchmarks/go-workbench-native-2026-10-29.txt\"\u003enative Go output\u003c/a\u003e\ncontains three fresh runs of the parent\u0026rsquo;s renderer benchmark on the same fixtures.\u003c/p\u003e\n\u003cp\u003eRun these commands sequentially from the repository root:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego build -o /tmp/markata-workbench-benchmark ./cmd/markata-workbench\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython python/benchmark_go_editor.py --binary /tmp/markata-workbench-benchmark\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego \u003cspan class=\"nb\"\u003etest\u003c/span\u003e ./pkg/plugins -run \u003cspan class=\"s1\"\u003e\u0026#39;^$\u0026#39;\u003c/span\u003e -bench \u003cspan class=\"s1\"\u003e\u0026#39;^BenchmarkRenderStandaloneFixtures$\u0026#39;\u003c/span\u003e -benchtime\u003cspan class=\"o\"\u003e=\u003c/span\u003e200ms -count\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe standard-library Python client starts a temporary Go server on an OS-assigned loopback port and stops it after the run.\nIt does not restart the live editor or change its cache.\nUse \u003ccode\u003e--samples\u003c/code\u003e, \u003ccode\u003e--warmups\u003c/code\u003e, and \u003ccode\u003e--output\u003c/code\u003e to control the run. The default output uses the UTC date.\u003c/p\u003e\n\u003ch2 id=\"browser-wasm-worker\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBrowser WASM worker\u003c/span\u003e \u003ca href=\"#browser-wasm-worker\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eStart the WASM demo before the benchmark:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython3 scripts/wasm-workbench.py --serve\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIn another terminal, run:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv run --with playwright python scripts/benchmark-wasm.py --output /tmp/wasm-benchmark.json\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse \u003ccode\u003e--url\u003c/code\u003e for a different demo address. Install Playwright Chromium if the browser is unavailable.\nThe benchmark uses the same seven fixtures as the HTTP clients.\nEach fixture uses a fresh worker, two excluded warmups, and fifteen measured renders.\nThe report includes raw samples, fixture hashes, browser version, median, and p95.\u003c/p\u003e\n\u003cp\u003eThese timings measure worker rendering. They exclude worker startup, message transfer, layout, and paint.\nDo not compare them directly with HTTP request timings.\u003c/p\u003e\n\u003cp\u003eLocal demos use these addresses when all three run together:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePython/FastAPI: \u003ccode\u003ehttp://127.0.0.1:8765/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eGo server: \u003ccode\u003ehttp://127.0.0.1:8767/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eBrowser WASM: \u003ccode\u003ehttp://127.0.0.1:8766/\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"integration-verification-on-2026-10-29\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIntegration verification on 2026-10-29\u003c/span\u003e \u003ca href=\"#integration-verification-on-2026-10-29\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFresh reports use the \u003ccode\u003e*-suite-2026-10-29.json\u003c/code\u003e names for Python and Go.\nThe WASM report is \u003ccode\u003ebenchmarks/wasm-workbench-2026-10-29.json\u003c/code\u003e.\nFor \u003ccode\u003epost-001.md\u003c/code\u003e, the Python HTTP edit median was 149.282 ms.\nThe Go HTTP edit median was 2.389 ms; the cached median was 0.301 ms.\nThe WASM worker median was 10.9 ms.\nThese measurements use different timing boundaries and asset policies, as described above.\u003c/p\u003e\n\u003ch2 id=\"shared-editor-features-and-runtime-differences\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eShared editor features and runtime differences\u003c/span\u003e \u003ca href=\"#shared-editor-features-and-runtime-differences\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAll three demos provide the same editor features:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSystem typography, appearance controls, and Default/Vim/Emacs/Sublime keymaps.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOpen .md\u003c/strong\u003e import and \u003cstrong\u003eDownload .md\u003c/strong\u003e export.\u003c/li\u003e\n\u003cli\u003eAutomatic draft recovery and visible save status.\u003c/li\u003e\n\u003cli\u003eLive previews with a 250 ms edit debounce and protection against stale results.\u003c/li\u003e\n\u003cli\u003eA 200,000 UTF-8 byte limit, with errors that preserve the current draft.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAn oversized import leaves the current draft intact. Download the draft before clearing browser storage.\nIf storage is unavailable or full, editing and downloads remain available, but drafts cannot survive closing the page.\nEach origin stores its own draft and appearance settings. Different ports do not share these settings.\nFor a font comparison, select the same font pack and text size in each demo.\nThe default uses system fonts; operating systems can display different system typefaces.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eRuntime behavior\u003c/th\u003e\n\u003cth\u003ePython / FastAPI\u003c/th\u003e\n\u003cth\u003eGo server\u003c/th\u003e\n\u003cth\u003eBrowser WASM\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eRendering location\u003c/td\u003e\n\u003ctd\u003eServer subprocess per request\u003c/td\u003e\n\u003ctd\u003eDirectly in Go server\u003c/td\u003e\n\u003ctd\u003ePersistent browser worker\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMarkdown transfer\u003c/td\u003e\n\u003ctd\u003eHTTP to local server\u003c/td\u003e\n\u003ctd\u003eHTTP to local server\u003c/td\u003e\n\u003ctd\u003eNo render request\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRich feature assets\u003c/td\u003e\n\u003ctd\u003eInline response assets\u003c/td\u003e\n\u003ctd\u003eLinked assets reused by browser\u003c/td\u003e\n\u003ctd\u003eBundled assets cached locally\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eOffline reload\u003c/td\u003e\n\u003ctd\u003eRequires running server\u003c/td\u003e\n\u003ctd\u003eRequires running server\u003c/td\u003e\n\u003ctd\u003eAvailable after \u003cstrong\u003eReady offline\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAuthored raw HTML\u003c/td\u003e\n\u003ctd\u003eEnabled inside sandbox\u003c/td\u003e\n\u003ctd\u003eEnabled inside sandbox\u003c/td\u003e\n\u003ctd\u003eDisabled\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRepeated source\u003c/td\u003e\n\u003ctd\u003eNew renderer process\u003c/td\u003e\n\u003ctd\u003eLast result cache\u003c/td\u003e\n\u003ctd\u003ePersistent renderer runtime\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eRuntime differences do not require different fonts, import controls, or draft feedback.\nRaw HTML and cache policies are demo choices, rather than requirements of Python, Go, or WASM.\nAll previews use a sandbox. Authored external images and links can still access the network.\nThese demos render standalone Markdown; they do not load a site\u0026rsquo;s configuration or run its complete build lifecycle.\u003c/p\u003e\n",
      "content_text": "\nThese measurements use existing repository fixtures with the [FastAPI editor](/docs/guides/fastapi-editor/).\nThe benchmark includes the exact post that `BenchmarkBuild_Incremental` edits: `benchmarks/site/posts/blog/2024/01/post-001.md`.\nThe other cases come from `rendering-fixtures/`; they are visual regression fixtures, rather than existing performance benchmarks.\n\n## Fixture coverage\n\n| File | Coverage |\n| --- | --- |\n| `post-001.md` | Deterministic site benchmark post, including code |\n| `home.md` | Small page with minimal assets |\n| `markdown-chart-fallback.md` | Chart.js output and accessible data fallbacks |\n| `md-card-headings.md` | Cards and expressive headings |\n| `roads.md` | Roads, layout styles, and initialization script |\n| `story-layout.md` | Longer structured page |\n| `test-headings.md` | Heading syntax and typography |\n\nInputs retain their complete file contents, including frontmatter.\nThese calls measure the standalone renderer; they do not run the site build pipeline or its frontmatter loading stage.\n\n## Measured timings\n\nAll values are milliseconds. The Go column shows the median of three benchmark runs.\nThe other columns show medians across 15 calls, except the final column.\n\n| Fixture | Input bytes | Go renderer | Python render call | FastAPI render timer, edit | HTTP edit | HTTP edit p95 |\n| --- | ---: | ---: | ---: | ---: | ---: | ---: |\n| `post-001.md` | 1,518 | 3.05 | 137.51 | 135.02 | 136.25 | 148.45 |\n| `home.md` | 426 | 0.40 | 128.50 | 128.24 | 129.15 | 136.19 |\n| `markdown-chart-fallback.md` | 1,550 | 33.04 | 476.93 | 260.01 | 264.50 | 470.84 |\n| `md-card-headings.md` | 1,104 | 0.89 | 151.58 | 152.03 | 153.45 | 167.69 |\n| `roads.md` | 1,598 | 1.08 | 139.34 | 174.50 | 177.22 | 224.00 |\n| `story-layout.md` | 3,900 | 1.46 | 156.73 | 153.57 | 154.97 | 174.24 |\n| `test-headings.md` | 1,245 | 0.82 | 168.01 | 151.57 | 152.70 | 170.24 |\n\nFor the existing site benchmark post, Go rendering takes about 3 ms, while a Python render call takes about 138 ms.\nThe Python API starts a Go process for each call and decodes its JSON output.\nThe gap includes process initialization, serialization, pipe transfer, and Python decoding; these measurements do not isolate each part.\n\nChart.js has higher rendering and transfer costs because its response includes vendored JavaScript and generated initialization code.\nThe current fragment response still sends those feature assets with each chart edit.\nKeeping shared CSS loaded does not remove all repeated feature-asset bytes.\n\n## Initial document versus later edits\n\nResponse sizes below are uncompressed JSON body bytes, rounded to KiB (1,024 bytes).\nThey exclude HTTP headers and separately requested appearance assets.\nInitial requests include a full document; edit requests set `include_document` to `false`.\n\n| Fixture | Initial HTTP median, ms | Edit HTTP median, ms | Initial response, KiB | Edit response, KiB | Fewer response bytes |\n| --- | ---: | ---: | ---: | ---: | ---: |\n| `post-001.md` | 135.39 | 136.25 | 46.44 | 20.01 | 56.9% |\n| `home.md` | 130.10 | 129.15 | 8.13 | 0.86 | 89.4% |\n| `markdown-chart-fallback.md` | 432.89 | 264.50 | 460.25 | 226.92 | 50.7% |\n| `md-card-headings.md` | 136.74 | 153.45 | 45.55 | 19.57 | 57.0% |\n| `roads.md` | 167.05 | 177.22 | 93.22 | 43.40 | 53.4% |\n| `story-layout.md` | 152.85 | 154.97 | 25.48 | 9.54 | 62.6% |\n| `test-headings.md` | 154.95 | 152.70 | 13.25 | 3.42 | 74.2% |\n\nOmitting the document shell reduces response bytes in every fixture.\nIt does not establish a latency improvement: each mode runs separately, and host load varies between modes.\nSome fragment requests therefore take longer despite their smaller responses.\n\n## Timing boundaries and limits\n\n- **Go renderer:** `RenderStandalone` setup, Markdown processing, asset generation, and inline tag generation. Fixture reads occur before timing starts.\n- **Python render call:** synchronous `render(..., inline_assets=True, unsafe=True)`, including process startup, output transfer, and JSON decoding.\n- **FastAPI render timer:** asynchronous `render_async(...)`, including process startup and JSON decoding. Document construction and HTTP response encoding occur afterward.\n- **HTTP time:** request object construction, a new localhost connection, FastAPI processing, response transfer, and body reading. Request JSON encoding and response JSON decoding are excluded.\n\nEach Python and HTTP mode has two excluded warm-up calls and 15 measured calls per file.\nEvery render still starts a fresh Go process; these are warm filesystem measurements, rather than a persistent renderer process.\nThe nearest-rank p95 equals the maximum with only 15 samples. Use more samples for stable tail-latency decisions.\n\nThe measurements ran sequentially on a shared workstation with normal background activity.\nThey are observations from this host, rather than service limits or a controlled before-and-after experiment.\nThey exclude the editor's 350 ms debounce, browser layout, chart drawing, Mermaid execution, and user-perceived paint time.\nNo site build cache, encryption key, or site configuration participates in these standalone calls.\n\n## Environment and raw results\n\n- Date: 2026-10-29 UTC.\n- Source revision: `f226485ead9f91081e2eb3c848b3290bf1df040a`.\n- CPU: AMD Ryzen 5 3600, 6 cores and 12 logical CPUs.\n- OS: `Linux-7.2.8-9-omarchy-x86_64-with-glibc2.44`.\n- Go: `go1.26.3 linux/amd64`.\n- Python: `3.13.13`.\n- FastAPI: `0.162.0`; Uvicorn: `0.54.0`.\n\nThe [JSON report](https://github.com/WaylonWalker/markata/blob/main/benchmarks/renderer-integration-2026-10-29.json)\ncontains every measured sample, fixture SHA-256 hashes, and the installed binary and wrapper hashes.\nThe [Go benchmark output](https://github.com/WaylonWalker/markata/blob/main/benchmarks/renderer-go-2026-10-29.txt)\ncontains iteration counts, allocation counts, and all three runs.\n\n## Reproduce\n\nUse a virtual environment with the current Markata wheel, FastAPI, and Uvicorn.\nRun these commands from the repository root, sequentially:\n\n```bash\npython python/benchmark_editor.py\ngo test ./pkg/plugins -run '^$' -bench '^BenchmarkRenderStandaloneFixtures$' -benchtime=200ms -count=3\n```\n\nThe Python script starts a temporary localhost server and stops it when the run ends.\nIt writes `benchmarks/renderer-integration-YYYY-MM-DD.json` using the UTC date.\nIt does not replace the live editor server.\n\nBefore comparing changes, keep the fixture bytes, dependency versions, machine, and renderer options the same.\nCompare medians and raw samples as well as response sizes.\nUseful next measurements include process initialization, JSON encoding, asset transfer, browser paint, and memory retained after repeated diagram edits.\n\n## Go server workbench\n\nThe [Go workbench](/docs/guides/go-workbench/) uses the same seven fixture files and the same HTTP timing boundaries.\nAll fixture hashes match the Python report above. The server renders directly in process and keeps one previous result in memory.\n\nEach mode uses two excluded warm-up calls and 15 measured calls.\nBefore every cache-miss call, a separate unmeasured request renders a small invalidator document.\nThis keeps the measured fixture bytes unchanged while preventing an accidental cache hit.\nEvery measured response checks its `cached` field. Cached edits use the same source repeatedly without invalidation.\nThe invalidator request is excluded from the HTTP time and response size.\n\n### HTTP results\n\nValues are milliseconds. Each median and p95 comes from 15 calls.\nThe Python column comes from the earlier report; the Go columns come from a separate run on the same workstation.\n\n| Fixture | Python HTTP edit median | Go initial miss median | Go edit miss median | Go edit miss p95 | Go cached edit median |\n| --- | ---: | ---: | ---: | ---: | ---: |\n| `post-001.md` | 136.245 | 2.247 | 2.143 | 3.599 | 0.365 |\n| `home.md` | 129.152 | 0.645 | 0.466 | 0.867 | 0.324 |\n| `markdown-chart-fallback.md` | 264.495 | 36.032 | 28.571 | 53.724 | 0.295 |\n| `md-card-headings.md` | 153.448 | 0.799 | 1.504 | 1.790 | 0.366 |\n| `roads.md` | 177.217 | 0.957 | 0.973 | 1.547 | 0.325 |\n| `story-layout.md` | 154.968 | 1.368 | 1.326 | 1.827 | 0.300 |\n| `test-headings.md` | 152.701 | 0.838 | 0.805 | 1.721 | 0.293 |\n\nFor the site benchmark post, an uncached Go edit takes 2.143 ms over loopback HTTP.\nA repeated cached edit takes 0.365 ms.\nThe earlier Python HTTP measurement for that exact file is 136.25 ms.\n\nThe Go server avoids a renderer subprocess per request. It also links feature assets instead of embedding their contents in each response.\nBoth differences contribute to the observed gap. These runs do not isolate language or process-startup costs.\nThe native Go renderer benchmark uses inline assets, so it can take longer than the Go HTTP path with linked assets.\n\n### Response sizes\n\nValues are uncompressed JSON body KiB. Separately requested stylesheets, libraries, and fonts are excluded.\nInitial responses contain a complete document and fragment fields. Edit responses omit the document.\n\n| Fixture | Python edit response | Go initial response | Go edit response | Go initial-to-edit reduction |\n| --- | ---: | ---: | ---: | ---: |\n| `post-001.md` | 20.01 | 24.62 | 8.82 | 64.2% |\n| `home.md` | 0.86 | 8.99 | 1.02 | 88.6% |\n| `markdown-chart-fallback.md` | 226.92 | 24.15 | 8.54 | 64.6% |\n| `md-card-headings.md` | 19.57 | 12.99 | 2.99 | 77.0% |\n| `roads.md` | 43.40 | 19.58 | 6.30 | 67.8% |\n| `story-layout.md` | 9.54 | 30.59 | 11.82 | 61.4% |\n| `test-headings.md` | 3.42 | 16.24 | 4.65 | 71.4% |\n\nThe Go editor retains loaded libraries and shared styles in the preview frame.\nThe linked-asset policy makes its chart response smaller, but the browser must fetch each dependency when it is first needed.\nResponse-size reductions do not include those initial asset transfers and do not establish a browser paint-time improvement.\n\n### Go measurements and reproduction\n\nThe Go run uses runtime source revision `059bb011f3314c43ca9e0c6e51d7ed735cf68790`.\nThe merged parent adds benchmark tooling and documentation without changing that runtime.\nThe host is the same AMD Ryzen 5 3600 workstation, with 12 logical CPUs and Go 1.26.3.\nThe Go HTTP client uses Python 3.14.8; the earlier Python-reference client uses 3.13.13.\nThe comparison includes that client-version difference. The JSON report records its timestamp, OS, binary hash, and harness hash.\n\nThe Go server timer includes rendering, asset registration, and optional document construction.\nIt excludes HTTP JSON encoding and network transfer. The Python server timer above excludes document construction.\nUse HTTP measurements to compare the complete request paths.\n\nThese are sequential measurements on a shared workstation, rather than a controlled before-and-after experiment.\nThey exclude server startup, appearance generation, cache invalidation calls, separately fetched assets, editor debounce, browser layout, and drawing.\nThe Go editor debounce is 250 ms. The p95 equals the maximum with 15 samples; larger runs are needed for stable tail estimates.\nNo site configuration, site build cache, encryption keys, or site lifecycle stages participate.\n\nThe [Go HTTP report](https://github.com/WaylonWalker/markata/blob/feat/go-render-workbench/benchmarks/go-workbench-2026-10-29.json)\ncontains every sample and fixture/binary/harness hashes.\nThe [native Go output](https://github.com/WaylonWalker/markata/blob/feat/go-render-workbench/benchmarks/go-workbench-native-2026-10-29.txt)\ncontains three fresh runs of the parent's renderer benchmark on the same fixtures.\n\nRun these commands sequentially from the repository root:\n\n```bash\ngo build -o /tmp/markata-workbench-benchmark ./cmd/markata-workbench\npython python/benchmark_go_editor.py --binary /tmp/markata-workbench-benchmark\ngo test ./pkg/plugins -run '^$' -bench '^BenchmarkRenderStandaloneFixtures$' -benchtime=200ms -count=3\n```\n\nThe standard-library Python client starts a temporary Go server on an OS-assigned loopback port and stops it after the run.\nIt does not restart the live editor or change its cache.\nUse `--samples`, `--warmups`, and `--output` to control the run. The default output uses the UTC date.\n\n## Browser WASM worker\n\nStart the WASM demo before the benchmark:\n\n```bash\npython3 scripts/wasm-workbench.py --serve\n```\n\nIn another terminal, run:\n\n```bash\nuv run --with playwright python scripts/benchmark-wasm.py --output /tmp/wasm-benchmark.json\n```\n\nUse `--url` for a different demo address. Install Playwright Chromium if the browser is unavailable.\nThe benchmark uses the same seven fixtures as the HTTP clients.\nEach fixture uses a fresh worker, two excluded warmups, and fifteen measured renders.\nThe report includes raw samples, fixture hashes, browser version, median, and p95.\n\nThese timings measure worker rendering. They exclude worker startup, message transfer, layout, and paint.\nDo not compare them directly with HTTP request timings.\n\nLocal demos use these addresses when all three run together:\n\n- Python/FastAPI: `http://127.0.0.1:8765/`\n- Go server: `http://127.0.0.1:8767/`\n- Browser WASM: `http://127.0.0.1:8766/`\n\n### Integration verification on 2026-10-29\n\nFresh reports use the `*-suite-2026-10-29.json` names for Python and Go.\nThe WASM report is `benchmarks/wasm-workbench-2026-10-29.json`.\nFor `post-001.md`, the Python HTTP edit median was 149.282 ms.\nThe Go HTTP edit median was 2.389 ms; the cached median was 0.301 ms.\nThe WASM worker median was 10.9 ms.\nThese measurements use different timing boundaries and asset policies, as described above.\n\n## Shared editor features and runtime differences\n\nAll three demos provide the same editor features:\n\n- System typography, appearance controls, and Default/Vim/Emacs/Sublime keymaps.\n- **Open .md** import and **Download .md** export.\n- Automatic draft recovery and visible save status.\n- Live previews with a 250 ms edit debounce and protection against stale results.\n- A 200,000 UTF-8 byte limit, with errors that preserve the current draft.\n\nAn oversized import leaves the current draft intact. Download the draft before clearing browser storage.\nIf storage is unavailable or full, editing and downloads remain available, but drafts cannot survive closing the page.\nEach origin stores its own draft and appearance settings. Different ports do not share these settings.\nFor a font comparison, select the same font pack and text size in each demo.\nThe default uses system fonts; operating systems can display different system typefaces.\n\n| Runtime behavior | Python / FastAPI | Go server | Browser WASM |\n| --- | --- | --- | --- |\n| Rendering location | Server subprocess per request | Directly in Go server | Persistent browser worker |\n| Markdown transfer | HTTP to local server | HTTP to local server | No render request |\n| Rich feature assets | Inline response assets | Linked assets reused by browser | Bundled assets cached locally |\n| Offline reload | Requires running server | Requires running server | Available after **Ready offline** |\n| Authored raw HTML | Enabled inside sandbox | Enabled inside sandbox | Disabled |\n| Repeated source | New renderer process | Last result cache | Persistent renderer runtime |\n\nRuntime differences do not require different fonts, import controls, or draft feedback.\nRaw HTML and cache policies are demo choices, rather than requirements of Python, Go, or WASM.\nAll previews use a sandbox. Authored external images and links can still access the network.\nThese demos render standalone Markdown; they do not load a site's configuration or run its complete build lifecycle.\n",
      "summary": "Measured rendering, process, HTTP, and response costs for existing Markata fixtures",
      "date_published": "2026-10-29T00:00:00Z",
      "date_modified": "2026-10-29T00:00:00Z",
      "tags": [
        "documentation",
        "benchmarks",
        "fastapi"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/editor-command-palette/",
      "url": "https://markata.dev/docs/guides/editor-command-palette/",
      "title": "Editor Command Palette",
      "content_html": "\u003cp\u003eSelect \u003cstrong\u003eCommands\u003c/strong\u003e above the Markdown editor, or press \u003cstrong\u003eCtrl+Shift+P\u003c/strong\u003e.\nOn macOS, press \u003cstrong\u003eCmd+Shift+P\u003c/strong\u003e. \u003cstrong\u003eCtrl/Cmd+K\u003c/strong\u003e also works.\nThe dialog is titled \u003cstrong\u003eCommand Palette\u003c/strong\u003e and works with the Default, Vim,\nEmacs, and Sublime keymaps. In the Go workbench, \u003cstrong\u003eCtrl/Cmd+P\u003c/strong\u003e opens the\nfuzzy file finder.\u003c/p\u003e\n\u003cp\u003eSearch for a command, such as \u003ccode\u003ecallout\u003c/code\u003e, \u003ccode\u003ediagram\u003c/code\u003e, or \u003ccode\u003ehighlight\u003c/code\u003e.\nUse the arrow keys to choose a result, then press \u003cstrong\u003eEnter\u003c/strong\u003e.\nYou can also select a result with a mouse or touch.\nEach result shows the syntax that it inserts.\u003c/p\u003e\n\u003cp\u003eFor example, the \u003cstrong\u003eNote box\u003c/strong\u003e command inserts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! note \u0026#34;Note\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Write your note here.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe editor selects the placeholder so you can replace it immediately.\u003c/p\u003e\n\u003cp\u003eIn the Python and Go browser editors, the connected language service also completes\ncontainer classes and modifiers from these commands. For example, type \u003ccode\u003e::::: md-i\u003c/code\u003e\nto suggest \u003ccode\u003emd-icon\u003c/code\u003e. Inside its attribute block, type \u003ccode\u003e{data-s\u003c/code\u003e to suggest\n\u003ccode\u003edata-size\u003c/code\u003e, then type \u003ccode\u003edata-size=\u0026quot;\u003c/code\u003e to choose \u003ccode\u003esm\u003c/code\u003e or \u003ccode\u003elg\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eInside a Mermaid fence, the language service suggests diagram types such as\n\u003ccode\u003eflowchart\u003c/code\u003e, \u003ccode\u003esequenceDiagram\u003c/code\u003e, and \u003ccode\u003eclassDiagram\u003c/code\u003e; flowchart directions; a\nflowchart starter; and Mermaid class style properties. Press \u003cstrong\u003eCtrl+Space\u003c/strong\u003e to\nshow completions at the cursor. The WASM editor keeps the full command palette\nand does not currently connect to the LSP.\nIf you select text before opening Commands, the command uses that text instead.\nFor example, \u003cstrong\u003eHighlighted text\u003c/strong\u003e changes selected \u003ccode\u003eimportant\u003c/code\u003e to \u003ccode\u003e==important==\u003c/code\u003e.\nNamed Lucide icon commands replace selected text with the chosen icon.\nBlock commands add blank lines around their output to keep surrounding paragraphs separate.\nMultiline selections receive the indentation required by admonitions.\nCommands use the primary selection when the editor has multiple selections.\u003c/p\u003e\n\u003cp\u003eUse the editor\u0026rsquo;s normal undo command to remove an insertion in one step.\nThe existing draft saving and preview update run after insertion.\nPress \u003cstrong\u003eEscape\u003c/strong\u003e, select \u003cstrong\u003eClose\u003c/strong\u003e, or click outside the dialog to cancel.\nThe editor keeps your text and selection and receives focus again.\u003c/p\u003e\n\u003cp\u003eThe catalog includes 110 authoring snippets and all 2,118 icons in the bundled Lucide pack.\nSearch matches command names, syntax hints, and aliases.\nThe palette shows up to 60 results at once. Refine the search to find more specific commands.\nFor example, search \u003ccode\u003eLucide: zodiac-aries\u003c/code\u003e to find that icon directly.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFamily\u003c/th\u003e\n\u003cth\u003eCommands\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eAdmonitions\u003c/td\u003e\n\u003ctd\u003eAll documented types, closed and expanded disclosures, and split columns\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRoads\u003c/td\u003e\n\u003ctd\u003eWinding, timeline, steps, snake, cycle, constellation, git, and editorial; story and reveal variants\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCards and layouts\u003c/td\u003e\n\u003ctd\u003eCard, box, layout, columns, grid, rail, pending cards, stack, divider, connector, and story section\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eIcons and feature rows\u003c/td\u003e\n\u003ctd\u003eIcon tile, icon feature row, generic Lucide shortcode, every bundled Lucide icon, and custom icon-pack shortcode\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMetrics\u003c/td\u003e\n\u003ctd\u003eStatus, statistic, delta, native meter, and progress gauge\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eInteractive content\u003c/td\u003e\n\u003ctd\u003eChecklist and Markdown source disclosure\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMermaid\u003c/td\u003e\n\u003ctd\u003eFlow, sequence, class, state, entity relationship, Gantt, pie, mind map, timeline, and git diagrams\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eChart.js\u003c/td\u003e\n\u003ctd\u003eBar, line, area, stacked bar, pie, doughnut, scatter, bubble, radar, and polar area\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWeb Awesome\u003c/td\u003e\n\u003ctd\u003eComparison, details, tabs, copy button, QR code, badge, tag, tooltip, carousel, animated image, and raw component template\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eInline extensions\u003c/td\u003e\n\u003ctd\u003eHighlight, keyboard keys, emoji, superscript, subscript, attributes, footnote, and definition list\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eImages and citations\u003c/td\u003e\n\u003ctd\u003eCaptioned figure, image URL, and attributed quotation\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSite features\u003c/td\u003e\n\u003ctd\u003eWikilink, post embed, external embed card, YouTube embed, hover cards, table of contents, glossary frontmatter, and contribution calendar\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eStandard Markdown\u003c/td\u003e\n\u003ctd\u003eTable, task list, code fence, inline code, bold, italic, strikethrough, and link\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"preview-and-site-requirements\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePreview and site requirements\u003c/span\u003e \u003ca href=\"#preview-and-site-requirements\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe palette uses local assets in all three workbenches.\nIt remains available offline after the WASM workbench caches its assets.\nBundled Lucide icons, roads, article containers, metrics, Mermaid, and Chart.js render in the standalone preview.\u003c/p\u003e\n\u003cp\u003eCommands for site features state their requirements in the result description.\nThe standalone renderers do not load a site content index or the Web Awesome plugin and custom-element runtime.\nWeb Awesome commands insert the documented Markdown shortcuts for a configured site build.\nThey do not load third-party scripts in the standalone preview.\nThe raw component template supports components that have no Markdown shorthand.\nReplace its tag with the required Web Awesome tag.\u003c/p\u003e\n\u003cp\u003eWikilinks and post embeds need site content. External embeds need the site embed pipeline.\nHover cards and contribution calendars need their site plugins or runtime assets.\nCustom icon packs need site configuration and local SVGs.\nThe TOC command inserts \u003ccode\u003e[[toc]]\u003c/code\u003e for the site table-of-contents plugin.\nUse glossary frontmatter at the start of a new glossary post.\nReplace sample image paths and IDs before publishing.\u003c/p\u003e\n\u003ch2 id=\"try-a-complete-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTry a complete example\u003c/span\u003e \u003ca href=\"#try-a-complete-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOpen the workbench with \u003ccode\u003e?example\u003c/code\u003e to load the sample in the editor and open the command palette.\nFor example, visit \u003ccode\u003ehttp://localhost:8766/?example\u003c/code\u003e for the Go workbench.\nIn the Go workbench, use the \u003cstrong\u003eOpen Markdown file\u003c/strong\u003e command to import\n\u003ccode\u003eexamples/command-palette-showcase.md\u003c/code\u003e as a scratch draft.\nThe example combines icon cards, a steps road, a feature row, metrics, Mermaid, and a Chart.js chart.\nIt also shows Web Awesome source with its site requirement clearly identified.\nThe chart data is illustrative.\u003c/p\u003e\n\u003cp\u003eSee the \u003ca href=\"markdown.md\"\u003eMarkdown guide\u003c/a\u003e, \u003ca href=\"markdown-containers.md\"\u003econtainer guide\u003c/a\u003e,\n\u003ca href=\"roads.md\"\u003eroads guide\u003c/a\u003e, \u003ca href=\"icons.md\"\u003eicon guide\u003c/a\u003e, and \u003ca href=\"webawesome.md\"\u003eWeb Awesome guide\u003c/a\u003e\nfor syntax details. The \u003ca href=\"renderer-integration-benchmarks.md#shared-editor-features-and-runtime-differences\"\u003eeditor comparison\u003c/a\u003e\nexplains runtime differences.\u003c/p\u003e\n",
      "content_text": "\nSelect **Commands** above the Markdown editor, or press **Ctrl+Shift+P**.\nOn macOS, press **Cmd+Shift+P**. **Ctrl/Cmd+K** also works.\nThe dialog is titled **Command Palette** and works with the Default, Vim,\nEmacs, and Sublime keymaps. In the Go workbench, **Ctrl/Cmd+P** opens the\nfuzzy file finder.\n\nSearch for a command, such as `callout`, `diagram`, or `highlight`.\nUse the arrow keys to choose a result, then press **Enter**.\nYou can also select a result with a mouse or touch.\nEach result shows the syntax that it inserts.\n\nFor example, the **Note box** command inserts:\n\n```markdown\n!!! note \"Note\"\n    Write your note here.\n```\n\nThe editor selects the placeholder so you can replace it immediately.\n\nIn the Python and Go browser editors, the connected language service also completes\ncontainer classes and modifiers from these commands. For example, type `::::: md-i`\nto suggest `md-icon`. Inside its attribute block, type `{data-s` to suggest\n`data-size`, then type `data-size=\"` to choose `sm` or `lg`.\n\nInside a Mermaid fence, the language service suggests diagram types such as\n`flowchart`, `sequenceDiagram`, and `classDiagram`; flowchart directions; a\nflowchart starter; and Mermaid class style properties. Press **Ctrl+Space** to\nshow completions at the cursor. The WASM editor keeps the full command palette\nand does not currently connect to the LSP.\nIf you select text before opening Commands, the command uses that text instead.\nFor example, **Highlighted text** changes selected `important` to `==important==`.\nNamed Lucide icon commands replace selected text with the chosen icon.\nBlock commands add blank lines around their output to keep surrounding paragraphs separate.\nMultiline selections receive the indentation required by admonitions.\nCommands use the primary selection when the editor has multiple selections.\n\nUse the editor's normal undo command to remove an insertion in one step.\nThe existing draft saving and preview update run after insertion.\nPress **Escape**, select **Close**, or click outside the dialog to cancel.\nThe editor keeps your text and selection and receives focus again.\n\nThe catalog includes 110 authoring snippets and all 2,118 icons in the bundled Lucide pack.\nSearch matches command names, syntax hints, and aliases.\nThe palette shows up to 60 results at once. Refine the search to find more specific commands.\nFor example, search `Lucide: zodiac-aries` to find that icon directly.\n\n| Family | Commands |\n| --- | --- |\n| Admonitions | All documented types, closed and expanded disclosures, and split columns |\n| Roads | Winding, timeline, steps, snake, cycle, constellation, git, and editorial; story and reveal variants |\n| Cards and layouts | Card, box, layout, columns, grid, rail, pending cards, stack, divider, connector, and story section |\n| Icons and feature rows | Icon tile, icon feature row, generic Lucide shortcode, every bundled Lucide icon, and custom icon-pack shortcode |\n| Metrics | Status, statistic, delta, native meter, and progress gauge |\n| Interactive content | Checklist and Markdown source disclosure |\n| Mermaid | Flow, sequence, class, state, entity relationship, Gantt, pie, mind map, timeline, and git diagrams |\n| Chart.js | Bar, line, area, stacked bar, pie, doughnut, scatter, bubble, radar, and polar area |\n| Web Awesome | Comparison, details, tabs, copy button, QR code, badge, tag, tooltip, carousel, animated image, and raw component template |\n| Inline extensions | Highlight, keyboard keys, emoji, superscript, subscript, attributes, footnote, and definition list |\n| Images and citations | Captioned figure, image URL, and attributed quotation |\n| Site features | Wikilink, post embed, external embed card, YouTube embed, hover cards, table of contents, glossary frontmatter, and contribution calendar |\n| Standard Markdown | Table, task list, code fence, inline code, bold, italic, strikethrough, and link |\n\n## Preview and site requirements\n\nThe palette uses local assets in all three workbenches.\nIt remains available offline after the WASM workbench caches its assets.\nBundled Lucide icons, roads, article containers, metrics, Mermaid, and Chart.js render in the standalone preview.\n\nCommands for site features state their requirements in the result description.\nThe standalone renderers do not load a site content index or the Web Awesome plugin and custom-element runtime.\nWeb Awesome commands insert the documented Markdown shortcuts for a configured site build.\nThey do not load third-party scripts in the standalone preview.\nThe raw component template supports components that have no Markdown shorthand.\nReplace its tag with the required Web Awesome tag.\n\nWikilinks and post embeds need site content. External embeds need the site embed pipeline.\nHover cards and contribution calendars need their site plugins or runtime assets.\nCustom icon packs need site configuration and local SVGs.\nThe TOC command inserts `[[toc]]` for the site table-of-contents plugin.\nUse glossary frontmatter at the start of a new glossary post.\nReplace sample image paths and IDs before publishing.\n\n## Try a complete example\n\nOpen the workbench with `?example` to load the sample in the editor and open the command palette.\nFor example, visit `http://localhost:8766/?example` for the Go workbench.\nIn the Go workbench, use the **Open Markdown file** command to import\n`examples/command-palette-showcase.md` as a scratch draft.\nThe example combines icon cards, a steps road, a feature row, metrics, Mermaid, and a Chart.js chart.\nIt also shows Web Awesome source with its site requirement clearly identified.\nThe chart data is illustrative.\n\nSee the [Markdown guide](markdown.md), [container guide](markdown-containers.md),\n[roads guide](roads.md), [icon guide](icons.md), and [Web Awesome guide](webawesome.md)\nfor syntax details. The [editor comparison](renderer-integration-benchmarks.md#shared-editor-features-and-runtime-differences)\nexplains runtime differences.\n",
      "summary": "Insert special Markdown syntax in the Python, Go, and WASM workbenches.",
      "date_published": "2026-10-29T00:00:00Z",
      "date_modified": "2026-10-29T00:00:00Z",
      "tags": [
        "documentation",
        "markdown",
        "editor"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/wasm-workbench/",
      "url": "https://markata.dev/docs/guides/wasm-workbench/",
      "title": "Browser WASM renderer and local workbench",
      "content_html": "\u003cp\u003eBuild and serve the workbench from the repository root:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython3 scripts/wasm-workbench.py --serve\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOpen \u003ca href=\"http://127.0.0.1:8766/\"\u003ehttp://127.0.0.1:8766/\u003c/a\u003e. Go and Python 3 are build requirements.\nThe browser downloads the Go runtime once. No Python package, Node build,\nCDN, or rendering API is required. Port 8765 remains available for the\n\u003ca href=\"fastapi-editor\"\u003eFastAPI editor\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eWrite Markdown on the left and read its preview on the right. The editor\nsupports Vim, Emacs, Sublime, and default keymaps. Use the appearance picker\nto change the palette, aesthetic, fonts, and text size.\u003c/p\u003e\n\u003cp\u003eUse \u003cstrong\u003eOpen .md\u003c/strong\u003e to import a document. Use \u003cstrong\u003eDownload .md\u003c/strong\u003e to export it.\nThe document limit is 200,000 UTF-8 bytes. The footer reports render time\nand draft storage status. A storage error does not stop editing or export.\u003c/p\u003e\n\u003ch2 id=\"drafts-and-offline-use\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDrafts and offline use\u003c/span\u003e \u003ca href=\"#drafts-and-offline-use\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDrafts and keymap preferences stay in browser storage. Drafts use a separate\nkey from the FastAPI editor. On first use, the workbench can copy that editor\u0026rsquo;s\ndraft when both apps share an origin. Different ports have separate storage.\u003c/p\u003e\n\u003cp\u003eWait for \u003cstrong\u003eReady offline\u003c/strong\u003e before disconnecting. The service worker saves the\napp, WASM renderer, editor, theme assets, and fonts. You can then reload the\npage and continue editing without a network connection.\u003c/p\u003e\n\u003cp\u003eBrowser storage can be cleared or evicted. Private browsing can restrict it.\nExport files to keep durable copies. The demo edits one document at a time;\nit does not sync drafts between devices or resolve edits from multiple tabs.\u003c/p\u003e\n\u003cp\u003eMarkdown stays on the device. External images and links in authored content\ncan still contact their destinations. Raw HTML is disabled. The preview runs\nin a sandbox with a separate origin and cannot read the editor\u0026rsquo;s storage.\u003c/p\u003e\n\u003ch2 id=\"use-the-worker-in-another-app\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUse the worker in another app\u003c/span\u003e \u003ca href=\"#use-the-worker-in-another-app\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBuild the static files, then copy the generated directory to your host:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython3 scripts/wasm-workbench.py --output /tmp/markata-browser\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe generated \u003ccode\u003eworker.js\u003c/code\u003e, \u003ccode\u003ewasm_exec.js\u003c/code\u003e, and \u003ccode\u003emarkata.wasm\u003c/code\u003e form the rendering\nentrypoint. Keep these files together. The build copies \u003ccode\u003ewasm_exec.js\u003c/code\u003e from\nthe Go installation that builds the module.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003eworker\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eWorker\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;./worker.js\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eworker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eonmessage\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;ready\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eworker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epostMessage\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"nx\"\u003esource\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;# Hello from Markata\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003erevision\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;result\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eresult\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eresult\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eresult\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eresult\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eassets\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erender_ms\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;fatal\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe result follows the standalone renderer\u0026rsquo;s schema version 1. It includes\nHTML, feature flags, ordered assets, and head/body tags. Bundled assets contain\nIDs rather than their file contents. Serve those files from \u003ccode\u003eappearance/\u003c/code\u003e.\nGenerated initializer scripts retain their contents. The sample parent app loads each dependency once. It sends cached asset contents\nto the sandboxed \u003ccode\u003epreview.js\u003c/code\u003e, which disposes old Chart.js instances.\u003c/p\u003e\n\u003cp\u003eInside the initialized runtime, \u003ccode\u003emarkataRender(source)\u003c/code\u003e returns a JSON string.\nInvalid argument types, oversized documents, and render errors return an\n\u003ccode\u003eerror\u003c/code\u003e field. The worker preserves the request\u0026rsquo;s \u003ccode\u003erevision\u003c/code\u003e. Hosts must discard\nstale results. Keep one render in flight and replace pending edits with the\nlatest source. The sample editor uses a 250 ms debounce.\u003c/p\u003e\n\u003cp\u003eThe renderer uses the same Go Markdown implementation as the Python API.\nIt supports syntax highlighting, admonitions, containers, bundled Lucide icons,\nMermaid, and Chart.js. Site discovery, frontmatter processing, feeds, and\nsite-dependent plugins require a full Markata build. Mermaid runs in client mode.\u003c/p\u003e\n\u003ch2 id=\"static-hosting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStatic hosting\u003c/span\u003e \u003ca href=\"#static-hosting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eServe the output over HTTPS or loopback HTTP. Service workers do not work\nfrom \u003ccode\u003efile://\u003c/code\u003e URLs. Subdirectory hosting is supported; keep relative paths intact.\u003c/p\u003e\n\u003cp\u003eServe \u003ccode\u003e.wasm\u003c/code\u003e as \u003ccode\u003eapplication/wasm\u003c/code\u003e. The loader also supports hosts with an\nincorrect MIME type. Enable gzip or Brotli compression. The generated \u003ccode\u003e.gz\u003c/code\u003e\nfiles require \u003ccode\u003eContent-Encoding: gzip\u003c/code\u003e and the original file\u0026rsquo;s content type.\nThe Python server handles these headers automatically.\u003c/p\u003e\n\u003cp\u003eThe parent app reads assets from its service-worker cache. It embeds preview\nfonts and styles so the isolated preview can render offline. The included server\nalso sets CORS headers for hosts that reuse these assets. Keep \u003ccode\u003esw.js\u003c/code\u003e available\nfor revalidation. Each build gives its offline cache a content-derived version.\nA new version activates after its complete asset bundle is cached. Reload the\ntab to use a newly installed version.\u003c/p\u003e\n\u003cp\u003eThe initial module is larger than a JavaScript-only Markdown parser because\nit includes Go, Chroma syntax highlighting, and Markata\u0026rsquo;s extensions. On the\nlocal benchmark build, gzip reduced the module to about 6.5 MiB. Subsequent\nrenders reuse the runtime and parser. The worker keeps editing responsive.\u003c/p\u003e\n\u003cp\u003eTo serve an existing build:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython3 scripts/wasm-workbench.py --output /tmp/markata-browser --no-build --serve --port \u003cspan class=\"m\"\u003e8766\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eStop the server with Ctrl+C. To remove an offline copy, unregister its service\nworker and clear its site data in browser settings. Export the draft first.\u003c/p\u003e\n\u003ch2 id=\"browser-checks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBrowser checks\u003c/span\u003e \u003ca href=\"#browser-checks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython3 scripts/wasm-workbench.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv run --with playwright python -m playwright install chromium\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv run --with playwright python tests/wasm/test_workbench.py\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe checks cover offline reload, import/export, draft recovery, rapid edits,\nrepeated diagrams and charts, keymaps, mobile width, storage failures, input\nlimits, worker errors, and local-only network requests. Warm-render measurements\nare reported without machine-specific timing assertions.\u003c/p\u003e\n\u003ch2 id=\"shared-editor-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eShared editor behavior\u003c/span\u003e \u003ca href=\"#shared-editor-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse \u003cstrong\u003eOpen .md\u003c/strong\u003e to import a Markdown file. An oversized file leaves the current draft intact.\nUse \u003cstrong\u003eDownload .md\u003c/strong\u003e to keep a copy outside browser storage.\nThe footer reports whether the draft was saved. Storage failures leave editing and downloads available.\nSee \u003ca href=\"/docs/guides/renderer-integration-benchmarks/#shared-editor-features-and-runtime-differences\"\u003eshared editor features and runtime differences\u003c/a\u003e for the comparison.\u003c/p\u003e\n\u003ch2 id=\"insert-markdown-commands\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInsert Markdown commands\u003c/span\u003e \u003ca href=\"#insert-markdown-commands\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSelect \u003cstrong\u003eCommands\u003c/strong\u003e or press \u003cstrong\u003eCtrl+Shift+P\u003c/strong\u003e (\u003cstrong\u003eCmd+Shift+P\u003c/strong\u003e on macOS).\nSearch for special syntax, then press \u003cstrong\u003eEnter\u003c/strong\u003e to insert it at your selection.\nSee the \u003ca href=\"editor-command-palette.md\"\u003ecommand palette guide\u003c/a\u003e for the catalog and keyboard controls.\u003c/p\u003e\n\u003cp\u003eOpen the workbench with \u003ccode\u003e?example\u003c/code\u003e to load a Markdown example and open the command palette.\u003c/p\u003e\n",
      "content_text": "\nBuild and serve the workbench from the repository root:\n\n```bash\npython3 scripts/wasm-workbench.py --serve\n```\n\nOpen \u003chttp://127.0.0.1:8766/\u003e. Go and Python 3 are build requirements.\nThe browser downloads the Go runtime once. No Python package, Node build,\nCDN, or rendering API is required. Port 8765 remains available for the\n[FastAPI editor](fastapi-editor).\n\nWrite Markdown on the left and read its preview on the right. The editor\nsupports Vim, Emacs, Sublime, and default keymaps. Use the appearance picker\nto change the palette, aesthetic, fonts, and text size.\n\nUse **Open .md** to import a document. Use **Download .md** to export it.\nThe document limit is 200,000 UTF-8 bytes. The footer reports render time\nand draft storage status. A storage error does not stop editing or export.\n\n## Drafts and offline use\n\nDrafts and keymap preferences stay in browser storage. Drafts use a separate\nkey from the FastAPI editor. On first use, the workbench can copy that editor's\ndraft when both apps share an origin. Different ports have separate storage.\n\nWait for **Ready offline** before disconnecting. The service worker saves the\napp, WASM renderer, editor, theme assets, and fonts. You can then reload the\npage and continue editing without a network connection.\n\nBrowser storage can be cleared or evicted. Private browsing can restrict it.\nExport files to keep durable copies. The demo edits one document at a time;\nit does not sync drafts between devices or resolve edits from multiple tabs.\n\nMarkdown stays on the device. External images and links in authored content\ncan still contact their destinations. Raw HTML is disabled. The preview runs\nin a sandbox with a separate origin and cannot read the editor's storage.\n\n## Use the worker in another app\n\nBuild the static files, then copy the generated directory to your host:\n\n```bash\npython3 scripts/wasm-workbench.py --output /tmp/markata-browser\n```\n\nThe generated `worker.js`, `wasm_exec.js`, and `markata.wasm` form the rendering\nentrypoint. Keep these files together. The build copies `wasm_exec.js` from\nthe Go installation that builds the module.\n\n```javascript\nconst worker = new Worker('./worker.js');\nworker.onmessage = ({data}) =\u003e {\n  if (data.type === 'ready') {\n    worker.postMessage({source: '# Hello from Markata', revision: 1});\n  } else if (data.type === 'result') {\n    if (data.result.error) console.error(data.result.error);\n    else console.log(data.result.html, data.result.assets, data.render_ms);\n  } else if (data.type === 'fatal') {\n    console.error(data.error);\n  }\n};\n```\n\nThe result follows the standalone renderer's schema version 1. It includes\nHTML, feature flags, ordered assets, and head/body tags. Bundled assets contain\nIDs rather than their file contents. Serve those files from `appearance/`.\nGenerated initializer scripts retain their contents. The sample parent app loads each dependency once. It sends cached asset contents\nto the sandboxed `preview.js`, which disposes old Chart.js instances.\n\nInside the initialized runtime, `markataRender(source)` returns a JSON string.\nInvalid argument types, oversized documents, and render errors return an\n`error` field. The worker preserves the request's `revision`. Hosts must discard\nstale results. Keep one render in flight and replace pending edits with the\nlatest source. The sample editor uses a 250 ms debounce.\n\nThe renderer uses the same Go Markdown implementation as the Python API.\nIt supports syntax highlighting, admonitions, containers, bundled Lucide icons,\nMermaid, and Chart.js. Site discovery, frontmatter processing, feeds, and\nsite-dependent plugins require a full Markata build. Mermaid runs in client mode.\n\n## Static hosting\n\nServe the output over HTTPS or loopback HTTP. Service workers do not work\nfrom `file://` URLs. Subdirectory hosting is supported; keep relative paths intact.\n\nServe `.wasm` as `application/wasm`. The loader also supports hosts with an\nincorrect MIME type. Enable gzip or Brotli compression. The generated `.gz`\nfiles require `Content-Encoding: gzip` and the original file's content type.\nThe Python server handles these headers automatically.\n\nThe parent app reads assets from its service-worker cache. It embeds preview\nfonts and styles so the isolated preview can render offline. The included server\nalso sets CORS headers for hosts that reuse these assets. Keep `sw.js` available\nfor revalidation. Each build gives its offline cache a content-derived version.\nA new version activates after its complete asset bundle is cached. Reload the\ntab to use a newly installed version.\n\nThe initial module is larger than a JavaScript-only Markdown parser because\nit includes Go, Chroma syntax highlighting, and Markata's extensions. On the\nlocal benchmark build, gzip reduced the module to about 6.5 MiB. Subsequent\nrenders reuse the runtime and parser. The worker keeps editing responsive.\n\nTo serve an existing build:\n\n```bash\npython3 scripts/wasm-workbench.py --output /tmp/markata-browser --no-build --serve --port 8766\n```\n\nStop the server with Ctrl+C. To remove an offline copy, unregister its service\nworker and clear its site data in browser settings. Export the draft first.\n\n## Browser checks\n\n```bash\npython3 scripts/wasm-workbench.py\nuv run --with playwright python -m playwright install chromium\nuv run --with playwright python tests/wasm/test_workbench.py\n```\n\nThe checks cover offline reload, import/export, draft recovery, rapid edits,\nrepeated diagrams and charts, keymaps, mobile width, storage failures, input\nlimits, worker errors, and local-only network requests. Warm-render measurements\nare reported without machine-specific timing assertions.\n\n## Shared editor behavior\n\nUse **Open .md** to import a Markdown file. An oversized file leaves the current draft intact.\nUse **Download .md** to keep a copy outside browser storage.\nThe footer reports whether the draft was saved. Storage failures leave editing and downloads available.\nSee [shared editor features and runtime differences](/docs/guides/renderer-integration-benchmarks/#shared-editor-features-and-runtime-differences) for the comparison.\n\n## Insert Markdown commands\n\nSelect **Commands** or press **Ctrl+Shift+P** (**Cmd+Shift+P** on macOS).\nSearch for special syntax, then press **Enter** to insert it at your selection.\nSee the [command palette guide](editor-command-palette.md) for the catalog and keyboard controls.\n\nOpen the workbench with `?example` to load a Markdown example and open the command palette.\n",
      "summary": "Render Markata Markdown in a browser worker, with saved drafts and offline editing.",
      "date_published": "2026-10-28T00:00:00Z",
      "date_modified": "2026-10-28T00:00:00Z",
      "tags": [
        "documentation",
        "wasm",
        "markdown"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/go-workbench/",
      "url": "https://markata.dev/docs/guides/go-workbench/",
      "title": "Live Markdown editor with Go",
      "content_html": "\u003cp\u003eRun the shipped Go editor command:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata editor --workspace ./docs\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOpen the local URL printed by the command. Edit Markdown on the left and view the preview on the right.\nPress Ctrl+C to stop the server. The default address is \u003ccode\u003e127.0.0.1:8766\u003c/code\u003e.\nFor a checkout build, run \u003ccode\u003ego run ./cmd/markata-go editor --workspace ./docs\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThe Go server calls Markata\u0026rsquo;s standalone renderer directly. It starts no Python process and needs no WASM runtime.\nIt uses the same Markdown renderer as the \u003ca href=\"./python-renderer/\"\u003ePython API\u003c/a\u003e and \u003ca href=\"./fastapi-editor/\"\u003eFastAPI editor\u003c/a\u003e.\nThe preview does not build a site. The language service indexes Markdown and reads workspace configuration for existing mention support.\u003c/p\u003e\n\u003cp\u003eUse the appearance picker to select a palette, color mode, style, font, or text size.\nOpen \u003cstrong\u003eEditor settings\u003c/strong\u003e to choose line wrapping, keymap, and layout. Drag the\ndivider between the source and preview panes to resize them. Choose \u003cstrong\u003eEditor\nonly\u003c/strong\u003e or \u003cstrong\u003ePreview only\u003c/strong\u003e to focus on one pane; \u003cstrong\u003eEditor and preview\u003c/strong\u003e restores\nthe split.\nScrolling either pane keeps the corresponding Markdown visible in the other.\nWhen you write or move the cursor, the preview follows the editor. Scroll sync\nis on by default; turn off \u003cstrong\u003eSync editor and preview scrolling\u003c/strong\u003e in \u003cstrong\u003eEditor\nsettings\u003c/strong\u003e to scroll each pane independently. The choice is saved in this browser.\nAt the end of a document, both panes keep extra scroll space so the last lines\ncan move above the bottom edge while you write.\nIn split view, a subtle marker shows the corresponding preview block, with a\nthin caret and \u003cstrong\u003eYou\u003c/strong\u003e flag at the active location. When rendered text matches\nthe source line, the preview caret follows the character cursor. For content\nthat a renderer transforms or replaces, it falls back to the nearest mapped\nsource position. Click rendered text to move the source caret to the matching\ntext when possible; links keep their normal navigation behavior. The source\npane keeps its normal caret on the actual text\ncursor. With the Vim keymap, the preview caret changes shape for normal,\ninsert, replace, and visual modes. Preview updates preserve\nunchanged blocks, and layout changes refresh the source-to-preview mapping,\nincluding after images and fonts load. While you edit, the preview follows the\ncaret after the matching content update completes, including when you keep\ntyping on the same line. Scroll changes caused by a render or a delayed\nimage/font layout are not mistaken for manual scrolling. The preview marker is\nsubtle and marks the rendered block for the current caret line. Nested Markdown\ncontainer boundaries add source anchors to improve scroll alignment in long\nsections; these markers exist only in the preview render and do not change your\nsource. Within nested content, the marker follows the narrowest container that\ncontains the caret line.\nChoose Default, Vim, Emacs, or Sublime keymaps in \u003cstrong\u003eEditor settings\u003c/strong\u003e.\nIn Vim mode, press \u003ccode\u003e/\u003c/code\u003e to search forward, \u003ccode\u003e?\u003c/code\u003e to search backward, then \u003ccode\u003en\u003c/code\u003e or\n\u003ccode\u003eN\u003c/code\u003e to move between matches.\nCode highlighting, icons, admonitions, tables, checklists, Mermaid, and Chart.js use local assets.\u003c/p\u003e\n\u003cp\u003ePress \u003cstrong\u003eCtrl+P\u003c/strong\u003e (\u003cstrong\u003eCmd+P\u003c/strong\u003e on macOS) to find a site file by its path, title,\nslug, or tag. The finder shows the current and recently opened files when its\nsearch is empty.\nSelect a result or press \u003cstrong\u003eEnter\u003c/strong\u003e to open it in the editor.\nChoose \u003cstrong\u003eFeeds\u003c/strong\u003e or \u003cstrong\u003eTags\u003c/strong\u003e in the workspace selector to browse posts by feed\nor tag. Feed names are shown as roots with folders relative to the workspace.\u003c/p\u003e\n\u003cp\u003eEdits to selected site files save back to the workspace after a short pause.\nUnsaved scratch documents stay in browser storage. The browser also keeps a\nrecovery copy of workspace edits. Use \u003cstrong\u003eCtrl+Shift+P\u003c/strong\u003e and search for \u003cstrong\u003eDownload\ncurrent file\u003c/strong\u003e to export a copy, or \u003cstrong\u003eOpen Markdown file\u003c/strong\u003e to import a file as\nan unsaved draft.\nA storage error appears beside the render metrics. Editing and downloads remain available.\nThe server writes only selected workspace files. Scratch drafts remain local to\nthe browser origin, so drafts on one port remain separate from drafts on another.\nWorkspace saves and new-post creation require a same-origin browser request.\nThe server rejects missing or foreign origins before it changes a site file.\u003c/p\u003e\n\u003cp\u003eThe preview updates after a 100 ms pause. One request runs at a time, and newer edits replace pending edits.\nOld responses cannot replace a newer draft. Errors preserve the last successful preview.\nThe footer shows Go render time, total edit-to-preview time, source size, and preview size.\nRepeated source uses a one-entry memory cache. Appearance changes update the preview without a render request.\nWorkspace post embeds in \u003ccode\u003e\u0026lt;!-- embed not found: post-slug --\u0026gt; ![[post-slug]]\u003c/code\u003e or \u003ccode\u003e![embed](path/to/post.md)\u003c/code\u003e format\nrender as cards linked to the matching site post. Fenced code examples remain\nliteral source.\u003c/p\u003e\n\u003ch2 id=\"language-assistance\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLanguage assistance\u003c/span\u003e \u003ca href=\"#language-assistance\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe editor connects to the existing Markata LSP through \u003ccode\u003e/lsp\u003c/code\u003e over WebSocket.\nThe server indexes the directory from \u003ccode\u003e--workspace\u003c/code\u003e. The default directory is the current directory.\nThe browser LSP accepts same-origin connections on \u003ccode\u003elocalhost\u003c/code\u003e or a loopback IP only.\u003c/p\u003e\n\u003cp\u003eType \u003ccode\u003e[[\u003c/code\u003e for wiki-link suggestions, including aliases. Type \u003ccode\u003e[label](\u003c/code\u003e for Markdown document paths.\nAutomatic suggestions wait for a short typing pause. Press \u003cstrong\u003eCtrl+Space\u003c/strong\u003e to request suggestions immediately at the cursor. Use the arrow keys and Enter to select a suggestion.\nExisting frontmatter, admonition, and mention completion also use the LSP.\nBroken wiki links receive an underline. The underline tooltip shows the diagnostic message.\nThe workbench preview resolves valid \u003ccode\u003e[[wikilinks]]\u003c/code\u003e against the site\u0026rsquo;s workspace index.\nClick a resolved wikilink in the preview to open that post in the editor.\nSelect the error and warning counts in the bottom status bar to inspect diagnostics and\njump to their source locations.\u003c/p\u003e\n\u003cp\u003eThe editor sends unsaved text as a synthetic \u003ccode\u003e.markata/browser-draft.md\u003c/code\u003e document.\nThis document stays in memory. Markdown path suggestions start at the workspace root because the draft has no source file.\nThe Files tree opens source files from the selected workspace using Markata glob rules. The Feeds view groups files by configured feed filters, and the Tags view groups them by loaded frontmatter. The selector shows file, feed, and tag counts. See \u003ca href=\"./renderer-site-tree/\"\u003eworkspace navigation\u003c/a\u003e.\nEach WebSocket connection owns its own draft and index. Reload the page to index external file changes.\u003c/p\u003e\n\u003ch2 id=\"edit-page-properties\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEdit page properties\u003c/span\u003e \u003ca href=\"#edit-page-properties\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSelect a site file, then choose \u003cstrong\u003eProperties\u003c/strong\u003e to edit its frontmatter in the\nfull-height page-details view. The live preview stays visible beside it. Choose\n\u003cstrong\u003eBack to Markdown\u003c/strong\u003e to return to the source, or \u003cstrong\u003eEdit YAML\u003c/strong\u003e to work directly\nwith the frontmatter block. Press \u003cstrong\u003eEscape\u003c/strong\u003e to return to the article. The\ncommand palette also has actions to open page details, add a property, and\nreturn to Markdown.\u003c/p\u003e\n\u003cp\u003eThe page summary shows the title, URL slug or source path, and publication\nstate. Common fields appear first. Choose \u003cstrong\u003eAdd property\u003c/strong\u003e, search for a known\nfield, and select it.\nOpen \u003cstrong\u003eCustom property\u003c/strong\u003e to add a site-specific YAML field. Edit tags as chips:\nremove one tag at a time or enter a tag and choose \u003cstrong\u003eAdd\u003c/strong\u003e. Advanced fields\nremain available under \u003cstrong\u003eShow advanced properties\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eProperty edits update the Markdown source and use the normal workspace save\nand preview behavior. Press \u003cstrong\u003eCtrl+Z\u003c/strong\u003e or \u003cstrong\u003eCmd+Z\u003c/strong\u003e to undo an edit. Use\n\u003cstrong\u003eRemove\u003c/strong\u003e to delete a property from the page.\u003c/p\u003e\n\u003cp\u003eThe footer reports the language connection state. Editing and preview continue if the connection fails.\nReload the page to reconnect. The browser adapter is shared with the \u003ca href=\"./fastapi-editor/\"\u003eFastAPI example\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eFor an embedded application, use \u003ccode\u003eworkbench.NewWithWorkspace(ctx, root)\u003c/code\u003e.\nCancel \u003ccode\u003ectx\u003c/code\u003e during shutdown to close active language connections.\n\u003ccode\u003eworkbench.New()\u003c/code\u003e uses the current directory and the lifetime of the application.\u003c/p\u003e\n\u003ch3 id=\"websocket-protocol\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWebSocket protocol\u003c/span\u003e \u003ca href=\"#websocket-protocol\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eGET /lsp/config\u003c/code\u003e returns \u003ccode\u003erootUri\u003c/code\u003e and \u003ccode\u003edocumentUri\u003c/code\u003e for the selected workspace.\nConnect to \u003ccode\u003e/lsp\u003c/code\u003e with the page origin. Each WebSocket text message contains one JSON-RPC object.\nWebSocket messages omit the stdio \u003ccode\u003eContent-Length\u003c/code\u003e headers.\nSend \u003ccode\u003einitialize\u003c/code\u003e, \u003ccode\u003einitialized\u003c/code\u003e, and \u003ccode\u003etextDocument/didOpen\u003c/code\u003e before language requests.\nThe session accepts the synthetic draft URI from the configuration response.\nThe server ignores browser workspace-change notifications and overrides the client workspace during initialization.\u003c/p\u003e\n\u003cp\u003eBrowser completion responses contain at most 200 suggestions. More specific text requests a new list.\nMessages have a 2 MiB limit. A disconnect releases the session.\nThe endpoint rejects missing or foreign origins. It provides no authentication or shared workspace management.\nKeep this example on a trusted local address.\u003c/p\u003e\n\u003ch2 id=\"embed-the-handler\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEmbed the handler\u003c/span\u003e \u003ca href=\"#embed-the-handler\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMount the handler at the root of a dedicated origin:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003epackage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;log\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;net/http\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;github.com/WaylonWalker/markata/pkg/workbench\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ehandler\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eworkbench\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNew\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFatal\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eserver\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003ehttp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eServer\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003eAddr\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;127.0.0.1:8767\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eHandler\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ehandler\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003eReadHeaderTimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSecond\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFatal\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eserver\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eListenAndServe\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCreate one handler at startup. It prepares the shared appearance bundle once.\nThe handler owns no listeners, signal handlers, or application configuration.\nA future builder can embed it without the demo command.\u003c/p\u003e\n\u003ch2 id=\"render-api\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRender API\u003c/span\u003e \u003ca href=\"#render-api\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl http://127.0.0.1:8767/render \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -H \u003cspan class=\"s1\"\u003e\u0026#39;Content-Type: application/json\u0026#39;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -d \u003cspan class=\"s1\"\u003e\u0026#39;{\u0026#34;markdown\u0026#34;:\u0026#34;# Hello Go\u0026#34;,\u0026#34;appearance\u0026#34;:{\u0026#34;data-theme\u0026#34;:\u0026#34;light\u0026#34;}}\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe first editor request receives a complete preview document. Later requests use \u003ccode\u003e\u0026quot;include_document\u0026quot;: false\u003c/code\u003e and receive fragments.\nThe iframe keeps its document, shared styles, and loaded libraries between edits.\nNew features add their styles once; removed features remove their conditional styles.\nChart instances are destroyed before replacement, and feature scripts initialize the new content.\u003c/p\u003e\n\u003cp\u003eThe JSON response contains \u003ccode\u003edocument\u003c/code\u003e, \u003ccode\u003ehtml\u003c/code\u003e, \u003ccode\u003efeature_head_html\u003c/code\u003e, \u003ccode\u003ebody_end_html\u003c/code\u003e, and \u003ccode\u003ecached\u003c/code\u003e.\nMetrics include \u003ccode\u003erender_ms\u003c/code\u003e, \u003ccode\u003einput_bytes\u003c/code\u003e, \u003ccode\u003ehtml_bytes\u003c/code\u003e, and \u003ccode\u003edocument_bytes\u003c/code\u003e.\nWith \u003ccode\u003einclude_document\u003c/code\u003e set to false, \u003ccode\u003edocument\u003c/code\u003e is null and \u003ccode\u003edocument_bytes\u003c/code\u003e is zero.\nOmit this option to retain the original full-document response.\nThe \u003ccode\u003eServer-Timing\u003c/code\u003e response header also reports render time.\n\u003ccode\u003edocument\u003c/code\u003e contains a complete HTML preview with links to this server\u0026rsquo;s assets.\nKeep the server available while you view the document.\u003c/p\u003e\n\u003cp\u003eOptional appearance keys are \u003ccode\u003edata-theme\u003c/code\u003e, \u003ccode\u003edata-palette\u003c/code\u003e, \u003ccode\u003edata-aesthetic\u003c/code\u003e, \u003ccode\u003edata-fontpack\u003c/code\u003e, and \u003ccode\u003edata-text-size\u003c/code\u003e.\nValues must occur in the bundled appearance catalogs.\nThe API rejects unknown fields, malformed JSON, and invalid appearance choices with HTTP 400.\nIt returns HTTP 413 for source above 200,000 UTF-8 bytes or a request above 1 MiB.\nRequests need \u003ccode\u003eapplication/json\u003c/code\u003e. Cross-origin render requests receive HTTP 403.\u003c/p\u003e\n\u003cp\u003eThe handler runs one render at a time. Canceled requests leave the queue before rendering.\nAn active render completes before the next render starts.\nThe browser stops waiting after 30 seconds. The demo server has read and write timeouts.\u003c/p\u003e\n\u003cp\u003eThis editor supports trusted local authoring. Authored HTML and styles remain available inside an opaque-origin iframe sandbox.\nOnly renderer-generated scripts run during fragment updates. Reload the page to apply changes to authored scripts.\nPreview scripts cannot read the editor\u0026rsquo;s DOM or storage. Authored links and images can access external networks.\nKeep the default loopback binding for local use. Add authentication and suitable resource controls before remote deployment.\u003c/p\u003e\n\u003cp\u003eAll built-in assets come from the server. Offline reload is not supported.\nFor site builds and site-specific plugins, use the normal \u003ca href=\"../reference/cli/\"\u003eCLI\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"check-persistent-preview-updates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCheck persistent preview updates\u003c/span\u003e \u003ca href=\"#check-persistent-preview-updates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eStart the Go workbench, then run its browser regression tests:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_WORKBENCH_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttp://127.0.0.1:8767 \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_TEST_CHROMIUM\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e/usr/bin/chromium \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv run --with playwright python python/test_go_editor_browser.py -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSet \u003ccode\u003eMARKATA_TEST_CHROMIUM\u003c/code\u003e to your Chromium executable.\nThe tests check retained stylesheets, fragment responses, conditional styles, charts, and diagrams.\u003c/p\u003e\n\u003ch2 id=\"benchmark-the-server\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBenchmark the server\u003c/span\u003e \u003ca href=\"#benchmark-the-server\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ca href=\"/docs/guides/renderer-integration-benchmarks/#go-server-workbench\"\u003eintegration benchmark guide\u003c/a\u003e compares seven existing fixtures with the Python reference.\nIt separates initial renders, uncached edits, and cached edits. Raw samples and reproduction commands are included.\u003c/p\u003e\n\u003ch2 id=\"shared-editor-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eShared editor behavior\u003c/span\u003e \u003ca href=\"#shared-editor-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse the command palette to import or export a Markdown file. An oversized import leaves the current document intact.\nSearch for \u003cstrong\u003eNew Post\u003c/strong\u003e in the command palette to open a fuzzy picker for\nbuilt-in starters and \u003ccode\u003e.md\u003c/code\u003e files in the site\u0026rsquo;s \u003ccode\u003etemplates/\u003c/code\u003e directory. Choose\na starter to open its details form. The title and destination folder start with\ntemplate defaults. The slug field stays empty when using the suggestion; its\nghost text and the destination path update as the title changes. Enter a custom\nslug only when you want to override the title-derived filename. Creating the\npost opens the new file in the editor, where later edits autosave to the site.\nThe footer reports whether the draft was saved. Storage failures leave editing and downloads available.\nSee \u003ca href=\"/docs/guides/renderer-integration-benchmarks/#shared-editor-features-and-runtime-differences\"\u003eshared editor features and runtime differences\u003c/a\u003e for the comparison.\u003c/p\u003e\n\u003ch2 id=\"command-palette-and-markdown-commands\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommand palette and Markdown commands\u003c/span\u003e \u003ca href=\"#command-palette-and-markdown-commands\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSelect \u003cstrong\u003eCommands\u003c/strong\u003e or press \u003cstrong\u003eCtrl+Shift+P\u003c/strong\u003e (\u003cstrong\u003eCmd+Shift+P\u003c/strong\u003e on macOS).\nSearch for special syntax, then press \u003cstrong\u003eEnter\u003c/strong\u003e to insert it at your selection.\nSee the \u003ca href=\"editor-command-palette.md\"\u003ecommand palette guide\u003c/a\u003e for the catalog and keyboard controls.\u003c/p\u003e\n\u003cp\u003eTo open the command palette with a complete example loaded, visit \u003ccode\u003e/?example\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"review-changes-before-publishing-experimental\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReview changes before publishing (experimental)\u003c/span\u003e \u003ca href=\"#review-changes-before-publishing-experimental\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen editing a Markdown file inside a Git-backed workspace, select \u003cstrong\u003ePublish\u003c/strong\u003e\nin the upper-right header, search for \u003cstrong\u003ePublishing: Review \u0026amp; Publish\u003c/strong\u003e in the\ncommand palette, or press \u003cstrong\u003eCtrl/Cmd+S\u003c/strong\u003e or \u003cstrong\u003eCtrl/Cmd+Shift+Enter\u003c/strong\u003e. Vim mode\nalso accepts \u003ccode\u003e:w\u003c/code\u003e; Emacs mode accepts \u003cstrong\u003eCtrl-X Ctrl-S\u003c/strong\u003e. Each opens the same\nreview dialog; none of them publishes immediately.\u003c/p\u003e\n\u003cp\u003eThe dialog first waits until the exact text in the editor has been saved to\nthe workspace. It then compares that saved source with the file from the last\nGit commit. \u003cstrong\u003eRendered diff\u003c/strong\u003e opens first. \u003cstrong\u003eSide by side\u003c/strong\u003e shows both rendered\nversions and keeps matching sections in view while you scroll; mobile can switch\nbetween versions by tapping or swiping. \u003cstrong\u003eSource diff\u003c/strong\u003e shows unified Markdown,\nand \u003cstrong\u003eFull diff\u003c/strong\u003e opens the detailed source viewer. The \u003cstrong\u003eCommit message\u003c/strong\u003e tab\nshows the message for the local commit and lets you edit it. Metadata chips\nidentify draft/published flag changes, slug changes, and conflicting publication\nflags.\u003c/p\u003e\n\u003cp\u003eThe review can create a local Git commit for the selected page, using the\nmessage shown in the \u003cstrong\u003eCommit message\u003c/strong\u003e tab. After that commit, \u003cstrong\u003ePush to\norigin\u003c/strong\u003e is a separate action. Pushing does not prove that a deployment\nsucceeded; when Builder Admin verification is configured, \u003cstrong\u003eCheck live status\u003c/strong\u003e\ncan confirm the deployed source revision. “Last committed” is not necessarily\nthe live site revision. A scratch file must first be created or opened as a\nworkspace Markdown post. If the workspace has no Git history, the review\nreports this rather than assuming a baseline.\u003c/p\u003e\n\u003cp\u003eThe publish contract and planned deployment safety gates are defined in\n\u003ca href=\"../../spec/spec/EDITOR_PUBLISHING.md\"\u003eEditor publishing\u003c/a\u003e.\u003c/p\u003e\n\u003ch3 id=\"verify-a-remote-publication-with-builder-admin-opt-in\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVerify a remote publication with Builder Admin (opt-in)\u003c/span\u003e \u003ca href=\"#verify-a-remote-publication-with-builder-admin-opt-in\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePublishing has deliberately separate steps: review the exact Markdown and\nfrontmatter, commit only that selected page, then explicitly push to \u003ccode\u003eorigin\u003c/code\u003e.\nA successful push \u003cstrong\u003edoes not\u003c/strong\u003e prove the site is live.\u003c/p\u003e\n\u003cp\u003eFor a site deployed through Markata Builder Admin, the local editor can\noptionally verify the current release\u0026rsquo;s recorded source Git commit:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_PUBLISH_BUILDER_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://builder.example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_PUBLISH_BUILDER_TOKEN\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026lt;your authorized bearer token\u0026gt;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata editor --workspace ./site\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse an API token authorized for Builder Admin\u0026rsquo;s \u003ccode\u003e/api/v1/state\u003c/code\u003e. The editor\nstores neither the token nor builder URL in the browser; the local backend\nmakes a short, authenticated, server-side GET request. Remote builder URLs\nmust use HTTPS (loopback HTTP is permitted for development). Redirects are\nnot followed, so bearer tokens cannot be forwarded to a different host.\u003c/p\u003e\n\u003cp\u003eAfter pushing, select \u003cstrong\u003eCheck live status\u003c/strong\u003e. This checks\n\u003ccode\u003erevision.live_source_commit\u003c/code\u003e, with a fallback to the current release\u0026rsquo;s\nsource revision when available. It reports \u003cstrong\u003eLive · Verified\u003c/strong\u003e only if that\nrevision matches the exact pushed SHA. Unknown revision, unavailable API,\nunconfigured auth, failed build, and different live SHA never count as success.\u003c/p\u003e\n\u003cp\u003eThis verification identifies the release\u0026rsquo;s \u003cstrong\u003esource Git revision\u003c/strong\u003e, not\nits byte-for-byte rendered output, CDN cache rollout, or availability at\nevery public edge. Site URL health checks and other deployment providers\nneed dedicated follow-up adapters.\u003c/p\u003e\n",
      "content_text": "\nRun the shipped Go editor command:\n\n```bash\nmarkata editor --workspace ./docs\n```\n\nOpen the local URL printed by the command. Edit Markdown on the left and view the preview on the right.\nPress Ctrl+C to stop the server. The default address is `127.0.0.1:8766`.\nFor a checkout build, run `go run ./cmd/markata-go editor --workspace ./docs`.\n\nThe Go server calls Markata's standalone renderer directly. It starts no Python process and needs no WASM runtime.\nIt uses the same Markdown renderer as the [Python API](./python-renderer/) and [FastAPI editor](./fastapi-editor/).\nThe preview does not build a site. The language service indexes Markdown and reads workspace configuration for existing mention support.\n\nUse the appearance picker to select a palette, color mode, style, font, or text size.\nOpen **Editor settings** to choose line wrapping, keymap, and layout. Drag the\ndivider between the source and preview panes to resize them. Choose **Editor\nonly** or **Preview only** to focus on one pane; **Editor and preview** restores\nthe split.\nScrolling either pane keeps the corresponding Markdown visible in the other.\nWhen you write or move the cursor, the preview follows the editor. Scroll sync\nis on by default; turn off **Sync editor and preview scrolling** in **Editor\nsettings** to scroll each pane independently. The choice is saved in this browser.\nAt the end of a document, both panes keep extra scroll space so the last lines\ncan move above the bottom edge while you write.\nIn split view, a subtle marker shows the corresponding preview block, with a\nthin caret and **You** flag at the active location. When rendered text matches\nthe source line, the preview caret follows the character cursor. For content\nthat a renderer transforms or replaces, it falls back to the nearest mapped\nsource position. Click rendered text to move the source caret to the matching\ntext when possible; links keep their normal navigation behavior. The source\npane keeps its normal caret on the actual text\ncursor. With the Vim keymap, the preview caret changes shape for normal,\ninsert, replace, and visual modes. Preview updates preserve\nunchanged blocks, and layout changes refresh the source-to-preview mapping,\nincluding after images and fonts load. While you edit, the preview follows the\ncaret after the matching content update completes, including when you keep\ntyping on the same line. Scroll changes caused by a render or a delayed\nimage/font layout are not mistaken for manual scrolling. The preview marker is\nsubtle and marks the rendered block for the current caret line. Nested Markdown\ncontainer boundaries add source anchors to improve scroll alignment in long\nsections; these markers exist only in the preview render and do not change your\nsource. Within nested content, the marker follows the narrowest container that\ncontains the caret line.\nChoose Default, Vim, Emacs, or Sublime keymaps in **Editor settings**.\nIn Vim mode, press `/` to search forward, `?` to search backward, then `n` or\n`N` to move between matches.\nCode highlighting, icons, admonitions, tables, checklists, Mermaid, and Chart.js use local assets.\n\nPress **Ctrl+P** (**Cmd+P** on macOS) to find a site file by its path, title,\nslug, or tag. The finder shows the current and recently opened files when its\nsearch is empty.\nSelect a result or press **Enter** to open it in the editor.\nChoose **Feeds** or **Tags** in the workspace selector to browse posts by feed\nor tag. Feed names are shown as roots with folders relative to the workspace.\n\nEdits to selected site files save back to the workspace after a short pause.\nUnsaved scratch documents stay in browser storage. The browser also keeps a\nrecovery copy of workspace edits. Use **Ctrl+Shift+P** and search for **Download\ncurrent file** to export a copy, or **Open Markdown file** to import a file as\nan unsaved draft.\nA storage error appears beside the render metrics. Editing and downloads remain available.\nThe server writes only selected workspace files. Scratch drafts remain local to\nthe browser origin, so drafts on one port remain separate from drafts on another.\nWorkspace saves and new-post creation require a same-origin browser request.\nThe server rejects missing or foreign origins before it changes a site file.\n\nThe preview updates after a 100 ms pause. One request runs at a time, and newer edits replace pending edits.\nOld responses cannot replace a newer draft. Errors preserve the last successful preview.\nThe footer shows Go render time, total edit-to-preview time, source size, and preview size.\nRepeated source uses a one-entry memory cache. Appearance changes update the preview without a render request.\nWorkspace post embeds in `\u003c!-- embed not found: post-slug --\u003e\n![[post-slug]]` or `![embed](path/to/post.md)` format\nrender as cards linked to the matching site post. Fenced code examples remain\nliteral source.\n\n## Language assistance\n\nThe editor connects to the existing Markata LSP through `/lsp` over WebSocket.\nThe server indexes the directory from `--workspace`. The default directory is the current directory.\nThe browser LSP accepts same-origin connections on `localhost` or a loopback IP only.\n\nType `[[` for wiki-link suggestions, including aliases. Type `[label](` for Markdown document paths.\nAutomatic suggestions wait for a short typing pause. Press **Ctrl+Space** to request suggestions immediately at the cursor. Use the arrow keys and Enter to select a suggestion.\nExisting frontmatter, admonition, and mention completion also use the LSP.\nBroken wiki links receive an underline. The underline tooltip shows the diagnostic message.\nThe workbench preview resolves valid `[[wikilinks]]` against the site's workspace index.\nClick a resolved wikilink in the preview to open that post in the editor.\nSelect the error and warning counts in the bottom status bar to inspect diagnostics and\njump to their source locations.\n\nThe editor sends unsaved text as a synthetic `.markata/browser-draft.md` document.\nThis document stays in memory. Markdown path suggestions start at the workspace root because the draft has no source file.\nThe Files tree opens source files from the selected workspace using Markata glob rules. The Feeds view groups files by configured feed filters, and the Tags view groups them by loaded frontmatter. The selector shows file, feed, and tag counts. See [workspace navigation](./renderer-site-tree/).\nEach WebSocket connection owns its own draft and index. Reload the page to index external file changes.\n\n## Edit page properties\n\nSelect a site file, then choose **Properties** to edit its frontmatter in the\nfull-height page-details view. The live preview stays visible beside it. Choose\n**Back to Markdown** to return to the source, or **Edit YAML** to work directly\nwith the frontmatter block. Press **Escape** to return to the article. The\ncommand palette also has actions to open page details, add a property, and\nreturn to Markdown.\n\nThe page summary shows the title, URL slug or source path, and publication\nstate. Common fields appear first. Choose **Add property**, search for a known\nfield, and select it.\nOpen **Custom property** to add a site-specific YAML field. Edit tags as chips:\nremove one tag at a time or enter a tag and choose **Add**. Advanced fields\nremain available under **Show advanced properties**.\n\nProperty edits update the Markdown source and use the normal workspace save\nand preview behavior. Press **Ctrl+Z** or **Cmd+Z** to undo an edit. Use\n**Remove** to delete a property from the page.\n\nThe footer reports the language connection state. Editing and preview continue if the connection fails.\nReload the page to reconnect. The browser adapter is shared with the [FastAPI example](./fastapi-editor/).\n\nFor an embedded application, use `workbench.NewWithWorkspace(ctx, root)`.\nCancel `ctx` during shutdown to close active language connections.\n`workbench.New()` uses the current directory and the lifetime of the application.\n\n### WebSocket protocol\n\n`GET /lsp/config` returns `rootUri` and `documentUri` for the selected workspace.\nConnect to `/lsp` with the page origin. Each WebSocket text message contains one JSON-RPC object.\nWebSocket messages omit the stdio `Content-Length` headers.\nSend `initialize`, `initialized`, and `textDocument/didOpen` before language requests.\nThe session accepts the synthetic draft URI from the configuration response.\nThe server ignores browser workspace-change notifications and overrides the client workspace during initialization.\n\nBrowser completion responses contain at most 200 suggestions. More specific text requests a new list.\nMessages have a 2 MiB limit. A disconnect releases the session.\nThe endpoint rejects missing or foreign origins. It provides no authentication or shared workspace management.\nKeep this example on a trusted local address.\n\n## Embed the handler\n\nMount the handler at the root of a dedicated origin:\n\n```go\npackage main\n\nimport (\n    \"log\"\n    \"net/http\"\n    \"time\"\n\n    \"github.com/WaylonWalker/markata/pkg/workbench\"\n)\n\nfunc main() {\n    handler, err := workbench.New()\n    if err != nil {\n        log.Fatal(err)\n    }\n    server := \u0026http.Server{\n        Addr: \"127.0.0.1:8767\", Handler: handler,\n        ReadHeaderTimeout: 5 * time.Second,\n    }\n    log.Fatal(server.ListenAndServe())\n}\n```\n\nCreate one handler at startup. It prepares the shared appearance bundle once.\nThe handler owns no listeners, signal handlers, or application configuration.\nA future builder can embed it without the demo command.\n\n## Render API\n\n```bash\ncurl http://127.0.0.1:8767/render \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"markdown\":\"# Hello Go\",\"appearance\":{\"data-theme\":\"light\"}}'\n```\n\nThe first editor request receives a complete preview document. Later requests use `\"include_document\": false` and receive fragments.\nThe iframe keeps its document, shared styles, and loaded libraries between edits.\nNew features add their styles once; removed features remove their conditional styles.\nChart instances are destroyed before replacement, and feature scripts initialize the new content.\n\nThe JSON response contains `document`, `html`, `feature_head_html`, `body_end_html`, and `cached`.\nMetrics include `render_ms`, `input_bytes`, `html_bytes`, and `document_bytes`.\nWith `include_document` set to false, `document` is null and `document_bytes` is zero.\nOmit this option to retain the original full-document response.\nThe `Server-Timing` response header also reports render time.\n`document` contains a complete HTML preview with links to this server's assets.\nKeep the server available while you view the document.\n\nOptional appearance keys are `data-theme`, `data-palette`, `data-aesthetic`, `data-fontpack`, and `data-text-size`.\nValues must occur in the bundled appearance catalogs.\nThe API rejects unknown fields, malformed JSON, and invalid appearance choices with HTTP 400.\nIt returns HTTP 413 for source above 200,000 UTF-8 bytes or a request above 1 MiB.\nRequests need `application/json`. Cross-origin render requests receive HTTP 403.\n\nThe handler runs one render at a time. Canceled requests leave the queue before rendering.\nAn active render completes before the next render starts.\nThe browser stops waiting after 30 seconds. The demo server has read and write timeouts.\n\nThis editor supports trusted local authoring. Authored HTML and styles remain available inside an opaque-origin iframe sandbox.\nOnly renderer-generated scripts run during fragment updates. Reload the page to apply changes to authored scripts.\nPreview scripts cannot read the editor's DOM or storage. Authored links and images can access external networks.\nKeep the default loopback binding for local use. Add authentication and suitable resource controls before remote deployment.\n\nAll built-in assets come from the server. Offline reload is not supported.\nFor site builds and site-specific plugins, use the normal [CLI](../reference/cli/).\n\n## Check persistent preview updates\n\nStart the Go workbench, then run its browser regression tests:\n\n```bash\nMARKATA_GO_WORKBENCH_URL=http://127.0.0.1:8767 \\\nMARKATA_TEST_CHROMIUM=/usr/bin/chromium \\\nuv run --with playwright python python/test_go_editor_browser.py -v\n```\n\nSet `MARKATA_TEST_CHROMIUM` to your Chromium executable.\nThe tests check retained stylesheets, fragment responses, conditional styles, charts, and diagrams.\n\n\n## Benchmark the server\n\nThe [integration benchmark guide](/docs/guides/renderer-integration-benchmarks/#go-server-workbench) compares seven existing fixtures with the Python reference.\nIt separates initial renders, uncached edits, and cached edits. Raw samples and reproduction commands are included.\n\n## Shared editor behavior\n\nUse the command palette to import or export a Markdown file. An oversized import leaves the current document intact.\nSearch for **New Post** in the command palette to open a fuzzy picker for\nbuilt-in starters and `.md` files in the site's `templates/` directory. Choose\na starter to open its details form. The title and destination folder start with\ntemplate defaults. The slug field stays empty when using the suggestion; its\nghost text and the destination path update as the title changes. Enter a custom\nslug only when you want to override the title-derived filename. Creating the\npost opens the new file in the editor, where later edits autosave to the site.\nThe footer reports whether the draft was saved. Storage failures leave editing and downloads available.\nSee [shared editor features and runtime differences](/docs/guides/renderer-integration-benchmarks/#shared-editor-features-and-runtime-differences) for the comparison.\n\n## Command palette and Markdown commands\n\nSelect **Commands** or press **Ctrl+Shift+P** (**Cmd+Shift+P** on macOS).\nSearch for special syntax, then press **Enter** to insert it at your selection.\nSee the [command palette guide](editor-command-palette.md) for the catalog and keyboard controls.\n\nTo open the command palette with a complete example loaded, visit `/?example`.\n\n\n## Review changes before publishing (experimental)\n\nWhen editing a Markdown file inside a Git-backed workspace, select **Publish**\nin the upper-right header, search for **Publishing: Review \u0026 Publish** in the\ncommand palette, or press **Ctrl/Cmd+S** or **Ctrl/Cmd+Shift+Enter**. Vim mode\nalso accepts `:w`; Emacs mode accepts **Ctrl-X Ctrl-S**. Each opens the same\nreview dialog; none of them publishes immediately.\n\nThe dialog first waits until the exact text in the editor has been saved to\nthe workspace. It then compares that saved source with the file from the last\nGit commit. **Rendered diff** opens first. **Side by side** shows both rendered\nversions and keeps matching sections in view while you scroll; mobile can switch\nbetween versions by tapping or swiping. **Source diff** shows unified Markdown,\nand **Full diff** opens the detailed source viewer. The **Commit message** tab\nshows the message for the local commit and lets you edit it. Metadata chips\nidentify draft/published flag changes, slug changes, and conflicting publication\nflags.\n\nThe review can create a local Git commit for the selected page, using the\nmessage shown in the **Commit message** tab. After that commit, **Push to\norigin** is a separate action. Pushing does not prove that a deployment\nsucceeded; when Builder Admin verification is configured, **Check live status**\ncan confirm the deployed source revision. “Last committed” is not necessarily\nthe live site revision. A scratch file must first be created or opened as a\nworkspace Markdown post. If the workspace has no Git history, the review\nreports this rather than assuming a baseline.\n\nThe publish contract and planned deployment safety gates are defined in\n[Editor publishing](../../spec/spec/EDITOR_PUBLISHING.md).\n\n\n### Verify a remote publication with Builder Admin (opt-in)\n\nPublishing has deliberately separate steps: review the exact Markdown and\nfrontmatter, commit only that selected page, then explicitly push to `origin`.\nA successful push **does not** prove the site is live.\n\nFor a site deployed through Markata Builder Admin, the local editor can\noptionally verify the current release's recorded source Git commit:\n\n```sh\nexport MARKATA_PUBLISH_BUILDER_URL=\"https://builder.example.com\"\nexport MARKATA_PUBLISH_BUILDER_TOKEN=\"\u003cyour authorized bearer token\u003e\"\nmarkata editor --workspace ./site\n```\n\nUse an API token authorized for Builder Admin's `/api/v1/state`. The editor\nstores neither the token nor builder URL in the browser; the local backend\nmakes a short, authenticated, server-side GET request. Remote builder URLs\nmust use HTTPS (loopback HTTP is permitted for development). Redirects are\nnot followed, so bearer tokens cannot be forwarded to a different host.\n\nAfter pushing, select **Check live status**. This checks\n`revision.live_source_commit`, with a fallback to the current release's\nsource revision when available. It reports **Live · Verified** only if that\nrevision matches the exact pushed SHA. Unknown revision, unavailable API,\nunconfigured auth, failed build, and different live SHA never count as success.\n\nThis verification identifies the release's **source Git revision**, not\nits byte-for-byte rendered output, CDN cache rollout, or availability at\nevery public edge. Site URL health checks and other deployment providers\nneed dedicated follow-up adapters.\n",
      "summary": "Run or embed a Go server with a live Markata Markdown editor",
      "date_published": "2026-10-28T00:00:00Z",
      "date_modified": "2026-10-28T00:00:00Z",
      "tags": [
        "documentation",
        "go",
        "markdown"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/fastapi-editor/",
      "url": "https://markata.dev/docs/guides/fastapi-editor/",
      "title": "Live Markdown editor with FastAPI",
      "content_html": "\u003cp\u003eRun the single-file example:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv run examples/fastapi_editor.py\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOpen \u003ca href=\"http://127.0.0.1:8765\"\u003ehttp://127.0.0.1:8765\u003c/a\u003e. Edit Markdown on the left. The preview updates after\n250 milliseconds without edits. Narrow screens stack the editor and preview.\nThe browser stores your draft locally. Use \u003cstrong\u003eDownload .md\u003c/strong\u003e to save a file.\u003c/p\u003e\n\u003cp\u003eThe example requires a Markata wheel containing the Python API from PR #1835.\nUntil that API is released, install a wheel built from that PR:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv run --with /absolute/path/to/markata-VERSION-PLATFORM.whl examples/fastapi_editor.py\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eReplace the wheel path with your local wheel. With Python and dependencies already\ninstalled, \u003ccode\u003epython examples/fastapi_editor.py\u003c/code\u003e also works. The server listens on\nlocalhost, port 8765. Press Ctrl+C to stop it.\u003c/p\u003e\n\u003cp\u003eEach preview uses an application-owned \u003ccode\u003eRendererPool\u003c/code\u003e through FastAPI. Two warm\nrenderers start with the application\u0026rsquo;s lifespan and retain the workspace\u0026rsquo;s\nMarkdown configuration. Inline assets support\ncode highlighting, Mermaid, and Chart.js without separate asset routes. A fresh\niframe document executes initialization scripts after each successful render.\nThe iframe permits scripts and keeps the preview separate from the editor origin.\nAuthored HTML and inline styles are enabled for this local authoring tool.\nThe preview remains isolated from the editor origin.\u003c/p\u003e\n\u003cp\u003eThe example limits input to 200,000 UTF-8 bytes and rendering to 15 seconds.\nErrors preserve the last successful preview. A crashed or timed-out renderer is\nreplaced automatically; no new subprocess is started for ordinary requests.\nThis example is a local development tool. It does not include accounts or shared storage.\u003c/p\u003e\n\u003cp\u003eUse the appearance button beside \u003cstrong\u003eDownload .md\u003c/strong\u003e to open Markata\u0026rsquo;s full picker.\nSearch color themes, switch light and dark modes, or select Style and Font tabs.\nSelections apply to the preview and persist across edits. Markata supplies the\npalette catalog, styles, scripts, and fonts. No site build runs during editing.\u003c/p\u003e\n\u003cp\u003eThe footer shows Markata time, request time, input bytes, document bytes, and frame\nload time. Markata time includes queue wait, rendering, asset collection, and JSON parsing,\nbut normally excludes process startup. Request time also includes HTTP transfer and browser JSON parsing.\nFrame load time measures iframe loading, not completed asynchronous diagrams.\nThe 250-millisecond typing delay is separate from these measurements.\u003c/p\u003e\n\u003cp\u003eThe preview uses the default site\u0026rsquo;s article wrappers, reading size, and spacing.\nIt previews article content. It does not add site navigation, feeds, or post metadata.\u003c/p\u003e\n\u003cp\u003eLucide shortcodes such as \u003ccode\u003e:lucide-globe:\u003c/code\u003e and \u003ccode\u003e:lucide/heart:\u003c/code\u003e display as inline\nicons in prose and headings. Markata bundles all 2,118 icons from Markata\u0026rsquo;s pinned\nLucide pack, including its license. Code examples and unknown shortcodes stay unchanged.\u003c/p\u003e\n\u003cp\u003eThe Markdown pane uses bundled CodeMirror with syntax highlighting, line numbers,\nline wrapping, and bracket matching. Select \u003cstrong\u003eKeymap\u003c/strong\u003e above the editor to use\nDefault, Vim, Emacs, or Sublime bindings. Your choice persists in this browser.\nWith Vim selected, press \u003ccode\u003ei\u003c/code\u003e to insert text and \u003ccode\u003eEscape\u003c/code\u003e to return to normal mode.\nEditor colors follow the appearance picker. CodeMirror requires no CDN requests.\u003c/p\u003e\n\u003ch2 id=\"run-the-demo-integration-tests\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRun the demo integration tests\u003c/span\u003e \u003ca href=\"#run-the-demo-integration-tests\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse a virtual environment containing the built Markata wheel, FastAPI, Uvicorn,\nHTTPX, and Playwright. Run the endpoint checks against that installed wheel:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython -m unittest discover -s python/integration -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eInstall Chromium and run the browser checks:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython -m playwright install chromium\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython python/test_editor_browser.py -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf Chromium is already installed, set \u003ccode\u003eMARKATA_TEST_CHROMIUM\u003c/code\u003e to its executable path.\nThe tests reserve an available localhost port and stop their server afterward.\nThey cover live edits, saved drafts, keymaps, initial appearance, picker changes,\nLucide icons, responsive rails, and full-width desktop and mobile layouts.\nThe wheel workflow runs both suites against the installed Linux wheel.\u003c/p\u003e\n\u003cp\u003eThe first render returns the full preview document. Later requests set\n\u003ccode\u003einclude_document\u003c/code\u003e to \u003ccode\u003efalse\u003c/code\u003e, so the server returns only the rendered fragment,\nconditional styles, scripts, and metrics. The browser keeps its document and\nappearance styles loaded, then replaces the article content in the existing\nsandboxed frame. This avoids sending the large site CSS payload or reloading\ntheme stylesheets after every edit.\u003c/p\u003e\n\u003cp\u003eSee \u003ca href=\"/docs/guides/renderer-integration-benchmarks/\"\u003eintegration benchmarks\u003c/a\u003e for measured fixture timings and reproduction steps.\u003c/p\u003e\n\u003ch2 id=\"shared-editor-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eShared editor behavior\u003c/span\u003e \u003ca href=\"#shared-editor-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse \u003cstrong\u003eOpen .md\u003c/strong\u003e to import a Markdown file. An oversized file leaves the current draft intact.\nUse \u003cstrong\u003eDownload .md\u003c/strong\u003e to keep a copy outside browser storage.\nThe footer reports whether the draft was saved. Storage failures leave editing and downloads available.\nSee \u003ca href=\"/docs/guides/renderer-integration-benchmarks/#shared-editor-features-and-runtime-differences\"\u003eshared editor features and runtime differences\u003c/a\u003e for the comparison.\u003c/p\u003e\n\u003ch2 id=\"insert-markdown-commands\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInsert Markdown commands\u003c/span\u003e \u003ca href=\"#insert-markdown-commands\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSelect \u003cstrong\u003eCommands\u003c/strong\u003e or press \u003cstrong\u003eCtrl+Shift+P\u003c/strong\u003e (\u003cstrong\u003eCmd+Shift+P\u003c/strong\u003e on macOS).\nSearch for special syntax, then press \u003cstrong\u003eEnter\u003c/strong\u003e to insert it at your selection.\nSee the \u003ca href=\"editor-command-palette.md\"\u003ecommand palette guide\u003c/a\u003e for the catalog and keyboard controls.\u003c/p\u003e\n\u003ch2 id=\"language-assistance\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLanguage assistance\u003c/span\u003e \u003ca href=\"#language-assistance\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe Python and Go editors connect to Markata\u0026rsquo;s LSP through a same-origin WebSocket.\nThe server selects the workspace with \u003ccode\u003eMARKATA_LSP_WORKSPACE\u003c/code\u003e; browser messages cannot change it.\nThe endpoint accepts \u003ccode\u003elocalhost\u003c/code\u003e and loopback IP hosts only. It is intended for local examples.\u003c/p\u003e\n\u003cp\u003eBoth editors complete wiki links and Markdown document paths. They also complete\ncommand-catalog containers, their known attributes, and Mermaid diagram syntax.\nPress \u003cstrong\u003eCtrl+Space\u003c/strong\u003e to request suggestions at the cursor. File-tree navigation\nis a separate feature.\u003c/p\u003e\n\u003cp\u003eTo run the browser checks against both servers, build the Go binaries and set\n\u003ccode\u003eMARKATA_LSP_BINARY\u003c/code\u003e and \u003ccode\u003eMARKATA_WORKBENCH_BINARY\u003c/code\u003e as shown below:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego build -o /tmp/markata-editor-lsp ./cmd/markata-go\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego build -o /tmp/markata-editor-workbench ./cmd/markata-workbench\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_LSP_BINARY\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e/tmp/markata-editor-lsp \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_WORKBENCH_BINARY\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e/tmp/markata-editor-workbench \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython python/test_browser_lsp.py -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"workspace-files\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWorkspace files\u003c/span\u003e \u003ca href=\"#workspace-files\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSet \u003ccode\u003eMARKATA_LSP_WORKSPACE\u003c/code\u003e to a cloned site before starting the server.\nThe Files tree uses Markata glob and load plugins through the bundled Go binary.\nSelect a file to edit a browser draft; download it to keep a copy. See\n\u003ca href=\"./renderer-site-tree/\"\u003eworkspace navigation\u003c/a\u003e.\u003c/p\u003e\n",
      "content_text": "\nRun the single-file example:\n\n```bash\nuv run examples/fastapi_editor.py\n```\n\nOpen \u003chttp://127.0.0.1:8765\u003e. Edit Markdown on the left. The preview updates after\n250 milliseconds without edits. Narrow screens stack the editor and preview.\nThe browser stores your draft locally. Use **Download .md** to save a file.\n\nThe example requires a Markata wheel containing the Python API from PR #1835.\nUntil that API is released, install a wheel built from that PR:\n\n```bash\nuv run --with /absolute/path/to/markata-VERSION-PLATFORM.whl examples/fastapi_editor.py\n```\n\nReplace the wheel path with your local wheel. With Python and dependencies already\ninstalled, `python examples/fastapi_editor.py` also works. The server listens on\nlocalhost, port 8765. Press Ctrl+C to stop it.\n\nEach preview uses an application-owned `RendererPool` through FastAPI. Two warm\nrenderers start with the application's lifespan and retain the workspace's\nMarkdown configuration. Inline assets support\ncode highlighting, Mermaid, and Chart.js without separate asset routes. A fresh\niframe document executes initialization scripts after each successful render.\nThe iframe permits scripts and keeps the preview separate from the editor origin.\nAuthored HTML and inline styles are enabled for this local authoring tool.\nThe preview remains isolated from the editor origin.\n\nThe example limits input to 200,000 UTF-8 bytes and rendering to 15 seconds.\nErrors preserve the last successful preview. A crashed or timed-out renderer is\nreplaced automatically; no new subprocess is started for ordinary requests.\nThis example is a local development tool. It does not include accounts or shared storage.\n\nUse the appearance button beside **Download .md** to open Markata's full picker.\nSearch color themes, switch light and dark modes, or select Style and Font tabs.\nSelections apply to the preview and persist across edits. Markata supplies the\npalette catalog, styles, scripts, and fonts. No site build runs during editing.\n\nThe footer shows Markata time, request time, input bytes, document bytes, and frame\nload time. Markata time includes queue wait, rendering, asset collection, and JSON parsing,\nbut normally excludes process startup. Request time also includes HTTP transfer and browser JSON parsing.\nFrame load time measures iframe loading, not completed asynchronous diagrams.\nThe 250-millisecond typing delay is separate from these measurements.\n\nThe preview uses the default site's article wrappers, reading size, and spacing.\nIt previews article content. It does not add site navigation, feeds, or post metadata.\n\nLucide shortcodes such as `:lucide-globe:` and `:lucide/heart:` display as inline\nicons in prose and headings. Markata bundles all 2,118 icons from Markata's pinned\nLucide pack, including its license. Code examples and unknown shortcodes stay unchanged.\n\nThe Markdown pane uses bundled CodeMirror with syntax highlighting, line numbers,\nline wrapping, and bracket matching. Select **Keymap** above the editor to use\nDefault, Vim, Emacs, or Sublime bindings. Your choice persists in this browser.\nWith Vim selected, press `i` to insert text and `Escape` to return to normal mode.\nEditor colors follow the appearance picker. CodeMirror requires no CDN requests.\n\n\n## Run the demo integration tests\n\nUse a virtual environment containing the built Markata wheel, FastAPI, Uvicorn,\nHTTPX, and Playwright. Run the endpoint checks against that installed wheel:\n\n```bash\npython -m unittest discover -s python/integration -v\n```\n\nInstall Chromium and run the browser checks:\n\n```bash\npython -m playwright install chromium\npython python/test_editor_browser.py -v\n```\n\nIf Chromium is already installed, set `MARKATA_TEST_CHROMIUM` to its executable path.\nThe tests reserve an available localhost port and stop their server afterward.\nThey cover live edits, saved drafts, keymaps, initial appearance, picker changes,\nLucide icons, responsive rails, and full-width desktop and mobile layouts.\nThe wheel workflow runs both suites against the installed Linux wheel.\n\nThe first render returns the full preview document. Later requests set\n`include_document` to `false`, so the server returns only the rendered fragment,\nconditional styles, scripts, and metrics. The browser keeps its document and\nappearance styles loaded, then replaces the article content in the existing\nsandboxed frame. This avoids sending the large site CSS payload or reloading\ntheme stylesheets after every edit.\n\nSee [integration benchmarks](/docs/guides/renderer-integration-benchmarks/) for measured fixture timings and reproduction steps.\n\n## Shared editor behavior\n\nUse **Open .md** to import a Markdown file. An oversized file leaves the current draft intact.\nUse **Download .md** to keep a copy outside browser storage.\nThe footer reports whether the draft was saved. Storage failures leave editing and downloads available.\nSee [shared editor features and runtime differences](/docs/guides/renderer-integration-benchmarks/#shared-editor-features-and-runtime-differences) for the comparison.\n\n## Insert Markdown commands\n\nSelect **Commands** or press **Ctrl+Shift+P** (**Cmd+Shift+P** on macOS).\nSearch for special syntax, then press **Enter** to insert it at your selection.\nSee the [command palette guide](editor-command-palette.md) for the catalog and keyboard controls.\n\n## Language assistance\n\nThe Python and Go editors connect to Markata's LSP through a same-origin WebSocket.\nThe server selects the workspace with `MARKATA_LSP_WORKSPACE`; browser messages cannot change it.\nThe endpoint accepts `localhost` and loopback IP hosts only. It is intended for local examples.\n\nBoth editors complete wiki links and Markdown document paths. They also complete\ncommand-catalog containers, their known attributes, and Mermaid diagram syntax.\nPress **Ctrl+Space** to request suggestions at the cursor. File-tree navigation\nis a separate feature.\n\nTo run the browser checks against both servers, build the Go binaries and set\n`MARKATA_LSP_BINARY` and `MARKATA_WORKBENCH_BINARY` as shown below:\n\n```bash\ngo build -o /tmp/markata-editor-lsp ./cmd/markata-go\ngo build -o /tmp/markata-editor-workbench ./cmd/markata-workbench\nMARKATA_LSP_BINARY=/tmp/markata-editor-lsp \\\nMARKATA_WORKBENCH_BINARY=/tmp/markata-editor-workbench \\\npython python/test_browser_lsp.py -v\n```\n\n## Workspace files\n\nSet `MARKATA_LSP_WORKSPACE` to a cloned site before starting the server.\nThe Files tree uses Markata glob and load plugins through the bundled Go binary.\nSelect a file to edit a browser draft; download it to keep a copy. See\n[workspace navigation](./renderer-site-tree/).\n",
      "summary": "Run a single-file editor with a live Markata preview",
      "date_published": "2026-10-28T00:00:00Z",
      "date_modified": "2026-10-28T00:00:00Z",
      "tags": [
        "documentation",
        "python",
        "markdown"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/python-renderer/",
      "url": "https://markata.dev/docs/guides/python-renderer/",
      "title": "Render Markdown in Python and FastAPI",
      "content_html": "\u003cp\u003eInstall the official Go-based \u003ccode\u003emarkata\u003c/code\u003e wheel containing this API (available with\nthe release that includes this feature):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv add markata fastapi uvicorn\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRender a complete response with conditional CSS and JavaScript inlined:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003efastapi\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eFastAPI\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003efastapi.responses\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eHTMLResponse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003emarkata\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003erender_async\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eFastAPI\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@app.get\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eresponse_class\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eHTMLResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003easync\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eresult\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003erender_async\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;# Hello\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e!!! note\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    Rendered by Markata.\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003einline_assets\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eHTMLResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresult\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My app\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003erender()\u003c/code\u003e offers the same options for synchronous applications. Both use the\nexisting Go Markdown renderer shipped inside the Python wheel. Each call launches\none process, so cache repeated content in your application. \u003ccode\u003erender_async()\u003c/code\u003e uses\nasync subprocess I/O, terminates the process on timeout or cancellation, and does\nnot block the ASGI event loop. \u003ccode\u003etimeout\u003c/code\u003e defaults to 30 seconds. Failures raise\n\u003ccode\u003emarkata.RenderError\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"fragments-and-signals\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFragments and signals\u003c/span\u003e \u003ca href=\"#fragments-and-signals\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003emarkata\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003erender\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eresult\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erender\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;```go\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003efmt.Println(42)\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e```\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003einline_assets\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresult\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e              \u003cspan class=\"c1\"\u003e# Article markup\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresult\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efeatures\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e          \u003cspan class=\"c1\"\u003e# code, admonitions, roads, mermaid, chartjs, ...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresult\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ehead_html\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e         \u003cspan class=\"c1\"\u003e# Ordered style tags\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresult\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efeature_head_html\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"c1\"\u003e# Only styles specific to this fragment\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresult\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebody_end_html\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e     \u003cspan class=\"c1\"\u003e# Ordered scripts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIn an existing layout, insert \u003ccode\u003ehead_html\u003c/code\u003e into the head, \u003ccode\u003ehtml\u003c/code\u003e inside an\n\u003ccode\u003e\u0026lt;article class=\u0026quot;post-content\u0026quot;\u0026gt;\u003c/code\u003e, and \u003ccode\u003ebody_end_html\u003c/code\u003e after the article. These\nstrings contain generated HTML; use the appropriate trusted-markup mechanism in\nyour template engine. \u003ccode\u003edocument(title=\u0026quot;...\u0026quot;, lang=\u0026quot;en\u0026quot;)\u003c/code\u003e creates that layout for\nyou and escapes the title and language.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003efeature_head_html\u003c/code\u003e returns only conditional styles, without the shared variables,\nmain, and component styles. The renderer returns core theme CSS plus only the optional assets the content\nrequires. Mermaid and Chart.js use Markata\u0026rsquo;s vendored browser libraries; inline\nmode includes them too, without CDN requests. Inlining diagrams can make a\nresponse considerably larger. \u003ccode\u003eexternal_urls\u003c/code\u003e identifies any external browser\ndependencies; for the currently supported bundled features it is empty. Authored\nimages and links still refer to their authored URLs.\u003c/p\u003e\n\u003cp\u003eCore theme CSS includes global styles. For an application with its own design,\nselect the assets you want from \u003ccode\u003eresult.assets\u003c/code\u003e and supply compatible CSS variables\nand \u003ccode\u003e.post-content\u003c/code\u003e styling. This API does not configure a site\u0026rsquo;s theme palette.\u003c/p\u003e\n\u003ch2 id=\"serve-assets-separately\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eServe assets separately\u003c/span\u003e \u003ca href=\"#serve-assets-separately\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe default \u003ccode\u003einline_assets=False\u003c/code\u003e emits links under \u003ccode\u003e/markata-assets\u003c/code\u003e, or your\n\u003ccode\u003easset_base\u003c/code\u003e. Each asset is a dictionary containing \u003ccode\u003eid\u003c/code\u003e, \u003ccode\u003ekind\u003c/code\u003e, \u003ccode\u003eplacement\u003c/code\u003e,\nand \u003ccode\u003econtent\u003c/code\u003e (or \u003ccode\u003eurl\u003c/code\u003e for external assets). Asset IDs are suitable for caching\nand deduplication; scripts must keep their manifest order.\u003c/p\u003e\n\u003cp\u003eA small app can precompute its content and serve the bundled assets directly:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003efastapi\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eFastAPI\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eHTTPException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003efastapi.responses\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eHTMLResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eResponse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003emarkata\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003erender\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eFastAPI\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epage\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erender\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;# Example\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e```python\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eprint(\u0026#39;hello\u0026#39;)\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e```\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003easset_base\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/md-assets\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eassets\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003easset\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]:\u003c/span\u003e \u003cspan class=\"n\"\u003easset\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003easset\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003epage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eassets\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;content\u0026#34;\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003easset\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@app.get\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/md-assets/{asset_id:path}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003easset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003easset_id\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eitem\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eassets\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003easset_id\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eitem\u003c/span\u003e \u003cspan class=\"ow\"\u003eis\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eraise\u003c/span\u003e \u003cspan class=\"n\"\u003eHTTPException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estatus_code\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e404\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003emedia_type\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;text/css\u0026#34;\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eitem\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;kind\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;text/javascript\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eitem\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;content\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003emedia_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003emedia_type\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@app.get\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eresponse_class\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eHTMLResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003epage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Example\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor multiple pages, combine their bundled assets by ID and retain each page\u0026rsquo;s\nordered generated initialization scripts. Generated chart IDs are local to one\nrender result: render all Markdown for a document together. Do not deduplicate\ngenerated scripts across unrelated results. If browser content is replaced after\npage load, the application must execute its initialization scripts; simply\nassigning \u003ccode\u003einnerHTML\u003c/code\u003e does not execute them.\u003c/p\u003e\n\u003ch2 id=\"scope-and-trusted-content\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eScope and trusted content\u003c/span\u003e \u003ca href=\"#scope-and-trusted-content\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSupported: Markata\u0026rsquo;s Markdown extensions, syntax highlighting, containers,\nadmonitions, Mermaid, Chart.js, roads, sortable tables, and opt-in checklists. Rendering does not run a site build;\nsite-dependent link resolution, embeds, image transforms, and other lifecycle\nplugins are outside this API.\u003c/p\u003e\n\u003cp\u003eRaw authored HTML is disabled by default. Set \u003ccode\u003eunsafe=True\u003c/code\u003e only for trusted\ncontent. Rich Markdown output is \u003cstrong\u003enot an HTML sanitizer\u003c/strong\u003e; sanitize untrusted\ncontent using your application\u0026rsquo;s policy. Inline styles and scripts also require\na compatible Content Security Policy. Applications with strict CSP should serve\nassets themselves and apply their own nonce/hash policy to initialization scripts.\u003c/p\u003e\n\u003ch2 id=\"cli-protocol\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCLI protocol\u003c/span\u003e \u003ca href=\"#cli-protocol\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe Python API uses the same machine-readable interface available to other languages:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprintf\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;# Hello\\n\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e markata render --json --inline-assets\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWithout \u003ccode\u003e--json\u003c/code\u003e, \u003ccode\u003emarkata render\u003c/code\u003e emits just the HTML fragment. \u003ccode\u003e--unsafe\u003c/code\u003e enables\nraw HTML; \u003ccode\u003e--asset-base /static/markdown\u003c/code\u003e changes linked bundled asset URLs. This\ncommand reads stdin without discovering a site configuration or writing files.\u003c/p\u003e\n\u003ch2 id=\"reuse-the-site-s-appearance-controls\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReuse the site’s appearance controls\u003c/span\u003e \u003ca href=\"#reuse-the-site-s-appearance-controls\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eLoad the catalog once when the application starts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003emarkata\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eappearance\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erender_async\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epresentation\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eappearance\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003easset_base\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/markata-assets\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eresult\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003erender_async\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;# Hello\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003einline_assets\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ehtml\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eresult\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eappearance\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003epresentation\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003epalette\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ayu-dark\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003emode\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;dark\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003epresentation.picker_html\u003c/code\u003e contains the site\u0026rsquo;s appearance controls. Insert\n\u003ccode\u003epresentation.controls_head_html\u003c/code\u003e in the host page\u0026rsquo;s head and \u003ccode\u003epresentation.body_end_html\u003c/code\u003e\nafter its content. Serve \u003ccode\u003epresentation.assets\u003c/code\u003e through exact path lookup.\n\u003ccode\u003econtrols_head_html\u003c/code\u003e omits site page-layout styles. Complete preview documents\nuse \u003ccode\u003ehead_html\u003c/code\u003e internally. Each asset value is bytes. Use CSS, JavaScript, or WOFF2 response types as appropriate.\nThe asset base also applies to font URLs. No site build or filesystem writes occur.\u003c/p\u003e\n\u003cp\u003eThe controls reuse the site\u0026rsquo;s palette, aesthetic, font, size, and loading catalogs.\n\u003ccode\u003edocument()\u003c/code\u003e now uses site article wrappers. Set \u003ccode\u003emode\u003c/code\u003e, \u003ccode\u003epalette\u003c/code\u003e, \u003ccode\u003eaesthetic\u003c/code\u003e,\n\u003ccode\u003efontpack\u003c/code\u003e, and \u003ccode\u003etext_size\u003c/code\u003e to select appearance. Unknown catalog values raise\n\u003ccode\u003eValueError\u003c/code\u003e. Lucide shortcodes render through Markata\u0026rsquo;s existing icon implementation.\u003c/p\u003e\n\u003cp\u003eFor an isolated preview iframe, set \u003ccode\u003eappearance_bridge=True\u003c/code\u003e. The parent can send\n\u003ccode\u003e{type: \u0026quot;appearance\u0026quot;, attributes: {...}}\u003c/code\u003e with \u003ccode\u003edata-theme\u003c/code\u003e, \u003ccode\u003edata-palette\u003c/code\u003e,\n\u003ccode\u003edata-aesthetic\u003c/code\u003e, \u003ccode\u003edata-fontpack\u003c/code\u003e, and \u003ccode\u003edata-text-size\u003c/code\u003e choices. The bridge accepts\nmessages from its parent and validates values against the catalogs. Keep the\niframe sandboxed with \u003ccode\u003eallow-scripts\u003c/code\u003e and without \u003ccode\u003eallow-same-origin\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eFor live edits, the parent can also send \u003ccode\u003e{\u0026quot;type\u0026quot;: \u0026quot;markdown-render\u0026quot;, \u0026quot;html\u0026quot;: \u0026quot;...\u0026quot;, \u0026quot;feature_head_html\u0026quot;: \u0026quot;...\u0026quot;, \u0026quot;body_end_html\u0026quot;: \u0026quot;...\u0026quot;}\u003c/code\u003e. The bridge replaces\n\u003ccode\u003e.post-content\u003c/code\u003e, updates render-specific styles, loads new feature scripts once,\nruns generated scripts, and dispatches \u003ccode\u003eview-transition-complete\u003c/code\u003e. It does not\nreplay \u003ccode\u003eDOMContentLoaded\u003c/code\u003e. The host can therefore keep shared preview stylesheets\nloaded between renders.\u003c/p\u003e\n\u003cp\u003eThe \u003ca href=\"https://github.com/WaylonWalker/markata/blob/main/examples/fastapi_editor.py\"\u003esingle-file editor example\u003c/a\u003e\ncontains CodeMirror and application behavior. Markata supplies its preview document,\nicons, appearance picker, and assets. Applications must explicitly enable\n\u003ccode\u003eunsafe=True\u003c/code\u003e to render authored HTML and style blocks.\u003c/p\u003e\n\u003ch2 id=\"installation-size-and-offline-icons\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInstallation size and offline icons\u003c/span\u003e \u003ca href=\"#installation-size-and-offline-icons\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe renderer retains the full pinned \u003ccode\u003elucide-static\u003c/code\u003e 1.48.0 catalog for offline icon shortcodes.\nThis provides consistent icon availability without downloads or a configurable subset.\nThe catalog contains 2,118 SVG files: 1,026,506 source bytes, or approximately 0.98 MiB.\nCompressing their concatenated bytes with gzip produces approximately 97 KiB.\nThese asset measurements do not measure the catalog\u0026rsquo;s exact contribution to a compiled binary or wheel.\nA stripped Linux amd64 CLI built with Go 1.26.3 measured approximately 66 MiB before wheel compression.\nThe complete CLI also contains themes, fonts, browser libraries, and build features.\nWheel sizes vary by operating system and architecture.\u003c/p\u003e\n\u003cp\u003eLucide\u0026rsquo;s ISC and derived Feather MIT notices remain embedded in the binary.\nWheels also provide readable notices in \u003ccode\u003emarkata-\u0026lt;version\u0026gt;.dist-info/licenses/lucide.txt\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAn installed POSIX binary with its executable bit preserved can render from read-only site-packages.\nRendering does not require permission changes in that installation.\nIf another installer removes the executable bit, reinstall the official wheel with executable permissions.\nThe permission-repair fallback needs permission to change the binary\u0026rsquo;s mode.\u003c/p\u003e\n\u003cp\u003eEach Python render call starts a subprocess. The measured benchmark post took approximately 137 ms through the Python API.\nFor frequent live edits, use the persistent Go workbench instead of starting a subprocess for every request.\nSee \u003ca href=\"/docs/guides/renderer-integration-benchmarks/\"\u003eintegration benchmarks\u003c/a\u003e for timing boundaries and reproduction commands.\u003c/p\u003e\n",
      "content_text": "\nInstall the official Go-based `markata` wheel containing this API (available with\nthe release that includes this feature):\n\n```bash\nuv add markata fastapi uvicorn\n```\n\nRender a complete response with conditional CSS and JavaScript inlined:\n\n```python\nfrom fastapi import FastAPI\nfrom fastapi.responses import HTMLResponse\nfrom markata import render_async\n\napp = FastAPI()\n\n@app.get(\"/\", response_class=HTMLResponse)\nasync def index():\n    result = await render_async(\"# Hello\\n\\n!!! note\\n    Rendered by Markata.\", inline_assets=True)\n    return HTMLResponse(result.document(title=\"My app\"))\n```\n\n`render()` offers the same options for synchronous applications. Both use the\nexisting Go Markdown renderer shipped inside the Python wheel. Each call launches\none process, so cache repeated content in your application. `render_async()` uses\nasync subprocess I/O, terminates the process on timeout or cancellation, and does\nnot block the ASGI event loop. `timeout` defaults to 30 seconds. Failures raise\n`markata.RenderError`.\n\n## Fragments and signals\n\n```python\nfrom markata import render\n\nresult = render(\"```go\\nfmt.Println(42)\\n```\", inline_assets=True)\nprint(result.html)              # Article markup\nprint(result.features)          # code, admonitions, roads, mermaid, chartjs, ...\nprint(result.head_html)         # Ordered style tags\nprint(result.feature_head_html) # Only styles specific to this fragment\nprint(result.body_end_html)     # Ordered scripts\n```\n\nIn an existing layout, insert `head_html` into the head, `html` inside an\n`\u003carticle class=\"post-content\"\u003e`, and `body_end_html` after the article. These\nstrings contain generated HTML; use the appropriate trusted-markup mechanism in\nyour template engine. `document(title=\"...\", lang=\"en\")` creates that layout for\nyou and escapes the title and language.\n\n`feature_head_html` returns only conditional styles, without the shared variables,\nmain, and component styles. The renderer returns core theme CSS plus only the optional assets the content\nrequires. Mermaid and Chart.js use Markata's vendored browser libraries; inline\nmode includes them too, without CDN requests. Inlining diagrams can make a\nresponse considerably larger. `external_urls` identifies any external browser\ndependencies; for the currently supported bundled features it is empty. Authored\nimages and links still refer to their authored URLs.\n\nCore theme CSS includes global styles. For an application with its own design,\nselect the assets you want from `result.assets` and supply compatible CSS variables\nand `.post-content` styling. This API does not configure a site's theme palette.\n\n## Serve assets separately\n\nThe default `inline_assets=False` emits links under `/markata-assets`, or your\n`asset_base`. Each asset is a dictionary containing `id`, `kind`, `placement`,\nand `content` (or `url` for external assets). Asset IDs are suitable for caching\nand deduplication; scripts must keep their manifest order.\n\nA small app can precompute its content and serve the bundled assets directly:\n\n```python\nfrom fastapi import FastAPI, HTTPException\nfrom fastapi.responses import HTMLResponse, Response\nfrom markata import render\n\napp = FastAPI()\npage = render(\"# Example\\n\\n```python\\nprint('hello')\\n```\", asset_base=\"/md-assets\")\nassets = {asset[\"id\"]: asset for asset in page.assets if \"content\" in asset}\n\n@app.get(\"/md-assets/{asset_id:path}\")\ndef asset(asset_id: str):\n    item = assets.get(asset_id)\n    if item is None:\n        raise HTTPException(status_code=404)\n    media_type = \"text/css\" if item[\"kind\"] == \"style\" else \"text/javascript\"\n    return Response(item[\"content\"], media_type=media_type)\n\n@app.get(\"/\", response_class=HTMLResponse)\ndef index():\n    return page.document(title=\"Example\")\n```\n\nFor multiple pages, combine their bundled assets by ID and retain each page's\nordered generated initialization scripts. Generated chart IDs are local to one\nrender result: render all Markdown for a document together. Do not deduplicate\ngenerated scripts across unrelated results. If browser content is replaced after\npage load, the application must execute its initialization scripts; simply\nassigning `innerHTML` does not execute them.\n\n## Scope and trusted content\n\nSupported: Markata's Markdown extensions, syntax highlighting, containers,\nadmonitions, Mermaid, Chart.js, roads, sortable tables, and opt-in checklists. Rendering does not run a site build;\nsite-dependent link resolution, embeds, image transforms, and other lifecycle\nplugins are outside this API.\n\nRaw authored HTML is disabled by default. Set `unsafe=True` only for trusted\ncontent. Rich Markdown output is **not an HTML sanitizer**; sanitize untrusted\ncontent using your application's policy. Inline styles and scripts also require\na compatible Content Security Policy. Applications with strict CSP should serve\nassets themselves and apply their own nonce/hash policy to initialization scripts.\n\n## CLI protocol\n\nThe Python API uses the same machine-readable interface available to other languages:\n\n```bash\nprintf '# Hello\\n' | markata render --json --inline-assets\n```\n\nWithout `--json`, `markata render` emits just the HTML fragment. `--unsafe` enables\nraw HTML; `--asset-base /static/markdown` changes linked bundled asset URLs. This\ncommand reads stdin without discovering a site configuration or writing files.\n\n## Reuse the site's appearance controls\n\nLoad the catalog once when the application starts:\n\n```python\nfrom markata import appearance, render_async\n\npresentation = appearance(asset_base=\"/markata-assets\")\nresult = await render_async(\"# Hello\", inline_assets=True)\nhtml = result.document(appearance=presentation, palette=\"ayu-dark\", mode=\"dark\")\n```\n\n`presentation.picker_html` contains the site's appearance controls. Insert\n`presentation.controls_head_html` in the host page's head and `presentation.body_end_html`\nafter its content. Serve `presentation.assets` through exact path lookup.\n`controls_head_html` omits site page-layout styles. Complete preview documents\nuse `head_html` internally. Each asset value is bytes. Use CSS, JavaScript, or WOFF2 response types as appropriate.\nThe asset base also applies to font URLs. No site build or filesystem writes occur.\n\nThe controls reuse the site's palette, aesthetic, font, size, and loading catalogs.\n`document()` now uses site article wrappers. Set `mode`, `palette`, `aesthetic`,\n`fontpack`, and `text_size` to select appearance. Unknown catalog values raise\n`ValueError`. Lucide shortcodes render through Markata's existing icon implementation.\n\nFor an isolated preview iframe, set `appearance_bridge=True`. The parent can send\n`{type: \"appearance\", attributes: {...}}` with `data-theme`, `data-palette`,\n`data-aesthetic`, `data-fontpack`, and `data-text-size` choices. The bridge accepts\nmessages from its parent and validates values against the catalogs. Keep the\niframe sandboxed with `allow-scripts` and without `allow-same-origin`.\n\nFor live edits, the parent can also send `{\"type\": \"markdown-render\", \"html\":\n\"...\", \"feature_head_html\": \"...\", \"body_end_html\": \"...\"}`. The bridge replaces\n`.post-content`, updates render-specific styles, loads new feature scripts once,\nruns generated scripts, and dispatches `view-transition-complete`. It does not\nreplay `DOMContentLoaded`. The host can therefore keep shared preview stylesheets\nloaded between renders.\n\nThe [single-file editor example](https://github.com/WaylonWalker/markata/blob/main/examples/fastapi_editor.py)\ncontains CodeMirror and application behavior. Markata supplies its preview document,\nicons, appearance picker, and assets. Applications must explicitly enable\n`unsafe=True` to render authored HTML and style blocks.\n\n## Installation size and offline icons\n\nThe renderer retains the full pinned `lucide-static` 1.48.0 catalog for offline icon shortcodes.\nThis provides consistent icon availability without downloads or a configurable subset.\nThe catalog contains 2,118 SVG files: 1,026,506 source bytes, or approximately 0.98 MiB.\nCompressing their concatenated bytes with gzip produces approximately 97 KiB.\nThese asset measurements do not measure the catalog's exact contribution to a compiled binary or wheel.\nA stripped Linux amd64 CLI built with Go 1.26.3 measured approximately 66 MiB before wheel compression.\nThe complete CLI also contains themes, fonts, browser libraries, and build features.\nWheel sizes vary by operating system and architecture.\n\nLucide's ISC and derived Feather MIT notices remain embedded in the binary.\nWheels also provide readable notices in `markata-\u003cversion\u003e.dist-info/licenses/lucide.txt`.\n\nAn installed POSIX binary with its executable bit preserved can render from read-only site-packages.\nRendering does not require permission changes in that installation.\nIf another installer removes the executable bit, reinstall the official wheel with executable permissions.\nThe permission-repair fallback needs permission to change the binary's mode.\n\nEach Python render call starts a subprocess. The measured benchmark post took approximately 137 ms through the Python API.\nFor frequent live edits, use the persistent Go workbench instead of starting a subprocess for every request.\nSee [integration benchmarks](/docs/guides/renderer-integration-benchmarks/) for timing boundaries and reproduction commands.\n",
      "summary": "Use Markata's renderer with feature signals and bundled CSS and JavaScript",
      "date_published": "2026-10-27T00:00:00Z",
      "date_modified": "2026-10-27T00:00:00Z",
      "tags": [
        "documentation",
        "python",
        "markdown"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/go-module-cutover/",
      "url": "https://markata.dev/docs/guides/go-module-cutover/",
      "title": "Go module import path cutover",
      "content_html": "\u003cp\u003eThe canonical Go source module for \u003cstrong\u003eMarkata\u003c/strong\u003e (still on the 0.x line) is\n\u003ccode\u003egithub.com/WaylonWalker/markata\u003c/code\u003e, following the October 18, 2026\nGitHub repository swap. It is independent of the original Python module,\nwhich now lives at \u003ca href=\"https://github.com/WaylonWalker/markata-py\"\u003eWaylonWalker/markata-py\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"existing-users\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExisting users\u003c/span\u003e \u003ca href=\"#existing-users\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eUsing the CLI or builder containers:\u003c/strong\u003e you can keep the\n\u003ccode\u003emarkata-go\u003c/code\u003e binary alias, \u003ccode\u003emarkata-go.toml\u003c/code\u003e, \u003ccode\u003e[markata-go]\u003c/code\u003e,\n\u003ccode\u003eMARKATA_GO_*\u003c/code\u003e and legacy GHCR names for now. See the\n\u003ca href=\"name-migration.md\"\u003enaming migration guide\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eImporting Go packages:\u003c/strong\u003e replace imports starting with\n\u003ccode\u003egithub.com/WaylonWalker/markata-go/\u003c/code\u003e with\n\u003ccode\u003egithub.com/WaylonWalker/markata/\u003c/code\u003e, and run \u003ccode\u003ego mod tidy\u003c/code\u003e.\nThe Go module\u0026rsquo;s own declaration has changed as well.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePinned historical Go consumers:\u003c/strong\u003e existing historical tags for\n\u003ccode\u003egithub.com/WaylonWalker/markata-go\u003c/code\u003e have not been deleted.\nAvoid depending on both the historical and new module paths in the\nsame dependency graph; they describe the same source with different\nmodule identities and may result in duplicate packages.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePython users:\u003c/strong\u003e historical pinned Python releases remain available on PyPI, but\ncurrent PyPI releases install the Go CLI after a version break. A\nGo CLI install must not silently overwrite an existing Python\n\u003ccode\u003emarkata\u003c/code\u003e executable.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"canonical-source-install\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCanonical source install\u003c/span\u003e \u003ca href=\"#canonical-source-install\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego install github.com/WaylonWalker/markata/cmd/markata@main\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Legacy Go executable remains available from the canonical module:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego install github.com/WaylonWalker/markata/cmd/markata-go@main\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor reproducible installations, pin an already published, verified release\ntag rather than \u003ccode\u003e@main\u003c/code\u003e when that tag supports your command and module path.\nThe name migration does \u003cstrong\u003enot\u003c/strong\u003e authorize any new release, prerelease or tag.\nValidate Go imports, installer compatibility, builder images, Argo CD sources\nand representative site builds independently while remaining on 0.x.\u003c/p\u003e\n\u003ch2 id=\"change-control\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChange control\u003c/span\u003e \u003ca href=\"#change-control\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe module path migration changed only tracked Go files, \u003ccode\u003ego.mod\u003c/code\u003e,\nand GoReleaser\u0026rsquo;s linker symbol package paths. The deterministic rewrite\nscript lives at \u003ccode\u003escripts/migrate-go-module-path.py\u003c/code\u003e; the dedicated\nPR workflow fails if any old module import remains.\u003c/p\u003e\n\u003cp\u003eThese are \u003cstrong\u003enot\u003c/strong\u003e reasons to rename Kubernetes PVCs, releases, secrets,\nHelm chart names, historical Docker tags, old Go binaries, or Python\nPyPI distributions.\u003c/p\u003e\n",
      "content_text": "\n\nThe canonical Go source module for **Markata** (still on the 0.x line) is\n`github.com/WaylonWalker/markata`, following the October 18, 2026\nGitHub repository swap. It is independent of the original Python module,\nwhich now lives at [WaylonWalker/markata-py](https://github.com/WaylonWalker/markata-py).\n\n## Existing users\n\n- **Using the CLI or builder containers:** you can keep the\n  `markata-go` binary alias, `markata-go.toml`, `[markata-go]`,\n  `MARKATA_GO_*` and legacy GHCR names for now. See the\n  [naming migration guide](name-migration.md).\n- **Importing Go packages:** replace imports starting with\n  `github.com/WaylonWalker/markata-go/` with\n  `github.com/WaylonWalker/markata/`, and run `go mod tidy`.\n  The Go module's own declaration has changed as well.\n- **Pinned historical Go consumers:** existing historical tags for\n  `github.com/WaylonWalker/markata-go` have not been deleted.\n  Avoid depending on both the historical and new module paths in the\n  same dependency graph; they describe the same source with different\n  module identities and may result in duplicate packages.\n- **Python users:** historical pinned Python releases remain available on PyPI, but\n  current PyPI releases install the Go CLI after a version break. A\n  Go CLI install must not silently overwrite an existing Python\n  `markata` executable.\n\n## Canonical source install\n\n```bash\ngo install github.com/WaylonWalker/markata/cmd/markata@main\n\n# Legacy Go executable remains available from the canonical module:\ngo install github.com/WaylonWalker/markata/cmd/markata-go@main\n```\n\nFor reproducible installations, pin an already published, verified release\ntag rather than `@main` when that tag supports your command and module path.\nThe name migration does **not** authorize any new release, prerelease or tag.\nValidate Go imports, installer compatibility, builder images, Argo CD sources\nand representative site builds independently while remaining on 0.x.\n\n## Change control\n\nThe module path migration changed only tracked Go files, `go.mod`,\nand GoReleaser's linker symbol package paths. The deterministic rewrite\nscript lives at `scripts/migrate-go-module-path.py`; the dedicated\nPR workflow fails if any old module import remains.\n\nThese are **not** reasons to rename Kubernetes PVCs, releases, secrets,\nHelm chart names, historical Docker tags, old Go binaries, or Python\nPyPI distributions.\n",
      "summary": "The canonical Go source module for Markata (still on the 0.x line) is",
      "date_published": "2026-10-27T00:00:00Z",
      "date_modified": "2026-10-27T00:00:00Z",
      "tags": [
        "documentation"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/markdown-chart-fallback/",
      "url": "https://markata.dev/docs/guides/markdown-chart-fallback/",
      "title": "Accessible Chart.js figures and fallbacks",
      "content_html": "\u003cp\u003e\u003ccode\u003echartjs\u003c/code\u003e fenced blocks render a standard HTML \u003cstrong\u003edata table at build time\u003c/strong\u003e.\nThey retain a JavaScript-free representation even if the Chart.js CDN is\nunavailable, the reader disables JavaScript, or interactive rendering fails.\u003c/p\u003e\n\u003cp\u003eThe theme adds a Chart.js canvas alongside an expanded \u003cstrong\u003eChart data\u003c/strong\u003e disclosure.\nFor charts using the options below, successful Chart.js initialization collapses\nthe disclosure, which remains available for exact values or screen-reader users.\nIf the library fails to load, the table keeps its configured state.\u003c/p\u003e\n\u003ch2 id=\"example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample\u003c/span\u003e \u003ca href=\"#example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"chartjs-container\"\u003e\n  \u003ccanvas id=\"chartjs-1\" hidden role=\"img\" aria-label=\"Chart visualization; expand Chart data for exact values\"\u003e\u003c/canvas\u003e\n  \u003cdiv id=\"chartjs-1-data\"\u003e\u003cdetails class=\"chartjs-data\" open\u003e\u003csummary\u003eChart data\u003c/summary\u003e\u003ctable\u003e\u003ccaption\u003eChart data\u003c/caption\u003e\u003cthead\u003e\u003ctr\u003e\u003cth scope=\"col\"\u003eLabel\u003c/th\u003e\u003cth scope=\"col\"\u003eBuild seconds\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eFull\u003c/th\u003e\u003ctd\u003e46\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eIncremental\u003c/th\u003e\u003ctd\u003e21\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/details\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cp\u003eThe renderer emits semantic table headers and cells without a second chart\nlibrary or a network request. For unusual configurations such as scatter\ncharts with object-valued \u003ccode\u003ex\u003c/code\u003e/\u003ccode\u003ey\u003c/code\u003e entries, the original JSON remains\navailable in a \u003cstrong\u003eChart configuration\u003c/strong\u003e disclosure instead of fabricating\ntabular labels. Huge tables (more than 200 labels or 12 datasets) also fall\nback to the original configuration to bound generated HTML.\u003c/p\u003e\n\u003cp\u003eChart data is treated as untrusted Markdown input: HTML labels are escaped\nand chart JSON is safely encoded before inclusion in an inline script.\u003c/p\u003e\n\u003ch2 id=\"titles-captions-and-compact-figures\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTitles, captions, and compact figures\u003c/span\u003e \u003ca href=\"#titles-captions-and-compact-figures\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd plain-text \u003ccode\u003etitle\u003c/code\u003e and/or \u003ccode\u003ecaption\u003c/code\u003e keys at the top level of the chart JSON:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```chartjs\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;title\u0026#34;: \u0026#34;Build time\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;caption\u0026#34;: \u0026#34;Seconds per build; lower is better.\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;data_display\u0026#34;: \u0026#34;collapsed\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;type\u0026#34;: \u0026#34;bar\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;data\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;labels\u0026#34;: [\u0026#34;Full\u0026#34;, \u0026#34;Incremental\u0026#34;],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;datasets\u0026#34;: [{\u0026#34;label\u0026#34;: \u0026#34;Seconds\u0026#34;, \u0026#34;data\u0026#34;: [46, 21]}]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  },\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;options\u0026#34;: {\u0026#34;indexAxis\u0026#34;: \u0026#34;y\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe built-in theme renders a responsive surface card with a left-aligned,\nnon-italic figcaption. Its title is \u003cstrong\u003enot a heading\u003c/strong\u003e, so it does not enter the\nTOC. The canvas is labelled by the title and references the figcaption.\nShort horizontal bar figures (up to four labels) use a compact canvas, capped at\n130px; other figures retain normal Chart.js sizing. You do not need page CSS or\nJavaScript. Neither title nor caption interprets HTML or Markdown.\u003c/p\u003e\n\u003cp\u003eThese authoring keys are stripped before Chart.js receives the JSON. We use JSON\nmetadata rather than fence attributes because the Markdown renderer retains\nthe language but not arbitrary fence-info options (the legacy CSV HTML matcher\nis not a reliable authoring path for this). Chart.js\u0026rsquo;s own chart title remains\navailable separately under \u003ccode\u003eoptions.plugins.title\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"initial-data-disclosure-state\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInitial data disclosure state\u003c/span\u003e \u003ca href=\"#initial-data-disclosure-state\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003echartjs\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edata_display\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;open\u0026#34;\u003c/span\u003e \u003cspan class=\"c\"\u003e# default; or \u0026#34;collapsed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSet top-level \u003ccode\u003e\u0026quot;data_display\u0026quot;: \u0026quot;open\u0026quot;\u003c/code\u003e or \u003ccode\u003e\u0026quot;data_display\u0026quot;: \u0026quot;collapsed\u0026quot;\u003c/code\u003e in an\nindividual chart to override the site default, with or without a figure.\nCollapsed details still have a visible, keyboard-operable summary without JS.\nSuccessful rendering of an opted-in chart collapses the disclosure regardless\nof its initial state; a loading/rendering error leaves that state intact.\nInvalid values produce a configuration error (site setting) or a visible chart\nerror (per chart).\nWith no new options, existing chart markup and the default-open fallback remain\nunchanged.\u003c/p\u003e\n\u003cp\u003eLegacy charts without these options also retain their original initialization\nscript: it attempts to collapse the wrapper div rather than the disclosure,\nso their data stays open. Add a title, caption, or per-chart \u003ccode\u003edata_display\u003c/code\u003e (or\nset the site\u0026rsquo;s \u003ccode\u003edata_display\u003c/code\u003e to \u003ccode\u003e\u0026quot;collapsed\u0026quot;\u003c/code\u003e) to opt into corrected behavior.\u003c/p\u003e\n\u003ch2 id=\"behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBehavior\u003c/span\u003e \u003ca href=\"#behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eNo-JavaScript: canvas is hidden; table or configuration is reachable in details\n(expanded by default).\u003c/li\u003e\n\u003cli\u003eJavaScript working: canvas becomes visible; opted-in charts collapse the data\ndisclosure, which can always be reopened.\u003c/li\u003e\n\u003cli\u003eChart.js loading or rendering error: canvas remains hidden; fallback remains\nreachable in its configured initial state.\u003c/li\u003e\n\u003cli\u003eMultiple charts per post: each chart has its own fallback.\u003c/li\u003e\n\u003cli\u003ePages without \u003ccode\u003echartjs\u003c/code\u003e blocks are unchanged.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThis is an accessibility and progressive-enhancement improvement to the\nexisting Chart.js plugin. It is \u003cstrong\u003enot\u003c/strong\u003e a new chart data format, SVG exporter,\nor automatic visual data verification.\u003c/p\u003e\n\u003ch2 id=\"horizontal-bar-defaults\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHorizontal bar defaults\u003c/span\u003e \u003ca href=\"#horizontal-bar-defaults\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA horizontal bar chart with one dataset and up to five labels uses thin, rounded bars and a compact aspect ratio by default. Set bar geometry such as \u003ccode\u003ebarThickness\u003c/code\u003e or \u003ccode\u003eborderRadius\u003c/code\u003e in the dataset, \u003ccode\u003eoptions\u003c/code\u003e, \u003ccode\u003eoptions.datasets.bar\u003c/code\u003e, or \u003ccode\u003eoptions.elements.bar\u003c/code\u003e to use your own geometry. Set \u003ccode\u003eoptions.aspectRatio\u003c/code\u003e or \u003ccode\u003eoptions.maintainAspectRatio\u003c/code\u003e to control chart sizing. Charts with multiple datasets or more than five labels keep Chart.js defaults.\u003c/p\u003e\n\u003cp\u003eDataset \u003ccode\u003eindexAxis\u003c/code\u003e overrides \u003ccode\u003eoptions.datasets.bar.indexAxis\u003c/code\u003e, which overrides \u003ccode\u003eoptions.indexAxis\u003c/code\u003e. Compact defaults apply only to the resulting horizontal orientation.\u003c/p\u003e\n\u003cp\u003eDefault bars have a maximum thickness of 14 pixels. They shrink on narrow screens to prevent overlap.\u003c/p\u003e\n\n\u003cscript src=\"/assets/vendor/chartjs/chart.min.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n(function() {\nconst initCharts = function() {\n  (function() {\n    const ctx = document.getElementById('chartjs-1');\n    if (!ctx || typeof Chart !== 'function') return;\n    ctx.hidden = false;\n    try {\n      new Chart(ctx, {\"data\":{\"datasets\":[{\"data\":[46,21],\"label\":\"Build seconds\"}],\"labels\":[\"Full\",\"Incremental\"]},\"type\":\"bar\"});\n      const data = document.getElementById('chartjs-1-data');\n      if (data) data.open = false;\n    } catch (error) {\n      ctx.hidden = true;\n    }\n  })();\n};\nif (document.readyState === 'loading') {\n  document.addEventListener('DOMContentLoaded', initCharts, {once: true});\n} else {\n  initCharts();\n}\n})();\n\u003c/script\u003e",
      "content_text": "\n\n`chartjs` fenced blocks render a standard HTML **data table at build time**.\nThey retain a JavaScript-free representation even if the Chart.js CDN is\nunavailable, the reader disables JavaScript, or interactive rendering fails.\n\nThe theme adds a Chart.js canvas alongside an expanded **Chart data** disclosure.\nFor charts using the options below, successful Chart.js initialization collapses\nthe disclosure, which remains available for exact values or screen-reader users.\nIf the library fails to load, the table keeps its configured state.\n\n## Example\n\n````chartjs\n{\n  \"type\": \"bar\",\n  \"data\": {\n    \"labels\": [\"Full\", \"Incremental\"],\n    \"datasets\": [{\"label\": \"Build seconds\", \"data\": [46, 21]}]\n  }\n}\n````\n\nThe renderer emits semantic table headers and cells without a second chart\nlibrary or a network request. For unusual configurations such as scatter\ncharts with object-valued `x`/`y` entries, the original JSON remains\navailable in a **Chart configuration** disclosure instead of fabricating\ntabular labels. Huge tables (more than 200 labels or 12 datasets) also fall\nback to the original configuration to bound generated HTML.\n\nChart data is treated as untrusted Markdown input: HTML labels are escaped\nand chart JSON is safely encoded before inclusion in an inline script.\n\n## Titles, captions, and compact figures\n\nAdd plain-text `title` and/or `caption` keys at the top level of the chart JSON:\n\n````markdown\n```chartjs\n{\n  \"title\": \"Build time\",\n  \"caption\": \"Seconds per build; lower is better.\",\n  \"data_display\": \"collapsed\",\n  \"type\": \"bar\",\n  \"data\": {\n    \"labels\": [\"Full\", \"Incremental\"],\n    \"datasets\": [{\"label\": \"Seconds\", \"data\": [46, 21]}]\n  },\n  \"options\": {\"indexAxis\": \"y\"}\n}\n```\n````\n\nThe built-in theme renders a responsive surface card with a left-aligned,\nnon-italic figcaption. Its title is **not a heading**, so it does not enter the\nTOC. The canvas is labelled by the title and references the figcaption.\nShort horizontal bar figures (up to four labels) use a compact canvas, capped at\n130px; other figures retain normal Chart.js sizing. You do not need page CSS or\nJavaScript. Neither title nor caption interprets HTML or Markdown.\n\nThese authoring keys are stripped before Chart.js receives the JSON. We use JSON\nmetadata rather than fence attributes because the Markdown renderer retains\nthe language but not arbitrary fence-info options (the legacy CSV HTML matcher\nis not a reliable authoring path for this). Chart.js's own chart title remains\navailable separately under `options.plugins.title`.\n\n## Initial data disclosure state\n\n```toml\n[markata-go.chartjs]\ndata_display = \"open\" # default; or \"collapsed\"\n```\n\nSet top-level `\"data_display\": \"open\"` or `\"data_display\": \"collapsed\"` in an\nindividual chart to override the site default, with or without a figure.\nCollapsed details still have a visible, keyboard-operable summary without JS.\nSuccessful rendering of an opted-in chart collapses the disclosure regardless\nof its initial state; a loading/rendering error leaves that state intact.\nInvalid values produce a configuration error (site setting) or a visible chart\nerror (per chart).\nWith no new options, existing chart markup and the default-open fallback remain\nunchanged.\n\nLegacy charts without these options also retain their original initialization\nscript: it attempts to collapse the wrapper div rather than the disclosure,\nso their data stays open. Add a title, caption, or per-chart `data_display` (or\nset the site's `data_display` to `\"collapsed\"`) to opt into corrected behavior.\n\n## Behavior\n\n- No-JavaScript: canvas is hidden; table or configuration is reachable in details\n  (expanded by default).\n- JavaScript working: canvas becomes visible; opted-in charts collapse the data\n  disclosure, which can always be reopened.\n- Chart.js loading or rendering error: canvas remains hidden; fallback remains\n  reachable in its configured initial state.\n- Multiple charts per post: each chart has its own fallback.\n- Pages without `chartjs` blocks are unchanged.\n\nThis is an accessibility and progressive-enhancement improvement to the\nexisting Chart.js plugin. It is **not** a new chart data format, SVG exporter,\nor automatic visual data verification.\n\n## Horizontal bar defaults\n\nA horizontal bar chart with one dataset and up to five labels uses thin, rounded bars and a compact aspect ratio by default. Set bar geometry such as `barThickness` or `borderRadius` in the dataset, `options`, `options.datasets.bar`, or `options.elements.bar` to use your own geometry. Set `options.aspectRatio` or `options.maintainAspectRatio` to control chart sizing. Charts with multiple datasets or more than five labels keep Chart.js defaults.\n\nDataset `indexAxis` overrides `options.datasets.bar.indexAxis`, which overrides `options.indexAxis`. Compact defaults apply only to the resulting horizontal orientation.\n\nDefault bars have a maximum thickness of 14 pixels. They shrink on narrow screens to prevent overlap.\n",
      "summary": "Add titles, captions, and JavaScript-free data to charts",
      "date_published": "2026-10-26T00:00:00Z",
      "date_modified": "2026-10-26T00:00:00Z"
    },
    {
      "id": "https://markata.dev/docs/architecture/url-mentions-integration/",
      "url": "https://markata.dev/docs/architecture/url-mentions-integration/",
      "title": "URL mentions provider integration (initial foundation)",
      "content_html": "\u003cp\u003eThe \u003ccode\u003epkg/urlmentions\u003c/code\u003e package consumes version 1.0 of the public URL mentions protocol.\u003c/p\u003e\n\u003cp\u003eProvider indexes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://listen.waylonwalker.com/.well-known/url-mentions.json\"\u003ehttps://listen.waylonwalker.com/.well-known/url-mentions.json\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://brainrot.waylonwalker.com/.well-known/url-mentions.json\"\u003ehttps://brainrot.waylonwalker.com/.well-known/url-mentions.json\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ccode\u003eurlmentions.Client.Fetch(ctx, endpoint)\u003c/code\u003e retrieves all pages and returns a map\nfrom provider-supplied \u003ccode\u003ereferences[].normalized_url\u003c/code\u003e to source entries.\nIt bounds response sizes and page counts, rejects non-HTTPS starting URLs,\nand disallows cross-origin pagination. The caller should use an HTTP client\nwith redirects restricted to the same origin and enforce a build-time budget.\u003c/p\u003e\n\u003cp\u003eThis is \u003cstrong\u003ephase one only\u003c/strong\u003e. The package is not registered as a build plugin,\ndoes not fetch either provider automatically, and does not render UI yet.\nFollow-up work: align canonical URL normalization with the provider protocol;\ncache provider pages/ETags; configure providers; map post canonical, external\ntarget, and reader URLs; SSR accessible favicon badges with no-JS fallbacks;\ngraceful offline builds and snapshot tests.\u003c/p\u003e\n\u003cp\u003eDo not treat this PR as production feature-complete.\u003c/p\u003e\n",
      "content_text": "\n\nThe `pkg/urlmentions` package consumes version 1.0 of the public URL mentions protocol.\n\nProvider indexes:\n- https://listen.waylonwalker.com/.well-known/url-mentions.json\n- https://brainrot.waylonwalker.com/.well-known/url-mentions.json\n\n`urlmentions.Client.Fetch(ctx, endpoint)` retrieves all pages and returns a map\nfrom provider-supplied `references[].normalized_url` to source entries.\nIt bounds response sizes and page counts, rejects non-HTTPS starting URLs,\nand disallows cross-origin pagination. The caller should use an HTTP client\nwith redirects restricted to the same origin and enforce a build-time budget.\n\nThis is **phase one only**. The package is not registered as a build plugin,\ndoes not fetch either provider automatically, and does not render UI yet.\nFollow-up work: align canonical URL normalization with the provider protocol;\ncache provider pages/ETags; configure providers; map post canonical, external\ntarget, and reader URLs; SSR accessible favicon badges with no-JS fallbacks;\ngraceful offline builds and snapshot tests.\n\nDo not treat this PR as production feature-complete.\n",
      "summary": "The pkg/urlmentions package consumes version 1.0 of the public URL mentions protocol.",
      "date_published": "2026-10-22T00:00:00Z",
      "date_modified": "2026-10-22T00:00:00Z",
      "tags": [
        "documentation"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/markdown-source-disclosure/",
      "url": "https://markata.dev/docs/guides/markdown-source-disclosure/",
      "title": "Markdown example preview and source",
      "content_html": "\u003cp\u003eA source disclosure can follow any rendered Markdown example. Markata renders\nthis as native HTML \u003ccode\u003e\u0026lt;details\u0026gt;\u003c/code\u003e, so it supports mouse, keyboard, and\nscreen readers \u003cstrong\u003ewithout JavaScript\u003c/strong\u003e. No new JS bundle is necessary.\u003c/p\u003e\n\u003cp\u003eThe source is explicitly authored: this feature does not automatically\nduplicate Markdown, execute snippets, or copy untrusted HTML into the page.\u003c/p\u003e\n\u003ch2 id=\"basic-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic example\u003c/span\u003e \u003ca href=\"#basic-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: md-layout\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-card\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Preview\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis is \u003cspan class=\"gs\"\u003e**bold**\u003c/span\u003e and this is \u003cspan class=\"sb\"\u003e`inline code`\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-source {data-label=\u0026#34;See how it is written\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```markdown\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Preview\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis is \u003cspan class=\"gs\"\u003e**bold**\u003c/span\u003e and this is \u003cspan class=\"sb\"\u003e`inline code`\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse a longer backtick fence (four backticks or more) around an example\ncontaining nested triple-backtick code fences, as in other Markdown guides.\u003c/p\u003e\n\u003cp\u003eThe label is optional and defaults to \u003cstrong\u003eShow Markdown source\u003c/strong\u003e. Any authored\nlabel is escaped before being inserted in the disclosure summary.\u003c/p\u003e\n\u003ch2 id=\"output-and-compatibility\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOutput and compatibility\u003c/span\u003e \u003ca href=\"#output-and-compatibility\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eStatic semantic HTML only; no JavaScript is required to open the source.\u003c/li\u003e\n\u003cli\u003eSource code uses the existing fenced-code highlighter and copy controls\nwhen those optional enhancements are present.\u003c/li\u003e\n\u003cli\u003eSource text is explicitly duplicated by the author, not extracted\nautomatically from the preview. This helps avoid hidden dynamically\ngenerated markup and makes it easy to inspect what a post actually teaches.\u003c/li\u003e\n\u003cli\u003eThe source disclosure is marked \u003ccode\u003edata-markata-ui=\u0026quot;source-preview\u0026quot;\u003c/code\u003e\nso the rich post-copy command can omit its UI and avoid duplication there.\u003c/li\u003e\n\u003cli\u003eSearch indexes and ordinary feed readers may still include explicitly\nauthored source content; use this for deliberate educational examples,\nnot every sentence of an article.\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nA source disclosure can follow any rendered Markdown example. Markata renders\nthis as native HTML `\u003cdetails\u003e`, so it supports mouse, keyboard, and\nscreen readers **without JavaScript**. No new JS bundle is necessary.\n\nThe source is explicitly authored: this feature does not automatically\nduplicate Markdown, execute snippets, or copy untrusted HTML into the page.\n\n## Basic example\n\n````markdown\n::: md-layout\n\n:::: md-card\n### Preview\n\nThis is **bold** and this is `inline code`.\n\n::::\n\n:::: md-source {data-label=\"See how it is written\"}\n\n```markdown\n### Preview\n\nThis is **bold** and this is `inline code`.\n```\n\n::::\n\n:::\n````\n\nUse a longer backtick fence (four backticks or more) around an example\ncontaining nested triple-backtick code fences, as in other Markdown guides.\n\nThe label is optional and defaults to **Show Markdown source**. Any authored\nlabel is escaped before being inserted in the disclosure summary.\n\n## Output and compatibility\n\n- Static semantic HTML only; no JavaScript is required to open the source.\n- Source code uses the existing fenced-code highlighter and copy controls\n  when those optional enhancements are present.\n- Source text is explicitly duplicated by the author, not extracted\n  automatically from the preview. This helps avoid hidden dynamically\n  generated markup and makes it easy to inspect what a post actually teaches.\n- The source disclosure is marked `data-markata-ui=\"source-preview\"`\n  so the rich post-copy command can omit its UI and avoid duplication there.\n- Search indexes and ordinary feed readers may still include explicitly\n  authored source content; use this for deliberate educational examples,\n  not every sentence of an article.\n",
      "summary": "A source disclosure can follow any rendered Markdown example. Markata renders",
      "date_published": "2026-10-21T00:00:00Z",
      "date_modified": "2026-10-21T00:00:00Z",
      "tags": [
        "documentation"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/markdown-checklists/",
      "url": "https://markata.dev/docs/guides/markdown-checklists/",
      "title": "Interactive Markdown checklists",
      "content_html": "\u003cp\u003eOrdinary GFM task lists in Markata remain static, disabled, readable checkboxes.\nTo let a reader check off tasks, wrap one or more task lists with the\n\u003ccode\u003emd-checklist\u003c/code\u003e container:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: md-checklist {data-id=\u0026#34;deployment\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e- [x]\u003c/span\u003e Back up the configuration\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e- [ ]\u003c/span\u003e Run the build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e- [ ]\u003c/span\u003e Verify the live site\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe built HTML remains ordinary semantic Markdown list items with disabled\ncheckboxes. On pages containing an \u003ccode\u003emd-checklist\u003c/code\u003e, Markata conditionally\nloads a small JavaScript enhancer that enables just those checkboxes. There is\nno global checklist runtime or JavaScript requirement for ordinary task lists.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003edata-id\u003c/code\u003e is optional. Supply a \u003cstrong\u003estable and unique ID per list in a page\u003c/strong\u003e\nto save progress in the browser\u0026rsquo;s local storage under that page\u0026rsquo;s pathname.\nWithout \u003ccode\u003edata-id\u003c/code\u003e, the list is interactive in the current session but does\nnot persist. If storage is unavailable, checking tasks still works and\nnothing is uploaded to a server.\u003c/p\u003e\n\u003cp\u003eThe task labels and original check states remain in the published Markdown.\nLocal progress does not rewrite the site, user account, feeds or shared copy.\nThe browser\u0026rsquo;s native checkbox provides keyboard and screen-reader support;\nlist text is attached to each checkbox as an accessible label.\u003c/p\u003e\n\u003ch2 id=\"graceful-fallbacks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGraceful fallbacks\u003c/span\u003e \u003ca href=\"#graceful-fallbacks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eJavaScript disabled or blocked: boxes stay disabled and the list is readable.\u003c/li\u003e\n\u003cli\u003eJavaScript enabled: only \u003ccode\u003emd-checklist\u003c/code\u003e containers become interactive.\u003c/li\u003e\n\u003cli\u003ePartial-page navigation: newly loaded checklists initialize once.\u003c/li\u003e\n\u003cli\u003eContent changes: if the count of tasks changes, outdated saved state is\nignored rather than applied to the wrong items.\u003c/li\u003e\n\u003cli\u003ePrivacy: only a boolean completion array is stored locally; no task text\nis persisted and no network request is made.\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nOrdinary GFM task lists in Markata remain static, disabled, readable checkboxes.\nTo let a reader check off tasks, wrap one or more task lists with the\n`md-checklist` container:\n\n````markdown\n::: md-checklist {data-id=\"deployment\"}\n\n- [x] Back up the configuration\n- [ ] Run the build\n- [ ] Verify the live site\n\n:::\n````\n\nThe built HTML remains ordinary semantic Markdown list items with disabled\ncheckboxes. On pages containing an `md-checklist`, Markata conditionally\nloads a small JavaScript enhancer that enables just those checkboxes. There is\nno global checklist runtime or JavaScript requirement for ordinary task lists.\n\n`data-id` is optional. Supply a **stable and unique ID per list in a page**\nto save progress in the browser's local storage under that page's pathname.\nWithout `data-id`, the list is interactive in the current session but does\nnot persist. If storage is unavailable, checking tasks still works and\nnothing is uploaded to a server.\n\nThe task labels and original check states remain in the published Markdown.\nLocal progress does not rewrite the site, user account, feeds or shared copy.\nThe browser's native checkbox provides keyboard and screen-reader support;\nlist text is attached to each checkbox as an accessible label.\n\n## Graceful fallbacks\n\n- JavaScript disabled or blocked: boxes stay disabled and the list is readable.\n- JavaScript enabled: only `md-checklist` containers become interactive.\n- Partial-page navigation: newly loaded checklists initialize once.\n- Content changes: if the count of tasks changes, outdated saved state is\n  ignored rather than applied to the wrong items.\n- Privacy: only a boolean completion array is stored locally; no task text\n  is persisted and no network request is made.\n",
      "summary": "Ordinary GFM task lists in Markata remain static, disabled, readable checkboxes.",
      "date_published": "2026-10-21T00:00:00Z",
      "date_modified": "2026-10-21T00:00:00Z",
      "tags": [
        "documentation"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/roads/",
      "url": "https://markata.dev/docs/guides/roads/",
      "title": "Roads",
      "content_html": "\u003cp\u003eA road is a path that draws itself as the reader scrolls. Each milestone on the\npath is a link from your post. Use roads for roadmaps, release histories,\nonboarding paths, project timelines, or any sequence that readers walk through.\u003c/p\u003e\n\u003cp\u003eRoads are built in to the default theme. You need no template, config, or\nplugin. Write a \u003ca href=\"/docs/guides/markdown-containers/\"\u003eMarkdown container\u003c/a\u003e named\n\u003ccode\u003eroad\u003c/code\u003e, and put a list of links inside it.\u003c/p\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: road\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eInstall markata-go\u003c/span\u003e](\u003cspan class=\"na\"\u003e/docs/getting-started/\u003c/span\u003e) Step one\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eConfigure your site\u003c/span\u003e](\u003cspan class=\"na\"\u003e/docs/guides/configuration/\u003c/span\u003e) Step two\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003ePick a theme\u003c/span\u003e](\u003cspan class=\"na\"\u003e/docs/guides/themes/\u003c/span\u003e) Step three\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003ePublish feeds\u003c/span\u003e](\u003cspan class=\"na\"\u003e/docs/guides/feeds/\u003c/span\u003e) Step four\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThat renders as:\u003c/p\u003e\n\u003cdiv class=\"road\"\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/getting-started/\"\u003eInstall markata-go\u003c/a\u003e Step one\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfigure your site\u003c/a\u003e Step two\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/themes/\"\u003ePick a theme\u003c/a\u003e Step three\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/feeds/\"\u003ePublish feeds\u003c/a\u003e Step four\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/div\u003e\n\u003cp\u003eEach list item is one milestone:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eThe link\u003c/strong\u003e is the milestone title, and clicking it opens the page.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eThe text after the link\u003c/strong\u003e is a small label, such as a date or step number.\nIt is also shown in the hover card.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWikilinks work too. A milestone written as \u003ccode\u003e[[my-post]]\u003c/code\u003e uses that post\u0026rsquo;s\ntitle, and its hover card shows the post\u0026rsquo;s description.\u003c/p\u003e\n\u003ch2 id=\"set-fixed-progress\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSet fixed progress\u003c/span\u003e \u003ca href=\"#set-fixed-progress\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse fixed progress for a roadmap whose completion does not depend on scrolling.\nThe normal scroll-driven progress remains the default.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: road timeline {data-road-progress-mode=\u0026#34;static\u0026#34; data-road-progress=\u0026#34;65\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eDesign\u003c/span\u003e](\u003cspan class=\"na\"\u003e/design/\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eBuild\u003c/span\u003e](\u003cspan class=\"na\"\u003e/build/\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eRelease\u003c/span\u003e](\u003cspan class=\"na\"\u003e/release/\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: road steps {data-road-progress-mode=\u0026#34;milestones\u0026#34; data-road-current=\u0026#34;2\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eDesign\u003c/span\u003e](\u003cspan class=\"na\"\u003e/design/\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eBuild\u003c/span\u003e](\u003cspan class=\"na\"\u003e/build/\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eTest\u003c/span\u003e](\u003cspan class=\"na\"\u003e/test/\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eRelease\u003c/span\u003e](\u003cspan class=\"na\"\u003e/release/\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003estatic\u003c/code\u003e accepts a percentage from 0 to 100, with or without a \u003ccode\u003e%\u003c/code\u003e suffix.\n\u003ccode\u003emilestones\u003c/code\u003e accepts the number of completed entries. Values are clamped to the\nroad\u0026rsquo;s range. Invalid values fall back to scroll progress. Fixed progress stays\nthe same after scroll, resize, and view transitions. The original links remain\navailable if JavaScript does not run.\nAt 0, no entries are active. At 100%, or when all milestones are complete, all\nentries are active.\u003c/p\u003e\n\u003ch2 id=\"choose-a-style\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChoose a style\u003c/span\u003e \u003ca href=\"#choose-a-style\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePut the style name after \u003ccode\u003eroad\u003c/code\u003e. The default style is \u003ccode\u003ewinding\u003c/code\u003e.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eStyle\u003c/th\u003e\n\u003cth\u003eGood for\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewinding\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eJourneys, reading paths, story arcs\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etimeline\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDated events, changelogs, history\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esteps\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShort processes of three to six steps\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esnake\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLong ordered sequences, such as courses or series\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecycle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eProcesses that repeat, such as sprints or seasons\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econstellation\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLoosely related ideas or a \u0026ldquo;see also\u0026rdquo; map\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egit\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBranching work, such as release trains or experiments\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eeditorial\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTimelines where each entry has paragraphs, lists, or images\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"timeline\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTimeline\u003c/span\u003e \u003ca href=\"#timeline\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: road timeline\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eProject announced\u003c/span\u003e](\u003cspan class=\"na\"\u003e/blog/announcement/\u003c/span\u003e) Jan 2026\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003ePublic beta\u003c/span\u003e](\u003cspan class=\"na\"\u003e/blog/beta/\u003c/span\u003e) Apr 2026\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eVersion 1.0\u003c/span\u003e](\u003cspan class=\"na\"\u003e/blog/v1/\u003c/span\u003e) Jul 2026\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003ePlugin marketplace\u003c/span\u003e](\u003cspan class=\"na\"\u003e/blog/plugins/\u003c/span\u003e) Oct 2026\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"road timeline\"\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/getting-started/\"\u003eGetting started\u003c/a\u003e Day 1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/markdown/\"\u003eMarkdown features\u003c/a\u003e Day 2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/templates/\"\u003eTemplates\u003c/a\u003e Day 3\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/feeds/\"\u003eFeeds\u003c/a\u003e Day 4\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/div\u003e\n\u003ch3 id=\"steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSteps\u003c/span\u003e \u003ca href=\"#steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSteps read from left to right. On narrow screens they change to a timeline.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: road steps\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eDraft\u003c/span\u003e](\u003cspan class=\"na\"\u003e/handbook/draft/\u003c/span\u003e) write\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eReview\u003c/span\u003e](\u003cspan class=\"na\"\u003e/handbook/review/\u003c/span\u003e) edit\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003ePublish\u003c/span\u003e](\u003cspan class=\"na\"\u003e/handbook/publish/\u003c/span\u003e) ship\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eShare\u003c/span\u003e](\u003cspan class=\"na\"\u003e/handbook/share/\u003c/span\u003e) promote\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"road steps\"\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/getting-started/\"\u003eInstall\u003c/a\u003e setup\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfigure\u003c/a\u003e config\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/themes/\"\u003eTheme\u003c/a\u003e style\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/deployment/\"\u003eDeploy\u003c/a\u003e ship\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/div\u003e\n\u003ch3 id=\"snake\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSnake\u003c/span\u003e \u003ca href=\"#snake\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe snake style wraps a long list back and forth across rows, like a board\ngame.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: road snake\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eVariables\u003c/span\u003e](\u003cspan class=\"na\"\u003e/course/variables/\u003c/span\u003e) 1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eFunctions\u003c/span\u003e](\u003cspan class=\"na\"\u003e/course/functions/\u003c/span\u003e) 2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eLoops\u003c/span\u003e](\u003cspan class=\"na\"\u003e/course/loops/\u003c/span\u003e) 3\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eStructs\u003c/span\u003e](\u003cspan class=\"na\"\u003e/course/structs/\u003c/span\u003e) 4\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eInterfaces\u003c/span\u003e](\u003cspan class=\"na\"\u003e/course/interfaces/\u003c/span\u003e) 5\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eErrors\u003c/span\u003e](\u003cspan class=\"na\"\u003e/course/errors/\u003c/span\u003e) 6\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eTesting\u003c/span\u003e](\u003cspan class=\"na\"\u003e/course/testing/\u003c/span\u003e) 7\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eConcurrency\u003c/span\u003e](\u003cspan class=\"na\"\u003e/course/concurrency/\u003c/span\u003e) 8\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"cycle\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCycle\u003c/span\u003e \u003ca href=\"#cycle\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: road cycle\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003ePlan\u003c/span\u003e](\u003cspan class=\"na\"\u003e/process/plan/\u003c/span\u003e) week 1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eBuild\u003c/span\u003e](\u003cspan class=\"na\"\u003e/process/build/\u003c/span\u003e) week 2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eReview\u003c/span\u003e](\u003cspan class=\"na\"\u003e/process/review/\u003c/span\u003e) week 3\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eRetro\u003c/span\u003e](\u003cspan class=\"na\"\u003e/process/retro/\u003c/span\u003e) week 4\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"road cycle\"\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/markdown/\"\u003eWrite\u003c/a\u003e draft\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/reference/cli/\"\u003eBuild\u003c/a\u003e preview\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/content-diagnostics/\"\u003eReview\u003c/a\u003e check\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/deployment/\"\u003ePublish\u003c/a\u003e ship\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/div\u003e\n\u003ch3 id=\"constellation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConstellation\u003c/span\u003e \u003ca href=\"#constellation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe points sit in fixed, scattered positions joined by fine lines. The layout\nis the same on every visit.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: road constellation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [[on-writing-clearly]] essay\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [[notes-on-focus]] note\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [[a-reading-list]] list\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [[why-plain-text]] essay\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"git\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGit\u003c/span\u003e \u003ca href=\"#git\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe git style draws a commit graph with branches and merges. List the commits\nin order, and write the branch after each link:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAfter the link\u003c/th\u003e\n\u003cth\u003eMeaning\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emain\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eA commit on \u003ccode\u003emain\u003c/code\u003e. A new branch name starts a branch from the first branch (the trunk).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efix/typo from feat/search\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eStarts \u003ccode\u003efix/typo\u003c/code\u003e from the latest commit on \u003ccode\u003efeat/search\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emain \u0026lt;- feat/search\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMerges \u003ccode\u003efeat/search\u003c/code\u003e into \u003ccode\u003emain\u003c/code\u003e. You can also write \u003ccode\u003e←\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: road git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eInitial commit\u003c/span\u003e](\u003cspan class=\"na\"\u003e/changelog/#init\u003c/span\u003e) main\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eAdd search index\u003c/span\u003e](\u003cspan class=\"na\"\u003e/changelog/#search\u003c/span\u003e) feat/search\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eUpdate README\u003c/span\u003e](\u003cspan class=\"na\"\u003e/changelog/#readme\u003c/span\u003e) main\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eSearch results page\u003c/span\u003e](\u003cspan class=\"na\"\u003e/changelog/#results\u003c/span\u003e) feat/search\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eDark mode\u003c/span\u003e](\u003cspan class=\"na\"\u003e/changelog/#dark\u003c/span\u003e) feat/dark-mode\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eMerge search\u003c/span\u003e](\u003cspan class=\"na\"\u003e/changelog/#merge-search\u003c/span\u003e) main \u0026lt;- feat/search\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eTry a new palette\u003c/span\u003e](\u003cspan class=\"na\"\u003e/changelog/#palette\u003c/span\u003e) spike/palette from feat/dark-mode\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eDark mode polish\u003c/span\u003e](\u003cspan class=\"na\"\u003e/changelog/#polish\u003c/span\u003e) feat/dark-mode\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eKeep the palette\u003c/span\u003e](\u003cspan class=\"na\"\u003e/changelog/#keep\u003c/span\u003e) feat/dark-mode \u0026lt;- spike/palette\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eRelease 1.0\u003c/span\u003e](\u003cspan class=\"na\"\u003e/changelog/#v1\u003c/span\u003e) main \u0026lt;- feat/dark-mode\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe first commit\u0026rsquo;s branch is the trunk. Each branch gets its own lane and\ncolor. A merged branch frees its lane for the next branch.\u003c/p\u003e\n\u003ch3 id=\"editorial\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEditorial\u003c/span\u003e \u003ca href=\"#editorial\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse the editorial style when each entry needs more than a title. Write a\nheading for each entry, then any Markdown under it: paragraphs, lists,\nchecklists, quotes, images, or code.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: road editorial\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### [Discovery](/projects/redesign/discovery/) March\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWe interviewed twelve readers and found three common problems.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e- [x]\u003c/span\u003e interviews\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e- [x]\u003c/span\u003e survey\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e- [ ]\u003c/span\u003e analytics review\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### [Prototype](/projects/redesign/prototype/) May\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\u0026gt; \u003c/span\u003e\u003cspan class=\"ge\"\u003eSmaller pages, bigger type, fewer clicks.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### [Launch](/projects/redesign/launch/) August\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"road editorial\"\u003e\n\u003ch4 id=\"markdown-write\"\u003e\u003ca href=\"/docs/guides/markdown/\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMarkdown\u003c/span\u003e\u003c/a\u003e\u003cspan class=\"heading-wear-glyph\"\u003e Write\u003c/span\u003e \u003ca href=\"#markdown-write\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eWrite posts in Markdown with frontmatter.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e headings and lists\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e admonitions and containers\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e wikilinks\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"templates-shape\"\u003e\u003ca href=\"/docs/guides/templates/\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplates\u003c/span\u003e\u003c/a\u003e\u003cspan class=\"heading-wear-glyph\"\u003e Shape\u003c/span\u003e \u003ca href=\"#templates-shape\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eChange the layout with templates, or keep the defaults.\u003c/p\u003e\n\u003ch4 id=\"deployment-ship\"\u003e\u003ca href=\"/docs/guides/deployment/\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeployment\u003c/span\u003e\u003c/a\u003e\u003cspan class=\"heading-wear-glyph\"\u003e Ship\u003c/span\u003e \u003ca href=\"#deployment-ship\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eBuild static HTML and host it anywhere.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eHow editorial entries work:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe text after the heading link (\u003ccode\u003eMarch\u003c/code\u003e) becomes a small label above the\ntitle.\u003c/li\u003e\n\u003cli\u003eThe rail fills in as the reader moves through the entries.\u003c/li\u003e\n\u003cli\u003eThe headings stay real headings, so they keep their anchor links and appear\nin the table of contents. Use a heading level below your section heading, so\nthe table of contents stays tidy. For example, use \u003ccode\u003e###\u003c/code\u003e entries under a \u003ccode\u003e##\u003c/code\u003e\nsection.\u003c/li\u003e\n\u003cli\u003eA road whose first item is a heading uses the editorial style automatically,\neven when you write \u003ccode\u003e::: road\u003c/code\u003e or \u003ccode\u003e::: road timeline\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"editorial-stories-icons-and-reveal\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEditorial stories, icons, and reveal\u003c/span\u003e \u003ca href=\"#editorial-stories-icons-and-reveal\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: road editorial story reveal\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### :lucide-key-round: RSA migration and faster job views\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e*2026 Q3*\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eA lead paragraph explaining what changed and why it matters.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e Faster job views\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e Simpler key rotation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e Clearer audit trails\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e Fewer manual steps\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### A quieter milestone without an icon\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e*2026 Q4*\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThe ordinary rail dot still works.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eA leading \u003ccode\u003e:lucide-name:\u003c/code\u003e icon becomes a badge on the rail, muted until the\nentry is active. An emphasis-only paragraph immediately after a heading becomes\nthe eyebrow above its title. Both work on all editorial roads, without \u003ccode\u003estory\u003c/code\u003e.\nIf the heading already has a beside-link label, it takes precedence and the\nemphasis paragraph stays in the body. Mixed-content paragraphs are not labels.\u003c/p\u003e\n\u003cp\u003eAdd \u003cstrong\u003e\u003ccode\u003estory\u003c/code\u003e\u003c/strong\u003e for larger balanced titles, a larger opening paragraph, generous\nspacing, and a prose measure of about 64 characters. Direct unordered lists\nwithout task checkboxes become diamond-bullet highlights with a top rule.\nLists of four or more items use two columns at viewport widths of 1100px or\nmore. Cards, stats, and figures can use the wider entry body. Without \u003ccode\u003estory\u003c/code\u003e,\nexisting editorial typography stays unchanged.\u003c/p\u003e\n\u003cp\u003eAdd \u003cstrong\u003e\u003ccode\u003ereveal\u003c/code\u003e\u003c/strong\u003e independently for scroll-triggered entry fades and gentle\nupward motion. It works with or without \u003ccode\u003estory\u003c/code\u003e, respects reduced motion, and\ndoes not animate print, anchor targets, or keyboard-focused entries. Entries\nstay readable without JavaScript or IntersectionObserver, even if the\nenhancement fails: reveal animates arriving content rather than hiding it\nuntil a callback runs.\u003c/p\u003e\n\u003ch2 id=\"more-than-one-road\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMore than one road\u003c/span\u003e \u003ca href=\"#more-than-one-road\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA post can have any number of roads, in any mix of styles. Each road draws on\nits own as it scrolls into view.\u003c/p\u003e\n\u003ch2 id=\"options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOptions\u003c/span\u003e \u003ca href=\"#options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse the container attribute block for options:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: road {data-road=\u0026#34;timeline\u0026#34; data-road-spacing=\u0026#34;80\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eAlpha\u003c/span\u003e](\u003cspan class=\"na\"\u003e/releases/alpha/\u003c/span\u003e) v0.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eBeta\u003c/span\u003e](\u003cspan class=\"na\"\u003e/releases/beta/\u003c/span\u003e) v0.5\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edata-road=\u0026quot;STYLE\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSelects the style. This is the same as \u003ccode\u003e::: road STYLE\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edata-road-spacing=\u0026quot;N\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSets the vertical space for each milestone, in pixels.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eTo change the colors, set CSS custom properties in your site CSS:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eroad\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--road-accent\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#3fb68b\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \u003cspan class=\"c\"\u003e/* progress line, active dots, labels */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--road-muted\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#4a4f5a\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e   \u003cspan class=\"c\"\u003e/* the path before it is drawn */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe defaults come from your palette\u0026rsquo;s \u003ccode\u003e--color-primary\u003c/code\u003e and\n\u003ccode\u003e--color-border-strong\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"using-html-instead-of-a-container\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing HTML instead of a container\u003c/span\u003e \u003ca href=\"#using-html-instead-of-a-container\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA raw HTML \u003ccode\u003e\u0026lt;div\u0026gt;\u003c/code\u003e also works. Leave a blank line after the opening tag and\nbefore the closing tag, so the list inside is parsed as Markdown:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;road\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003edata-road\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;timeline\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- [Kickoff](/notes/kickoff/) Jan 2026\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- [Launch](/notes/launch/) Jun 2026\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"accessibility-and-fallbacks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAccessibility and fallbacks\u003c/span\u003e \u003ca href=\"#accessibility-and-fallbacks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eWithout JavaScript, a road shows as the ordinary list or headings that you\nwrote.\u003c/li\u003e\n\u003cli\u003eWhile a road loads, its space is reserved, so the raw list does not flash and\nthe page does not jump. If the script fails, the list shows after 2.5 seconds.\u003c/li\u003e\n\u003cli\u003eEvery milestone stays a real link that works with the keyboard.\u003c/li\u003e\n\u003cli\u003eWhen the reader asks for reduced motion, roads appear fully drawn, with no\nanimation.\u003c/li\u003e\n\u003cli\u003eRoads keep working when readers move between pages with\n\u003ca href=\"/docs/guides/view-transitions/\"\u003eview transitions\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"how-roads-load\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow roads load\u003c/span\u003e \u003ca href=\"#how-roads-load\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe road CSS and JavaScript load only on pages that contain a road. markata-go\nfinds roads when it renders the post. CSS purge keeps the road styles in\nproduction builds, with no extra configuration.\u003c/p\u003e\n\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eThe road shows as a plain list.\u003c/strong\u003e Check that the container closes with a\nline that contains only colons (\u003ccode\u003e:::\u003c/code\u003e). For a raw \u003ccode\u003e\u0026lt;div\u0026gt;\u003c/code\u003e, check for the blank\nlines around the list. After you change shared CSS or templates, do a clean\nrebuild.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSome list items are missing.\u003c/strong\u003e Only list items that contain a link become\nmilestones.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eThe git graph joins the wrong branches.\u003c/strong\u003e Branch names must match exactly.\nA merge (\u003ccode\u003emain \u0026lt;- feat/x\u003c/code\u003e) must come after at least one commit on both\nbranches.\u003c/p\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/markdown-containers/\"\u003eMarkdown containers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/markdown/\"\u003eMarkdown features\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/themes/\"\u003eThemes\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nA road is a path that draws itself as the reader scrolls. Each milestone on the\npath is a link from your post. Use roads for roadmaps, release histories,\nonboarding paths, project timelines, or any sequence that readers walk through.\n\nRoads are built in to the default theme. You need no template, config, or\nplugin. Write a [Markdown container](/docs/guides/markdown-containers/) named\n`road`, and put a list of links inside it.\n\n## Quick start\n\n````markdown\n::: road\n\n- [Install markata-go](/docs/getting-started/) Step one\n- [Configure your site](/docs/guides/configuration/) Step two\n- [Pick a theme](/docs/guides/themes/) Step three\n- [Publish feeds](/docs/guides/feeds/) Step four\n:::\n````\n\nThat renders as:\n\n::: road\n\n- [Install markata-go](/docs/getting-started/) Step one\n- [Configure your site](/docs/guides/configuration/) Step two\n- [Pick a theme](/docs/guides/themes/) Step three\n- [Publish feeds](/docs/guides/feeds/) Step four\n:::\n\nEach list item is one milestone:\n\n- **The link** is the milestone title, and clicking it opens the page.\n- **The text after the link** is a small label, such as a date or step number.\n  It is also shown in the hover card.\n\nWikilinks work too. A milestone written as `[[my-post]]` uses that post's\ntitle, and its hover card shows the post's description.\n\n## Set fixed progress\n\nUse fixed progress for a roadmap whose completion does not depend on scrolling.\nThe normal scroll-driven progress remains the default.\n\n```markdown\n::: road timeline {data-road-progress-mode=\"static\" data-road-progress=\"65\"}\n- [Design](/design/)\n- [Build](/build/)\n- [Release](/release/)\n:::\n\n::: road steps {data-road-progress-mode=\"milestones\" data-road-current=\"2\"}\n- [Design](/design/)\n- [Build](/build/)\n- [Test](/test/)\n- [Release](/release/)\n:::\n```\n\n`static` accepts a percentage from 0 to 100, with or without a `%` suffix.\n`milestones` accepts the number of completed entries. Values are clamped to the\nroad's range. Invalid values fall back to scroll progress. Fixed progress stays\nthe same after scroll, resize, and view transitions. The original links remain\navailable if JavaScript does not run.\nAt 0, no entries are active. At 100%, or when all milestones are complete, all\nentries are active.\n\n## Choose a style\n\nPut the style name after `road`. The default style is `winding`.\n\n| Style | Good for |\n|-------|----------|\n| `winding` | Journeys, reading paths, story arcs |\n| `timeline` | Dated events, changelogs, history |\n| `steps` | Short processes of three to six steps |\n| `snake` | Long ordered sequences, such as courses or series |\n| `cycle` | Processes that repeat, such as sprints or seasons |\n| `constellation` | Loosely related ideas or a \"see also\" map |\n| `git` | Branching work, such as release trains or experiments |\n| `editorial` | Timelines where each entry has paragraphs, lists, or images |\n\n### Timeline\n\n````markdown\n::: road timeline\n\n- [Project announced](/blog/announcement/) Jan 2026\n- [Public beta](/blog/beta/) Apr 2026\n- [Version 1.0](/blog/v1/) Jul 2026\n- [Plugin marketplace](/blog/plugins/) Oct 2026\n:::\n````\n\n::: road timeline\n\n- [Getting started](/docs/getting-started/) Day 1\n- [Markdown features](/docs/guides/markdown/) Day 2\n- [Templates](/docs/guides/templates/) Day 3\n- [Feeds](/docs/guides/feeds/) Day 4\n:::\n\n### Steps\n\nSteps read from left to right. On narrow screens they change to a timeline.\n\n````markdown\n::: road steps\n\n- [Draft](/handbook/draft/) write\n- [Review](/handbook/review/) edit\n- [Publish](/handbook/publish/) ship\n- [Share](/handbook/share/) promote\n:::\n````\n\n::: road steps\n\n- [Install](/docs/getting-started/) setup\n- [Configure](/docs/guides/configuration/) config\n- [Theme](/docs/guides/themes/) style\n- [Deploy](/docs/guides/deployment/) ship\n:::\n\n### Snake\n\nThe snake style wraps a long list back and forth across rows, like a board\ngame.\n\n````markdown\n::: road snake\n\n- [Variables](/course/variables/) 1\n- [Functions](/course/functions/) 2\n- [Loops](/course/loops/) 3\n- [Structs](/course/structs/) 4\n- [Interfaces](/course/interfaces/) 5\n- [Errors](/course/errors/) 6\n- [Testing](/course/testing/) 7\n- [Concurrency](/course/concurrency/) 8\n:::\n````\n\n### Cycle\n\n````markdown\n::: road cycle\n\n- [Plan](/process/plan/) week 1\n- [Build](/process/build/) week 2\n- [Review](/process/review/) week 3\n- [Retro](/process/retro/) week 4\n:::\n````\n\n::: road cycle\n\n- [Write](/docs/guides/markdown/) draft\n- [Build](/docs/reference/cli/) preview\n- [Review](/docs/guides/content-diagnostics/) check\n- [Publish](/docs/guides/deployment/) ship\n:::\n\n### Constellation\n\nThe points sit in fixed, scattered positions joined by fine lines. The layout\nis the same on every visit.\n\n````markdown\n::: road constellation\n\n- [[on-writing-clearly]] essay\n- [[notes-on-focus]] note\n- [[a-reading-list]] list\n- [[why-plain-text]] essay\n:::\n````\n\n### Git\n\nThe git style draws a commit graph with branches and merges. List the commits\nin order, and write the branch after each link:\n\n| After the link | Meaning |\n|----------------|---------|\n| `main` | A commit on `main`. A new branch name starts a branch from the first branch (the trunk). |\n| `fix/typo from feat/search` | Starts `fix/typo` from the latest commit on `feat/search`. |\n| `main \u003c- feat/search` | Merges `feat/search` into `main`. You can also write `←`. |\n\n````markdown\n::: road git\n\n- [Initial commit](/changelog/#init) main\n- [Add search index](/changelog/#search) feat/search\n- [Update README](/changelog/#readme) main\n- [Search results page](/changelog/#results) feat/search\n- [Dark mode](/changelog/#dark) feat/dark-mode\n- [Merge search](/changelog/#merge-search) main \u003c- feat/search\n- [Try a new palette](/changelog/#palette) spike/palette from feat/dark-mode\n- [Dark mode polish](/changelog/#polish) feat/dark-mode\n- [Keep the palette](/changelog/#keep) feat/dark-mode \u003c- spike/palette\n- [Release 1.0](/changelog/#v1) main \u003c- feat/dark-mode\n:::\n````\n\nThe first commit's branch is the trunk. Each branch gets its own lane and\ncolor. A merged branch frees its lane for the next branch.\n\n### Editorial\n\nUse the editorial style when each entry needs more than a title. Write a\nheading for each entry, then any Markdown under it: paragraphs, lists,\nchecklists, quotes, images, or code.\n\n````markdown\n::: road editorial\n\n### [Discovery](/projects/redesign/discovery/) March\n\nWe interviewed twelve readers and found three common problems.\n\n- [x] interviews\n- [x] survey\n- [ ] analytics review\n\n### [Prototype](/projects/redesign/prototype/) May\n\n\u003e Smaller pages, bigger type, fewer clicks.\n\n### [Launch](/projects/redesign/launch/) August\n:::\n````\n\n::: road editorial\n\n#### [Markdown](/docs/guides/markdown/) Write\n\nWrite posts in Markdown with frontmatter.\n\n- [x] headings and lists\n- [x] admonitions and containers\n- [x] wikilinks\n\n#### [Templates](/docs/guides/templates/) Shape\n\nChange the layout with templates, or keep the defaults.\n\n#### [Deployment](/docs/guides/deployment/) Ship\n\nBuild static HTML and host it anywhere.\n:::\n\nHow editorial entries work:\n\n- The text after the heading link (`March`) becomes a small label above the\n  title.\n- The rail fills in as the reader moves through the entries.\n- The headings stay real headings, so they keep their anchor links and appear\n  in the table of contents. Use a heading level below your section heading, so\n  the table of contents stays tidy. For example, use `###` entries under a `##`\n  section.\n- A road whose first item is a heading uses the editorial style automatically,\n  even when you write `::: road` or `::: road timeline`.\n\n### Editorial stories, icons, and reveal\n\n````markdown\n::: road editorial story reveal\n\n### :lucide-key-round: RSA migration and faster job views\n*2026 Q3*\n\nA lead paragraph explaining what changed and why it matters.\n\n- Faster job views\n- Simpler key rotation\n- Clearer audit trails\n- Fewer manual steps\n\n### A quieter milestone without an icon\n*2026 Q4*\n\nThe ordinary rail dot still works.\n:::\n````\n\nA leading `:lucide-name:` icon becomes a badge on the rail, muted until the\nentry is active. An emphasis-only paragraph immediately after a heading becomes\nthe eyebrow above its title. Both work on all editorial roads, without `story`.\nIf the heading already has a beside-link label, it takes precedence and the\nemphasis paragraph stays in the body. Mixed-content paragraphs are not labels.\n\nAdd **`story`** for larger balanced titles, a larger opening paragraph, generous\nspacing, and a prose measure of about 64 characters. Direct unordered lists\nwithout task checkboxes become diamond-bullet highlights with a top rule.\nLists of four or more items use two columns at viewport widths of 1100px or\nmore. Cards, stats, and figures can use the wider entry body. Without `story`,\nexisting editorial typography stays unchanged.\n\nAdd **`reveal`** independently for scroll-triggered entry fades and gentle\nupward motion. It works with or without `story`, respects reduced motion, and\ndoes not animate print, anchor targets, or keyboard-focused entries. Entries\nstay readable without JavaScript or IntersectionObserver, even if the\nenhancement fails: reveal animates arriving content rather than hiding it\nuntil a callback runs.\n\n## More than one road\n\nA post can have any number of roads, in any mix of styles. Each road draws on\nits own as it scrolls into view.\n\n## Options\n\nUse the container attribute block for options:\n\n````markdown\n::: road {data-road=\"timeline\" data-road-spacing=\"80\"}\n\n- [Alpha](/releases/alpha/) v0.1\n- [Beta](/releases/beta/) v0.5\n:::\n````\n\n| Option | Description |\n|--------|-------------|\n| `data-road=\"STYLE\"` | Selects the style. This is the same as `::: road STYLE`. |\n| `data-road-spacing=\"N\"` | Sets the vertical space for each milestone, in pixels. |\n\nTo change the colors, set CSS custom properties in your site CSS:\n\n```css\n.road {\n  --road-accent: #3fb68b;  /* progress line, active dots, labels */\n  --road-muted: #4a4f5a;   /* the path before it is drawn */\n}\n```\n\nThe defaults come from your palette's `--color-primary` and\n`--color-border-strong`.\n\n## Using HTML instead of a container\n\nA raw HTML `\u003cdiv\u003e` also works. Leave a blank line after the opening tag and\nbefore the closing tag, so the list inside is parsed as Markdown:\n\n```html\n\u003cdiv class=\"road\" data-road=\"timeline\"\u003e\n\n- [Kickoff](/notes/kickoff/) Jan 2026\n- [Launch](/notes/launch/) Jun 2026\n\n\u003c/div\u003e\n```\n\n## Accessibility and fallbacks\n\n- Without JavaScript, a road shows as the ordinary list or headings that you\n  wrote.\n- While a road loads, its space is reserved, so the raw list does not flash and\n  the page does not jump. If the script fails, the list shows after 2.5 seconds.\n- Every milestone stays a real link that works with the keyboard.\n- When the reader asks for reduced motion, roads appear fully drawn, with no\n  animation.\n- Roads keep working when readers move between pages with\n  [view transitions](/docs/guides/view-transitions/).\n\n## How roads load\n\nThe road CSS and JavaScript load only on pages that contain a road. markata-go\nfinds roads when it renders the post. CSS purge keeps the road styles in\nproduction builds, with no extra configuration.\n\n## Troubleshooting\n\n**The road shows as a plain list.** Check that the container closes with a\nline that contains only colons (`:::`). For a raw `\u003cdiv\u003e`, check for the blank\nlines around the list. After you change shared CSS or templates, do a clean\nrebuild.\n\n**Some list items are missing.** Only list items that contain a link become\nmilestones.\n\n**The git graph joins the wrong branches.** Branch names must match exactly.\nA merge (`main \u003c- feat/x`) must come after at least one commit on both\nbranches.\n\n## See also\n\n- [Markdown containers](/docs/guides/markdown-containers/)\n- [Markdown features](/docs/guides/markdown/)\n- [Themes](/docs/guides/themes/)\n",
      "summary": "Turn a list of links into a scroll-drawn road: timelines, step-by-step guides, roadmaps, cycles, and git histories",
      "date_published": "2026-10-20T00:00:00Z",
      "date_modified": "2026-10-20T00:00:00Z",
      "tags": [
        "documentation",
        "markdown",
        "containers",
        "themes"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/releasing/",
      "url": "https://markata.dev/docs/guides/releasing/",
      "title": "Releasing Markata and rolling out every site",
      "content_html": "\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eHistorical release documentation:\u003c/strong\u003e These instructions describe the PyPI handoff before it occurred. Current PyPI releases install the Go CLI after the version break; older pinned releases are the Python implementation. See \u003ca href=\"/docs/installation/\"\u003einstallation\u003c/a\u003e.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"release-and-deployment-runbook\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRelease and deployment runbook\u003c/span\u003e \u003ca href=\"#release-and-deployment-runbook\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA release is complete only when \u003cstrong\u003ethe tested tag, published artifacts, pinned workloads, completed content builds, and live sites agree\u003c/strong\u003e. Creating a GitHub Release or updating a container tag is not enough.\u003c/p\u003e\n\u003ch2 id=\"1-freeze-a-tested-source-revision\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e1. Freeze a tested source revision\u003c/span\u003e \u003ca href=\"#1-freeze-a-tested-source-revision\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eChoose the exact main-branch commit after CI passes; record the 40-character SHA and release version. Maintain Go on \u003ccode\u003e0.x\u003c/code\u003e; the next intended version after v0.13.0 is \u003cstrong\u003ev0.14.0\u003c/strong\u003e, not 1.0.\u003c/li\u003e\n\u003cli\u003eRequire green lint, Linux core/CLI/site integration shards, macOS and Windows tests, and the snapshot package check. No unresolved red CI jobs.\u003c/li\u003e\n\u003cli\u003eIn particular, \u003ccode\u003eTestCacheDeterminism_ColdVsHot_WithFeedsAllFormats\u003c/code\u003e must not depend on whether a public CDN happened to answer. If the test fails due to an intermittent download, investigate and rerun; record the diagnosis and a durable fix rather than treating a red run as pass.\u003c/li\u003e\n\u003cli\u003eCheck any open release-affecting PRs and verify the approved source contains the intended code and docs.\u003c/li\u003e\n\u003cli\u003eDo not tag a moving \u003ccode\u003emain\u003c/code\u003e branch by accident: record the exact commit and compare it to the final release ref.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLocal maintainer commands (Go 1.27 required):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit fetch origin --tags\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit checkout main\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit pull --ff-only\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego \u003cspan class=\"nb\"\u003etest\u003c/span\u003e -race ./...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego vet ./...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egoreleaser check\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego run ./scripts/rendering-contract --check\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# See the dedicated snapshot workflow and check-rc-artifacts.sh.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit rev-parse HEAD\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAfter \u003cem\u003eall\u003c/em\u003e checks pass, an authorized maintainer creates and pushes an \u003cstrong\u003eannotated\u003c/strong\u003e version tag:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit tag -a v0.14.0 \u0026lt;verified-full-commit-sha\u0026gt; -m \u003cspan class=\"s2\"\u003e\u0026#34;Markata v0.14.0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit push origin v0.14.0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eDo not push that tag while the release CI is red.\u003c/strong\u003e This repository\u0026rsquo;s tag-driven \u003ca href=\"https://github.com/WaylonWalker/markata/actions/workflows/release.yml\"\u003eRelease workflow\u003c/a\u003e tests the tagged Go source, uses GoReleaser, and publishes signed binaries/checksums and SBOMs. The \u003ca href=\"https://github.com/WaylonWalker/markata/actions/workflows/docker.yml\"\u003eDocker workflow\u003c/a\u003e publishes tagged GHCR images including compatibility aliases.\u003c/p\u003e\n\u003ch2 id=\"2-verify-artifacts-and-document-the-release\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e2. Verify artifacts and document the release\u003c/span\u003e \u003ca href=\"#2-verify-artifacts-and-document-the-release\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eCheck the canonical \u003ca href=\"https://github.com/WaylonWalker/markata/releases\"\u003eGitHub Release\u003c/a\u003e, specifically that it is not draft or failed and points to the expected commit.\u003c/li\u003e\n\u003cli\u003eConfirm \u003ccode\u003emarkata_0.14.0_*\u003c/code\u003e and \u003ccode\u003emarkata-go_0.14.0_*\u003c/code\u003e archives for Linux, macOS and Windows, checksums, Cosign signatures and SBOMs. Validate one installed binary of each name.\u003c/li\u003e\n\u003cli\u003eConfirm \u003ccode\u003eghcr.io/waylonwalker/markata-builder:0.14.0\u003c/code\u003e and its \u003ccode\u003emarkata-go-builder:0.14.0\u003c/code\u003e compatibility alias, as well as applicable search image sources. Do \u003cstrong\u003enot\u003c/strong\u003e infer publication solely from a workflow that was queued.\u003c/li\u003e\n\u003cli\u003eInclude a curated summary, important compatibility notes, upgrade/rollback instructions and a link to \u003ca href=\"/docs/releases/v0.14.0/\"\u003ev0.14.0 release notes\u003c/a\u003e in the published GitHub release body; the autogenerated commit changelog is supplemental.\u003c/li\u003e\n\u003cli\u003eNever replace a published tag with a different commit. Issue a subsequent patch release for corrections.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"3-publish-pypi-independently-if-its-handoff-gate-is-ready\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e3. Publish PyPI independently, if its handoff gate is ready\u003c/span\u003e \u003ca href=\"#3-publish-pypi-independently-if-its-handoff-gate-is-ready\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe current PyPI project name \u003ccode\u003emarkata\u003c/code\u003e historically belongs to \u003cstrong\u003ePython Markata\u003c/strong\u003e. Publishing Go wheels is an intentional breaking installation-path handoff with its own review gate. See \u003ca href=\"/docs/guides/pypi-binary-wheels/\"\u003ePyPI binary wheels\u003c/a\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVerify PyPI trusted publisher for owner \u003ccode\u003eWaylonWalker\u003c/code\u003e, repo \u003ccode\u003emarkata\u003c/code\u003e, workflow \u003ccode\u003epypi-go-wheels.yml\u003c/code\u003e and environment \u003ccode\u003epypi\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eVerify protected GitHub \u003ccode\u003epypi\u003c/code\u003e environment and freeze/disable the old Python repository\u0026rsquo;s publishing workflow.\u003c/li\u003e\n\u003cli\u003eRun \u003ca href=\"https://github.com/WaylonWalker/markata/actions/workflows/pypi-go-wheels.yml\"\u003eGo Markata PyPI wheels\u003c/a\u003e on \u003ccode\u003emain\u003c/code\u003e with version \u003ccode\u003e0.14.0\u003c/code\u003e, \u003ccode\u003epublish=true\u003c/code\u003e and the workflow\u0026rsquo;s required confirmation only after the above prerequisites are satisfied.\u003c/li\u003e\n\u003cli\u003eConfirm all eight native wheel files on PyPI and test a \u003cem\u003enew\u003c/em\u003e virtual environment with \u003ccode\u003epython -m pip install --only-binary=:all: markata==0.14.0\u003c/code\u003e, \u003ccode\u003emarkata version\u003c/code\u003e and \u003ccode\u003epython -m markata version\u003c/code\u003e. Unsupported platforms may otherwise fall back to an older Python package.\u003c/li\u003e\n\u003cli\u003eKeep GitHub Release and PyPI states separately labelled until both have succeeded.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"4-deploy-one-immutable-release-through-argo-cd\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e4. Deploy one immutable release through Argo CD\u003c/span\u003e \u003ca href=\"#4-deploy-one-immutable-release-through-argo-cd\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eNever change production GitOps to reference an unbuilt tag or a mutable \u003ccode\u003elatest\u003c/code\u003e image.\u003c/strong\u003e In each multi-source Helm Application pin the chart \u003ccode\u003etargetRevision: v0.14.0\u003c/code\u003e and align every Markata fetch, builder and search image \u003ccode\u003etag: \u0026quot;0.14.0\u0026quot;\u003c/code\u003e with that source. Preserve other application settings, storage modes, secrets and feature flags. If search is intentionally independently pinned, verify the compatible search version first; record the exception explicitly.\u003c/p\u003e\n\u003cp\u003eUse a separate GitOps PR that can be held until all artifacts are verified. Progressive rollout:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOrder\u003c/th\u003e\n\u003cth\u003eSurface\u003c/th\u003e\n\u003cth\u003eGitOps source\u003c/th\u003e\n\u003cth\u003eExpected action\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ego.waylonwalker.com\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eargo-apps/apps/go-waylonwalker-com.yaml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCanary chart/builder/search pins; rebuild and smoke\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ewaylonwalker.com\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eargo-apps/apps/waylonwalker-com-prod.yaml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFull site build; smoke archive/images/sidebar/navigation\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003erhiannonwalker.com\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eargo-apps/apps/rhiannonwalker-com-prod.yaml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBuild via Builder Admin and confirm site\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e4\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ewyattbubbylee.com\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eargo-apps/apps/wyattbubbylee-com-prod.yaml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBuild via Builder Admin and confirm site\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e5\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003erecipes.waylonwalker.com\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ek8s/recipes-waylonwalker-com/deployment.yaml\u003c/code\u003e and \u003ccode\u003esite-config.yaml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReplace both mutable \u003ccode\u003elatest\u003c/code\u003e references with \u003ccode\u003e0.14.0\u003c/code\u003e; confirm recipe build\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe \u003ccode\u003emarkata-docs\u003c/code\u003e Deployment uses a \u003cstrong\u003eseparate Python-based documentation generator\u003c/strong\u003e and separately versioned docs images; it is \u003cstrong\u003enot\u003c/strong\u003e a Markata CLI runtime and should not be falsely counted as an old Markata deployment. \u003ccode\u003eplatgo\u003c/code\u003e currently has an \u003cem\u003eexample/commented\u003c/em\u003e Markata builder setting, not an active runtime. A historical \u003ccode\u003erhiannonwalker\u003c/code\u003e source-seed bootstrap Job has a pinned image; audit it only if bootstrap is still required.\u003c/p\u003e\n\u003cp\u003eFor each Argo Application: compare desired manifests with running pod image \u003cstrong\u003edigests\u003c/strong\u003e and chart revision; confirm it synced successfully and is healthy. On Builder Admin, compare running binary revision with most recent \u003cstrong\u003esuccessfully published build\u003c/strong\u003e. If the feature\u0026rsquo;s automatic build-on-new-revision does not run, invoke a full build through the authenticated builder. Verify site content before counting it complete.\u003c/p\u003e\n\u003cp\u003eExample read-only checks (use your configured \u003ccode\u003ekubectl\u003c/code\u003e context; do not assume remote cluster access from CI):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl -n argocd get applications\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl -n waylonwalker-com-prod-notes get deployments,pods\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl -n go-waylonwalker-com-notes get deployments,pods\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl -n rhiannonwalker-com-prod-notes get deployments,pods\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl -n wyattbubbylee-com-prod-notes get deployments,pods\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl -n recipes-waylonwalker-com get deployments,pods\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -fIsS https://waylonwalker.com/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -fIsS https://waylonwalker.com/archive/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -fIsS https://waylonwalker.com/images/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"5-rollback-and-closeout\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e5. Rollback and closeout\u003c/span\u003e \u003ca href=\"#5-rollback-and-closeout\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBefore each promotion, record old chart SHA, old image digests, the most recent good site release identifier and an application-specific rollback procedure. If the new build fails, pause further promotions, restore the old immutable chart/image pins in GitOps, reconcile, and activate the last known-good site release. A content rollback and a binary rollback are \u003cstrong\u003edifferent operations\u003c/strong\u003e; verify both.\u003c/p\u003e\n\u003cp\u003eKeep a deployment record with: release version, tag commit, binary artifacts, PyPI status, container digests, Argo commit, per-site desired/running image, build revision, site release ID, full-build result, public smoke results and timestamp. Mark each site \u003cstrong\u003everified\u003c/strong\u003e, \u003cstrong\u003eblocked\u003c/strong\u003e, or \u003cstrong\u003enot applicable\u003c/strong\u003e; never call the release \u0026ldquo;deployed everywhere\u0026rdquo; with unknowns.\u003c/p\u003e\n",
      "content_text": "\n\u003e **Historical release documentation:** These instructions describe the PyPI handoff before it occurred. Current PyPI releases install the Go CLI after the version break; older pinned releases are the Python implementation. See [installation](/docs/installation/).\n\n## Release and deployment runbook\n\nA release is complete only when **the tested tag, published artifacts, pinned workloads, completed content builds, and live sites agree**. Creating a GitHub Release or updating a container tag is not enough.\n\n## 1. Freeze a tested source revision\n\n- Choose the exact main-branch commit after CI passes; record the 40-character SHA and release version. Maintain Go on `0.x`; the next intended version after v0.13.0 is **v0.14.0**, not 1.0.\n- Require green lint, Linux core/CLI/site integration shards, macOS and Windows tests, and the snapshot package check. No unresolved red CI jobs.\n- In particular, `TestCacheDeterminism_ColdVsHot_WithFeedsAllFormats` must not depend on whether a public CDN happened to answer. If the test fails due to an intermittent download, investigate and rerun; record the diagnosis and a durable fix rather than treating a red run as pass.\n- Check any open release-affecting PRs and verify the approved source contains the intended code and docs.\n- Do not tag a moving `main` branch by accident: record the exact commit and compare it to the final release ref.\n\nLocal maintainer commands (Go 1.27 required):\n\n```bash\ngit fetch origin --tags\ngit checkout main\ngit pull --ff-only\ngo test -race ./...\ngo vet ./...\ngoreleaser check\ngo run ./scripts/rendering-contract --check\n# See the dedicated snapshot workflow and check-rc-artifacts.sh.\ngit rev-parse HEAD\n```\n\nAfter *all* checks pass, an authorized maintainer creates and pushes an **annotated** version tag:\n\n```bash\ngit tag -a v0.14.0 \u003cverified-full-commit-sha\u003e -m \"Markata v0.14.0\"\ngit push origin v0.14.0\n```\n\n**Do not push that tag while the release CI is red.** This repository's tag-driven [Release workflow](https://github.com/WaylonWalker/markata/actions/workflows/release.yml) tests the tagged Go source, uses GoReleaser, and publishes signed binaries/checksums and SBOMs. The [Docker workflow](https://github.com/WaylonWalker/markata/actions/workflows/docker.yml) publishes tagged GHCR images including compatibility aliases.\n\n## 2. Verify artifacts and document the release\n\n- Check the canonical [GitHub Release](https://github.com/WaylonWalker/markata/releases), specifically that it is not draft or failed and points to the expected commit.\n- Confirm `markata_0.14.0_*` and `markata-go_0.14.0_*` archives for Linux, macOS and Windows, checksums, Cosign signatures and SBOMs. Validate one installed binary of each name.\n- Confirm `ghcr.io/waylonwalker/markata-builder:0.14.0` and its `markata-go-builder:0.14.0` compatibility alias, as well as applicable search image sources. Do **not** infer publication solely from a workflow that was queued.\n- Include a curated summary, important compatibility notes, upgrade/rollback instructions and a link to [v0.14.0 release notes](/docs/releases/v0.14.0/) in the published GitHub release body; the autogenerated commit changelog is supplemental.\n- Never replace a published tag with a different commit. Issue a subsequent patch release for corrections.\n\n## 3. Publish PyPI independently, if its handoff gate is ready\n\nThe current PyPI project name `markata` historically belongs to **Python Markata**. Publishing Go wheels is an intentional breaking installation-path handoff with its own review gate. See [PyPI binary wheels](/docs/guides/pypi-binary-wheels/).\n\n- Verify PyPI trusted publisher for owner `WaylonWalker`, repo `markata`, workflow `pypi-go-wheels.yml` and environment `pypi`.\n- Verify protected GitHub `pypi` environment and freeze/disable the old Python repository's publishing workflow.\n- Run [Go Markata PyPI wheels](https://github.com/WaylonWalker/markata/actions/workflows/pypi-go-wheels.yml) on `main` with version `0.14.0`, `publish=true` and the workflow's required confirmation only after the above prerequisites are satisfied.\n- Confirm all eight native wheel files on PyPI and test a *new* virtual environment with `python -m pip install --only-binary=:all: markata==0.14.0`, `markata version` and `python -m markata version`. Unsupported platforms may otherwise fall back to an older Python package.\n- Keep GitHub Release and PyPI states separately labelled until both have succeeded.\n\n## 4. Deploy one immutable release through Argo CD\n\n**Never change production GitOps to reference an unbuilt tag or a mutable `latest` image.** In each multi-source Helm Application pin the chart `targetRevision: v0.14.0` and align every Markata fetch, builder and search image `tag: \"0.14.0\"` with that source. Preserve other application settings, storage modes, secrets and feature flags. If search is intentionally independently pinned, verify the compatible search version first; record the exception explicitly.\n\nUse a separate GitOps PR that can be held until all artifacts are verified. Progressive rollout:\n\n| Order | Surface | GitOps source | Expected action |\n| --- | --- | --- | --- |\n| 1 | `go.waylonwalker.com` | `argo-apps/apps/go-waylonwalker-com.yaml` | Canary chart/builder/search pins; rebuild and smoke |\n| 2 | `waylonwalker.com` | `argo-apps/apps/waylonwalker-com-prod.yaml` | Full site build; smoke archive/images/sidebar/navigation |\n| 3 | `rhiannonwalker.com` | `argo-apps/apps/rhiannonwalker-com-prod.yaml` | Build via Builder Admin and confirm site |\n| 4 | `wyattbubbylee.com` | `argo-apps/apps/wyattbubbylee-com-prod.yaml` | Build via Builder Admin and confirm site |\n| 5 | `recipes.waylonwalker.com` | `k8s/recipes-waylonwalker-com/deployment.yaml` and `site-config.yaml` | Replace both mutable `latest` references with `0.14.0`; confirm recipe build |\n\nThe `markata-docs` Deployment uses a **separate Python-based documentation generator** and separately versioned docs images; it is **not** a Markata CLI runtime and should not be falsely counted as an old Markata deployment. `platgo` currently has an *example/commented* Markata builder setting, not an active runtime. A historical `rhiannonwalker` source-seed bootstrap Job has a pinned image; audit it only if bootstrap is still required.\n\nFor each Argo Application: compare desired manifests with running pod image **digests** and chart revision; confirm it synced successfully and is healthy. On Builder Admin, compare running binary revision with most recent **successfully published build**. If the feature's automatic build-on-new-revision does not run, invoke a full build through the authenticated builder. Verify site content before counting it complete.\n\nExample read-only checks (use your configured `kubectl` context; do not assume remote cluster access from CI):\n\n```bash\nkubectl -n argocd get applications\nkubectl -n waylonwalker-com-prod-notes get deployments,pods\nkubectl -n go-waylonwalker-com-notes get deployments,pods\nkubectl -n rhiannonwalker-com-prod-notes get deployments,pods\nkubectl -n wyattbubbylee-com-prod-notes get deployments,pods\nkubectl -n recipes-waylonwalker-com get deployments,pods\ncurl -fIsS https://waylonwalker.com/\ncurl -fIsS https://waylonwalker.com/archive/\ncurl -fIsS https://waylonwalker.com/images/\n```\n\n## 5. Rollback and closeout\n\nBefore each promotion, record old chart SHA, old image digests, the most recent good site release identifier and an application-specific rollback procedure. If the new build fails, pause further promotions, restore the old immutable chart/image pins in GitOps, reconcile, and activate the last known-good site release. A content rollback and a binary rollback are **different operations**; verify both.\n\nKeep a deployment record with: release version, tag commit, binary artifacts, PyPI status, container digests, Argo commit, per-site desired/running image, build revision, site release ID, full-build result, public smoke results and timestamp. Mark each site **verified**, **blocked**, or **not applicable**; never call the release \"deployed everywhere\" with unknowns.\n",
      "summary": "Maintainer release gates, PyPI publication, GitOps pins, canaries and verified site builds.",
      "date_published": "2026-10-20T00:00:00Z",
      "date_modified": "2026-10-20T00:00:00Z",
      "tags": [
        "release",
        "operations",
        "deployment"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/markdown-metrics/",
      "url": "https://markata.dev/docs/guides/markdown-metrics/",
      "title": "Status badges, metrics, gauges, and sparklines",
      "content_html": "\u003ch2 id=\"status-metrics-gauges-and-sparklines\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStatus, metrics, gauges, and sparklines\u003c/span\u003e \u003ca href=\"#status-metrics-gauges-and-sparklines\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMarkata\u0026rsquo;s Markdown containers can render compact, theme-aware operational\nsummaries without using JavaScript. Combine these components with the\n\u003ca href=\"/docs/guides/markdown-containers/\"\u003eresponsive layout primitives\u003c/a\u003e to produce\nthe same kind of dashboard-like reporting found in modern chat interfaces.\u003c/p\u003e\n\u003cp\u003eThe components are \u003cstrong\u003epresentation\u003c/strong\u003e, not automatic monitoring. Authors supply\nthe measurements; Markata does not calculate or verify them.\u003c/p\u003e\n\u003ch2 id=\"components\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComponents\u003c/span\u003e \u003ca href=\"#components\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eContainer\u003c/th\u003e\n\u003cth\u003eRole\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-status\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCompact inline status with an optional semantic tone\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-stat\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFirst paragraph is label; second is large value; third is optional secondary label\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-delta\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSide-by-side comparison caption and emphasized result\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-meter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNative HTML \u003ccode\u003e\u0026lt;meter\u0026gt;\u003c/code\u003e for measurements like free disk space\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-progress\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNative HTML \u003ccode\u003e\u0026lt;progress\u0026gt;\u003c/code\u003e for partially completed tasks\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-sparkline\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eStatic inline SVG trend line from a short series of numbers\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003ccode\u003edata-tone=\u0026quot;success\u0026quot;\u003c/code\u003e, \u003ccode\u003edata-tone=\u0026quot;caution\u0026quot;\u003c/code\u003e, and\n\u003ccode\u003edata-tone=\u0026quot;danger\u0026quot;\u003c/code\u003e use the site\u0026rsquo;s existing semantic palette colors.\nUnknown tones use the ordinary theme accent. Both gauges require finite\nnumbers \u003ccode\u003edata-value\u003c/code\u003e and \u003ccode\u003edata-max\u003c/code\u003e where max is positive and\n0 ≤ value ≤ max. They also \u003cstrong\u003erequire\u003c/strong\u003e a descriptive \u003ccode\u003edata-label\u003c/code\u003e, which\nbecomes the accessible label on the native HTML element.\u003c/p\u003e\n\u003cp\u003eWhen an attribute is missing or invalid, the container still renders its\nMarkdown body normally and no graphical gauge is added. The text should\nalways include the exact value so the page is understandable in text-only\nreaders and feeds.\u003c/p\u003e\n\u003ch2 id=\"verified-result-badge\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVerified result badge\u003c/span\u003e \u003ca href=\"#verified-result-badge\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: md-status {data-tone=\u0026#34;success\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eNVMe cleanup verified\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDo not use green color alone to communicate success: include the literal\nstatus wording, as above.\u003c/p\u003e\n\u003ch2 id=\"before-after-metrics-and-native-meters\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBefore/after metrics and native meters\u003c/span\u003e \u003ca href=\"#before-after-metrics-and-native-meters\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: md-layout\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFalcon3 NVMe — before and after cleanup\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-columns\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::: md-stat {data-tone=\u0026#34;caution\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBefore\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gs\"\u003e**83 GiB**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e18% free\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::::: md-meter {data-value=\u0026#34;18\u0026#34; data-max=\u0026#34;100\u0026#34; data-label=\u0026#34;Before cleanup: 18 percent free\u0026#34; data-tone=\u0026#34;caution\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::: md-stat {data-tone=\u0026#34;success\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAfter\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gs\"\u003e**212 GiB**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e45% free\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::::: md-meter {data-value=\u0026#34;45\u0026#34; data-max=\u0026#34;100\u0026#34; data-label=\u0026#34;After cleanup: 45 percent free\u0026#34; data-tone=\u0026#34;success\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-delta {data-tone=\u0026#34;success\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSpace recovered\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ge\"\u003e**\u003c/span\u003e+129 GiB**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThese remain normal Markdown paragraphs and nested containers. Use longer\ncolon fences for deeper nesting, and place blank lines before bare closers.\u003c/p\u003e\n\u003ch2 id=\"trend-sparklines\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTrend sparklines\u003c/span\u003e \u003ca href=\"#trend-sparklines\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA sparkline shows the shape of a series next to the number it explains.\nGive \u003ccode\u003edata-values\u003c/code\u003e as two or more finite numbers, separated by spaces or\ncommas, and a descriptive \u003ccode\u003edata-label\u003c/code\u003e. The line is drawn at build time as an\ninline SVG, so it needs no JavaScript. The Markdown body stays as a visible\ncaption.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: md-stat {data-tone=\u0026#34;success\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJobs run\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gs\"\u003e**222,421**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eYear 4 ran 3x the jobs of year 3\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-sparkline {data-values=\u0026#34;8120 21400 48300 144601\u0026#34; data-label=\u0026#34;Jobs per year, years 1 to 4\u0026#34; data-tone=\u0026#34;success\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eYears 1–4\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe sparkline draws only a line by default. Add the \u003ccode\u003earea\u003c/code\u003e modifier class to\nshade the area under the line:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: md-sparkline area {data-values=\u0026#34;12 18 15 31 44\u0026#34; data-label=\u0026#34;Jobs per week\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLast five weeks\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe line fills the container width and scales between the lowest and highest\nvalues. It does not start at zero, so it shows shape, not size. Put the exact\nnumbers in the text or a table when the reader needs them. The SVG\u0026rsquo;s\naccessible name gives the label, point count, first and last values, low, and\nhigh.\u003c/p\u003e\n\u003cp\u003eA sparkline accepts up to 500 points. With fewer than two points, a missing\nlabel, or a value that is not a finite number, no line is drawn and the\ncaption renders as normal.\u003c/p\u003e\n\u003ch2 id=\"a-build-progress-bar\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eA build progress bar\u003c/span\u003e \u003ca href=\"#a-build-progress-bar\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA task-completion indicator is not the same as a measured storage percentage.\nUse \u003ccode\u003emd-progress\u003c/code\u003e only when a process is underway.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: md-progress {data-value=\u0026#34;7\u0026#34; data-max=\u0026#34;10\u0026#34; data-label=\u0026#34;Build steps completed\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e7 of 10 build steps finished.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"full-report-with-a-normal-markdown-table\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFull report with a normal Markdown table\u003c/span\u003e \u003ca href=\"#full-report-with-a-normal-markdown-table\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse the \u003ca href=\"/layout-metrics/\"\u003eexample page\u003c/a\u003e for the complete composition,\nincluding the existing semantic GFM table. Future sortable table behavior\nwill work independently of these static metrics and should never be needed\nto see the content.\u003c/p\u003e\n\u003ch2 id=\"compatibility-and-accessibility\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCompatibility and accessibility\u003c/span\u003e \u003ca href=\"#compatibility-and-accessibility\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFully rendered at build time; no component JavaScript or network requests.\u003c/li\u003e\n\u003cli\u003eThe source Markdown body and numeric labels remain readable in plain text.\u003c/li\u003e\n\u003cli\u003eNative \u003ccode\u003emeter\u003c/code\u003e and \u003ccode\u003eprogress\u003c/code\u003e provide standard accessible semantics.\u003c/li\u003e\n\u003cli\u003eSparklines are \u003ccode\u003erole=\u0026quot;img\u0026quot;\u003c/code\u003e SVGs with a generated accessible summary.\u003c/li\u003e\n\u003cli\u003eColor tones inherit from the active theme, including alternate palettes.\u003c/li\u003e\n\u003cli\u003eNested grids stack at mobile widths using the layout primitives.\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n## Status, metrics, gauges, and sparklines\n\nMarkata's Markdown containers can render compact, theme-aware operational\nsummaries without using JavaScript. Combine these components with the\n[responsive layout primitives](/docs/guides/markdown-containers/) to produce\nthe same kind of dashboard-like reporting found in modern chat interfaces.\n\nThe components are **presentation**, not automatic monitoring. Authors supply\nthe measurements; Markata does not calculate or verify them.\n\n## Components\n\n| Container | Role |\n| --- | --- |\n| `md-status` | Compact inline status with an optional semantic tone |\n| `md-stat` | First paragraph is label; second is large value; third is optional secondary label |\n| `md-delta` | Side-by-side comparison caption and emphasized result |\n| `md-meter` | Native HTML `\u003cmeter\u003e` for measurements like free disk space |\n| `md-progress` | Native HTML `\u003cprogress\u003e` for partially completed tasks |\n| `md-sparkline` | Static inline SVG trend line from a short series of numbers |\n\n`data-tone=\"success\"`, `data-tone=\"caution\"`, and\n`data-tone=\"danger\"` use the site's existing semantic palette colors.\nUnknown tones use the ordinary theme accent. Both gauges require finite\nnumbers `data-value` and `data-max` where max is positive and\n0 ≤ value ≤ max. They also **require** a descriptive `data-label`, which\nbecomes the accessible label on the native HTML element.\n\nWhen an attribute is missing or invalid, the container still renders its\nMarkdown body normally and no graphical gauge is added. The text should\nalways include the exact value so the page is understandable in text-only\nreaders and feeds.\n\n## Verified result badge\n\n````markdown\n::: md-status {data-tone=\"success\"}\n\nNVMe cleanup verified\n\n:::\n````\n\nDo not use green color alone to communicate success: include the literal\nstatus wording, as above.\n\n## Before/after metrics and native meters\n\n````markdown\n::: md-layout\n\nFalcon3 NVMe — before and after cleanup\n\n:::: md-columns\n\n::::: md-stat {data-tone=\"caution\"}\nBefore\n\n**83 GiB**\n\n18% free\n\n:::::: md-meter {data-value=\"18\" data-max=\"100\" data-label=\"Before cleanup: 18 percent free\" data-tone=\"caution\"}\n\n::::::\n\n:::::\n\n::::: md-stat {data-tone=\"success\"}\nAfter\n\n**212 GiB**\n\n45% free\n\n:::::: md-meter {data-value=\"45\" data-max=\"100\" data-label=\"After cleanup: 45 percent free\" data-tone=\"success\"}\n\n::::::\n\n:::::\n\n::::\n\n:::: md-delta {data-tone=\"success\"}\nSpace recovered\n\n**+129 GiB**\n\n::::\n\n:::\n````\n\nThese remain normal Markdown paragraphs and nested containers. Use longer\ncolon fences for deeper nesting, and place blank lines before bare closers.\n\n## Trend sparklines\n\nA sparkline shows the shape of a series next to the number it explains.\nGive `data-values` as two or more finite numbers, separated by spaces or\ncommas, and a descriptive `data-label`. The line is drawn at build time as an\ninline SVG, so it needs no JavaScript. The Markdown body stays as a visible\ncaption.\n\n````markdown\n::: md-stat {data-tone=\"success\"}\nJobs run\n\n**222,421**\n\nYear 4 ran 3x the jobs of year 3\n\n:::: md-sparkline {data-values=\"8120 21400 48300 144601\" data-label=\"Jobs per year, years 1 to 4\" data-tone=\"success\"}\n\nYears 1–4\n\n::::\n\n:::\n````\n\nThe sparkline draws only a line by default. Add the `area` modifier class to\nshade the area under the line:\n\n````markdown\n::: md-sparkline area {data-values=\"12 18 15 31 44\" data-label=\"Jobs per week\"}\n\nLast five weeks\n\n:::\n````\n\nThe line fills the container width and scales between the lowest and highest\nvalues. It does not start at zero, so it shows shape, not size. Put the exact\nnumbers in the text or a table when the reader needs them. The SVG's\naccessible name gives the label, point count, first and last values, low, and\nhigh.\n\nA sparkline accepts up to 500 points. With fewer than two points, a missing\nlabel, or a value that is not a finite number, no line is drawn and the\ncaption renders as normal.\n\n## A build progress bar\n\nA task-completion indicator is not the same as a measured storage percentage.\nUse `md-progress` only when a process is underway.\n\n````markdown\n::: md-progress {data-value=\"7\" data-max=\"10\" data-label=\"Build steps completed\"}\n\n7 of 10 build steps finished.\n\n:::\n````\n\n## Full report with a normal Markdown table\n\nUse the [example page](/layout-metrics/) for the complete composition,\nincluding the existing semantic GFM table. Future sortable table behavior\nwill work independently of these static metrics and should never be needed\nto see the content.\n\n## Compatibility and accessibility\n\n- Fully rendered at build time; no component JavaScript or network requests.\n- The source Markdown body and numeric labels remain readable in plain text.\n- Native `meter` and `progress` provide standard accessible semantics.\n- Sparklines are `role=\"img\"` SVGs with a generated accessible summary.\n- Color tones inherit from the active theme, including alternate palettes.\n- Nested grids stack at mobile widths using the layout primitives.\n",
      "summary": "Author static-first status reports, before/after stats, accessible meters, and trend sparklines with Markdown.",
      "date_published": "2026-10-20T00:00:00Z",
      "date_modified": "2026-10-20T00:00:00Z",
      "tags": [
        "documentation",
        "markdown",
        "containers"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/triage/",
      "url": "https://markata.dev/docs/guides/triage/",
      "title": "Triage a Markata problem with a coding agent",
      "content_html": "\u003ch2 id=\"troubleshooting-with-markata-triage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting with \u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003emarkata triage\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#troubleshooting-with-markata-triage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen your Markata site behaves unexpectedly, start with:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata triage\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eMarkata collects lightweight local diagnostics, then displays a \u003cstrong\u003efuzzy picker\u003c/strong\u003e with the coding agents it finds on your PATH. It also offers \u003cstrong\u003eCopy to clipboard\u003c/strong\u003e and \u003cstrong\u003ePrint to stdout\u003c/strong\u003e. Pick a coding agent and the agent opens with a troubleshooting prompt: it should \u003cstrong\u003eask you what happened first\u003c/strong\u003e, instead of making guesses or immediately modifying your site.\u003c/p\u003e\n\u003cp\u003eThe command works with the new \u003ccode\u003emarkata\u003c/code\u003e binary and the backwards-compatible \u003ccode\u003emarkata-go\u003c/code\u003e binary.\u003c/p\u003e\n\u003ch2 id=\"where-the-prompt-goes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhere the prompt goes\u003c/span\u003e \u003ca href=\"#where-the-prompt-goes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eBehavior\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkata triage\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFuzzy picker in an interactive terminal; prompt-only stdout when piped or redirected\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkata triage --to opencode\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eStart an interactive OpenCode session with an initial prompt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkata triage --to claude\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eStart an interactive Claude Code session with an initial prompt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkata triage --to codex\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eStart interactive Codex with an initial prompt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkata triage --to gemini\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eStart interactive Gemini CLI\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkata triage --to cursor\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eStart interactive Cursor Agent\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkata triage --to clipboard\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCopy the prompt using the platform\u0026rsquo;s clipboard helper\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkata triage --to stdout\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePrint only the Markdown prompt (ideal for pipes)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkata triage --agent codex\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAlias for selecting a specific installed agent\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkata triage --issue \u0026quot;Images are missing\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInclude a short first-hand problem description\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eHarness detection only checks that an executable is on PATH. It does not guarantee the agent is authenticated or configured with a model. Unsupported or missing agent names produce an error; clipboard and stdout still work.\u003c/p\u003e\n\u003cp\u003eFor Linux clipboard handoffs, install \u003ccode\u003ewl-copy\u003c/code\u003e, \u003ccode\u003exclip\u003c/code\u003e, or \u003ccode\u003exsel\u003c/code\u003e. macOS uses \u003ccode\u003epbcopy\u003c/code\u003e; Windows uses \u003ccode\u003eclip.exe\u003c/code\u003e. A missing helper is reported as an error; use stdout instead.\u003c/p\u003e\n\u003ch2 id=\"piping-to-an-agent\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePiping to an agent\u003c/span\u003e \u003ca href=\"#piping-to-an-agent\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003e--to stdout\u003c/code\u003e is clean Markdown with no banner, terminal formatting, or interactive picker. It can be redirected to a file or piped directly into another CLI:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Interactive picker disabled automatically in a pipe\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata triage --to stdout \u003cspan class=\"p\"\u003e|\u003c/span\u003e codex \u003cspan class=\"nb\"\u003eexec\u003c/span\u003e -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Use OpenCode\u0026#39;s noninteractive prompt runner\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata triage --to stdout \u003cspan class=\"p\"\u003e|\u003c/span\u003e opencode run\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Use Claude Code\u0026#39;s print mode\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata triage --to stdout \u003cspan class=\"p\"\u003e|\u003c/span\u003e claude -p\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Save and inspect the context before sharing it\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata triage --to stdout \u0026gt; triage-prompt.md\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePiped agent commands may be \u003cstrong\u003enoninteractive\u003c/strong\u003e. If you want the agent to ask questions back-and-forth in a terminal, use \u003ccode\u003e--to opencode\u003c/code\u003e, \u003ccode\u003e--to claude\u003c/code\u003e, etc., or select an agent from the fuzzy picker.\u003c/p\u003e\n\u003cp\u003eWith \u003ccode\u003e--no-input\u003c/code\u003e, or if stdin or stdout is not a terminal, the default \u003ccode\u003e--to auto\u003c/code\u003e prints to stdout; it never unexpectedly launches an agent. Explicit interactive agent launch requires a terminal. Press Escape to cancel the fuzzy picker without launching anything. Closing a pipe early (for example, \u003ccode\u003emarkata triage | head\u003c/code\u003e) exits quietly. The primary prompt remains plain and pipeable with \u003ccode\u003e--no-color\u003c/code\u003e, \u003ccode\u003eNO_COLOR\u003c/code\u003e, and \u003ccode\u003e--quiet\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eTriage remains available even when a requested \u003ccode\u003e--site-dir\u003c/code\u003e or \u003ccode\u003eMARKATA_GO_SITE_DIR\u003c/code\u003e directory is missing or inaccessible; it records that problem in its diagnostics instead of failing before collecting context. Config file contents are never parsed as part of triage.\u003c/p\u003e\n\u003ch2 id=\"what-is-collected\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat is collected\u003c/span\u003e \u003ca href=\"#what-is-collected\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe prompt describes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe \u003cstrong\u003erunning triage CLI\u0026rsquo;s\u003c/strong\u003e embedded version, commit, and build date\u003c/li\u003e\n\u003cli\u003eOperating system, architecture, Go runtime, and (on Linux) OS distribution\u003c/li\u003e\n\u003cli\u003eLocation of the Markata executable and an \u003cstrong\u003einferred\u003c/strong\u003e, not guaranteed, installation method\u003c/li\u003e\n\u003cli\u003eWorking/site directory and names of local Markata config files (or explicit config path)\u003c/li\u003e\n\u003cli\u003ePresence of a small allowlist of environment variables, \u003cstrong\u003enot their values\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eLinks to Markata\u0026rsquo;s source, documentation, and issue tracker\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIt does \u003cstrong\u003enot\u003c/strong\u003e read your configuration contents, logs, passwords, authentication tokens, arbitrary environment values, or other user files. Home-directory prefixes in paths are abbreviated when possible. Because paths may still be personal, \u003cstrong\u003einspect the prompt before sharing it publicly or sending it to a new provider\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eA key distinction: the Markata version used to generate the prompt may be different from the version that failed in production, Docker, CI, or a remote builder. The agent is instructed to ask which version and execution environment actually experienced the problem.\u003c/p\u003e\n\u003ch2 id=\"what-the-agent-should-do\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat the agent should do\u003c/span\u003e \u003ca href=\"#what-the-agent-should-do\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe prompt asks the agent to first understand your symptoms, intended behavior, reproduction steps, and exact errors. It should check whether the issue is with site content, configuration, templates, a plugin, installation, or Markata itself; investigate read-only first; and ask permission before changing files, running mutating commands, or publishing an upstream issue.\u003c/p\u003e\n\u003cp\u003eIf you already have a clear problem statement, add \u003ccode\u003e--issue\u003c/code\u003e and the agent should not make you repeat it.\u003c/p\u003e\n\u003cp\u003eFor common manual troubleshooting, see the \u003ca href=\"../troubleshooting.md\"\u003eTroubleshooting guide\u003c/a\u003e and the \u003ca href=\"../reference/cli.md\"\u003eCLI reference\u003c/a\u003e. The \u003ca href=\"https://github.com/WaylonWalker/markata\"\u003esource repository\u003c/a\u003e and \u003ca href=\"https://github.com/WaylonWalker/markata/issues\"\u003eissue tracker\u003c/a\u003e are available when a fix belongs upstream.\u003c/p\u003e\n",
      "content_text": "\n## Troubleshooting with `markata triage`\n\nWhen your Markata site behaves unexpectedly, start with:\n\n```sh\nmarkata triage\n```\n\nMarkata collects lightweight local diagnostics, then displays a **fuzzy picker** with the coding agents it finds on your PATH. It also offers **Copy to clipboard** and **Print to stdout**. Pick a coding agent and the agent opens with a troubleshooting prompt: it should **ask you what happened first**, instead of making guesses or immediately modifying your site.\n\nThe command works with the new `markata` binary and the backwards-compatible `markata-go` binary.\n\n## Where the prompt goes\n\n| Option | Behavior |\n| --- | --- |\n| `markata triage` | Fuzzy picker in an interactive terminal; prompt-only stdout when piped or redirected |\n| `markata triage --to opencode` | Start an interactive OpenCode session with an initial prompt |\n| `markata triage --to claude` | Start an interactive Claude Code session with an initial prompt |\n| `markata triage --to codex` | Start interactive Codex with an initial prompt |\n| `markata triage --to gemini` | Start interactive Gemini CLI |\n| `markata triage --to cursor` | Start interactive Cursor Agent |\n| `markata triage --to clipboard` | Copy the prompt using the platform's clipboard helper |\n| `markata triage --to stdout` | Print only the Markdown prompt (ideal for pipes) |\n| `markata triage --agent codex` | Alias for selecting a specific installed agent |\n| `markata triage --issue \"Images are missing\"` | Include a short first-hand problem description |\n\nHarness detection only checks that an executable is on PATH. It does not guarantee the agent is authenticated or configured with a model. Unsupported or missing agent names produce an error; clipboard and stdout still work.\n\nFor Linux clipboard handoffs, install `wl-copy`, `xclip`, or `xsel`. macOS uses `pbcopy`; Windows uses `clip.exe`. A missing helper is reported as an error; use stdout instead.\n\n## Piping to an agent\n\n`--to stdout` is clean Markdown with no banner, terminal formatting, or interactive picker. It can be redirected to a file or piped directly into another CLI:\n\n```sh\n# Interactive picker disabled automatically in a pipe\nmarkata triage --to stdout | codex exec -\n\n# Use OpenCode's noninteractive prompt runner\nmarkata triage --to stdout | opencode run\n\n# Use Claude Code's print mode\nmarkata triage --to stdout | claude -p\n\n# Save and inspect the context before sharing it\nmarkata triage --to stdout \u003e triage-prompt.md\n```\n\nPiped agent commands may be **noninteractive**. If you want the agent to ask questions back-and-forth in a terminal, use `--to opencode`, `--to claude`, etc., or select an agent from the fuzzy picker.\n\nWith `--no-input`, or if stdin or stdout is not a terminal, the default `--to auto` prints to stdout; it never unexpectedly launches an agent. Explicit interactive agent launch requires a terminal. Press Escape to cancel the fuzzy picker without launching anything. Closing a pipe early (for example, `markata triage | head`) exits quietly. The primary prompt remains plain and pipeable with `--no-color`, `NO_COLOR`, and `--quiet`.\n\nTriage remains available even when a requested `--site-dir` or `MARKATA_GO_SITE_DIR` directory is missing or inaccessible; it records that problem in its diagnostics instead of failing before collecting context. Config file contents are never parsed as part of triage.\n\n## What is collected\n\nThe prompt describes:\n- The **running triage CLI's** embedded version, commit, and build date\n- Operating system, architecture, Go runtime, and (on Linux) OS distribution\n- Location of the Markata executable and an **inferred**, not guaranteed, installation method\n- Working/site directory and names of local Markata config files (or explicit config path)\n- Presence of a small allowlist of environment variables, **not their values**\n- Links to Markata's source, documentation, and issue tracker\n\nIt does **not** read your configuration contents, logs, passwords, authentication tokens, arbitrary environment values, or other user files. Home-directory prefixes in paths are abbreviated when possible. Because paths may still be personal, **inspect the prompt before sharing it publicly or sending it to a new provider**.\n\nA key distinction: the Markata version used to generate the prompt may be different from the version that failed in production, Docker, CI, or a remote builder. The agent is instructed to ask which version and execution environment actually experienced the problem.\n\n## What the agent should do\n\nThe prompt asks the agent to first understand your symptoms, intended behavior, reproduction steps, and exact errors. It should check whether the issue is with site content, configuration, templates, a plugin, installation, or Markata itself; investigate read-only first; and ask permission before changing files, running mutating commands, or publishing an upstream issue.\n\nIf you already have a clear problem statement, add `--issue` and the agent should not make you repeat it.\n\nFor common manual troubleshooting, see the [Troubleshooting guide](../troubleshooting.md) and the [CLI reference](../reference/cli.md). The [source repository](https://github.com/WaylonWalker/markata) and [issue tracker](https://github.com/WaylonWalker/markata/issues) are available when a fix belongs upstream.\n",
      "summary": "Collect safe site diagnostics and start an interactive troubleshooting conversation, copy a prompt, or pipe it to an agent",
      "date_published": "2026-10-19T00:00:00Z",
      "date_modified": "2026-10-19T00:00:00Z",
      "tags": [
        "documentation",
        "troubleshooting",
        "agents",
        "cli"
      ]
    },
    {
      "id": "https://markata.dev/docs/quickstart/",
      "url": "https://markata.dev/docs/quickstart/",
      "title": "Quickstart",
      "content_html": "\u003cp\u003eAlready installed? This is the shortest path from an empty directory to a local website.\u003c/p\u003e\n\u003cp\u003eIf not, start with \u003ca href=\"/docs/installation/\"\u003eInstallation\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"1-create-your-site\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e1. Create your site\u003c/span\u003e \u003ca href=\"#1-create-your-site\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir my-site \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"nb\"\u003ecd\u003c/span\u003e my-site\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata config init\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata new \u003cspan class=\"s2\"\u003e\u0026#34;Hello World\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003econfig init\u003c/code\u003e creates \u003cstrong\u003e\u003ccode\u003emarkata-go.toml\u003c/code\u003e\u003c/strong\u003e. That\u0026rsquo;s the correct filename for the Go project today, despite the new command name.\u003c/p\u003e\n\u003ch2 id=\"2-preview-it\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e2. Preview it\u003c/span\u003e \u003ca href=\"#2-preview-it\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata serve\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOpen \u003ca href=\"http://localhost:8000\"\u003ehttp://localhost:8000\u003c/a\u003e. The development server watches for changes and rebuilds your site as you edit.\u003c/p\u003e\n\u003ch2 id=\"3-teach-your-agent\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e3. Teach your agent\u003c/span\u003e \u003ca href=\"#3-teach-your-agent\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata agent list-agents\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata agent install\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata agent doctor\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe default project install detects a supported agent or uses \u003ccode\u003e.agents/skills/markata-go-site/\u003c/code\u003e. For a specific harness:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata agent install --agent opencode\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# or: markata agent install --agent claude-code\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSee the \u003ca href=\"/docs/guides/agent-skills/\"\u003eagent guide\u003c/a\u003e for Codex, Cursor, Claude Code, OpenCode, and global installs.\u003c/p\u003e\n\u003ch2 id=\"4-write\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e4. Write\u003c/span\u003e \u003ca href=\"#4-write\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOpen \u003ccode\u003epages/post/hello-world.md\u003c/code\u003e. Edit the Markdown below its YAML frontmatter and save. Your browser should update.\u003c/p\u003e\n\u003cp\u003ePrefer a draft while working? Run:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata new \u003cspan class=\"s2\"\u003e\u0026#34;My draft\u0026#34;\u003c/span\u003e --draft\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSee \u003ca href=\"/docs/guides/authoring/\"\u003eAuthoring\u003c/a\u003e for a complete walk-through.\u003c/p\u003e\n\u003ch2 id=\"5-build-for-production\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e5. Build for production\u003c/span\u003e \u003ca href=\"#5-build-for-production\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe output is in \u003ccode\u003eoutput/\u003c/code\u003e by default. Deploy that \u003cstrong\u003egenerated\u003c/strong\u003e folder to any static host. Start with the \u003ca href=\"/docs/guides/deployment/\"\u003edeployment guide\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"need-help\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNeed help?\u003c/span\u003e \u003ca href=\"#need-help\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003emarkata --help\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emarkata config validate\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emarkata agent doctor\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/troubleshooting/\"\u003eTroubleshooting\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nAlready installed? This is the shortest path from an empty directory to a local website.\n\nIf not, start with [Installation](/docs/installation/).\n\n## 1. Create your site\n\n```bash\nmkdir my-site \u0026\u0026 cd my-site\nmarkata config init\nmarkata new \"Hello World\"\n```\n\n`config init` creates **`markata-go.toml`**. That's the correct filename for the Go project today, despite the new command name.\n\n## 2. Preview it\n\n```bash\nmarkata serve\n```\n\nOpen [http://localhost:8000](http://localhost:8000). The development server watches for changes and rebuilds your site as you edit.\n\n## 3. Teach your agent\n\n```bash\nmarkata agent list-agents\nmarkata agent install\nmarkata agent doctor\n```\n\nThe default project install detects a supported agent or uses `.agents/skills/markata-go-site/`. For a specific harness:\n\n```bash\nmarkata agent install --agent opencode\n# or: markata agent install --agent claude-code\n```\n\nSee the [agent guide](/docs/guides/agent-skills/) for Codex, Cursor, Claude Code, OpenCode, and global installs.\n\n## 4. Write\n\nOpen `pages/post/hello-world.md`. Edit the Markdown below its YAML frontmatter and save. Your browser should update.\n\nPrefer a draft while working? Run:\n\n```bash\nmarkata new \"My draft\" --draft\n```\n\nSee [Authoring](/docs/guides/authoring/) for a complete walk-through.\n\n## 5. Build for production\n\n```bash\nmarkata build\n```\n\nThe output is in `output/` by default. Deploy that **generated** folder to any static host. Start with the [deployment guide](/docs/guides/deployment/).\n\n## Need help?\n\n- `markata --help`\n- `markata config validate`\n- `markata agent doctor`\n- [Troubleshooting](/docs/troubleshooting/)\n",
      "summary": "Build your first Markata site, install the agent skill, and write a post.",
      "date_published": "2026-10-18T00:00:00Z",
      "date_modified": "2026-10-18T00:00:00Z",
      "tags": [
        "documentation",
        "getting-started"
      ]
    },
    {
      "id": "https://markata.dev/docs/installation/",
      "url": "https://markata.dev/docs/installation/",
      "title": "Install Markata",
      "content_html": "\u003cp\u003eThe preferred executable is \u003cstrong\u003e\u003ccode\u003emarkata\u003c/code\u003e\u003c/strong\u003e. The installer also installs the compatibility command \u003cstrong\u003e\u003ccode\u003emarkata-go\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eMarkata is a single Go binary; you do not need Python to run it. Choose your installation method.\u003c/p\u003e\n\u003ch2 id=\"curl-linux-macos\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCurl (Linux / macOS)\u003c/span\u003e \u003ca href=\"#curl-linux-macos\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRead \u003ca href=\"https://github.com/WaylonWalker/markata/blob/main/install.sh\"\u003ethe installer source\u003c/a\u003e before running it, especially on managed machines.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -fsSL https://raw.githubusercontent.com/WaylonWalker/markata/main/install.sh \u003cspan class=\"p\"\u003e|\u003c/span\u003e bash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis checks GitHub Releases, detects platform and architecture, and installs into a writable binary directory (usually \u003ccode\u003e~/.local/bin\u003c/code\u003e for non-root users). Add that directory to your \u003ccode\u003ePATH\u003c/code\u003e if necessary.\u003c/p\u003e\n\u003ch2 id=\"bash-download-then-inspect\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBash (download then inspect)\u003c/span\u003e \u003ca href=\"#bash-download-then-inspect\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -fsSLo install-markata.sh https://raw.githubusercontent.com/WaylonWalker/markata/main/install.sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eless install-markata.sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebash install-markata.sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo choose an install location or a version, pass variables to \u003cstrong\u003ethe Bash process\u003c/strong\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_INSTALL_DIR\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$HOME\u003c/span\u003e\u003cspan class=\"s2\"\u003e/.local/bin\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_VERSION\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;v0.13.0\u0026#34;\u003c/span\u003e bash install-markata.sh\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe script refuses to overwrite an unrelated \u003ccode\u003emarkata\u003c/code\u003e executable, including one belonging to Python Markata.\u003c/p\u003e\n\u003ch2 id=\"mise\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003emise\u003c/span\u003e \u003ca href=\"#mise\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eInstall from GitHub Releases:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emise use -g github:WaylonWalker/markata\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr omit \u003ccode\u003e-g\u003c/code\u003e to pin it in your project\u0026rsquo;s mise configuration. Check the installed command name: historical release archives may still contain \u003ccode\u003emarkata-go\u003c/code\u003e rather than \u003ccode\u003emarkata\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"github-download\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGitHub download\u003c/span\u003e \u003ca href=\"#github-download\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGet the archive for your operating system and architecture from \u003ca href=\"https://github.com/WaylonWalker/markata/releases\"\u003eGitHub Releases\u003c/a\u003e. Verify its checksum against the accompanying \u003ccode\u003echecksums.txt\u003c/code\u003e, extract it, and put the executable on your \u003ccode\u003ePATH\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eHistorical v0.13.0 release archives are named \u003ccode\u003emarkata-go_\u0026lt;version\u0026gt;_\u0026lt;os\u0026gt;_\u0026lt;arch\u0026gt;.tar.gz\u003c/code\u003e (Windows uses \u003ccode\u003e.zip\u003c/code\u003e). New releases may use \u003ccode\u003emarkata_...\u003c/code\u003e. Do not guess archive filenames: select one from the actual release assets.\u003c/p\u003e\n\u003ch2 id=\"go-source-build\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGo (source build)\u003c/span\u003e \u003ca href=\"#go-source-build\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse \u003cstrong\u003eGo 1.27 or newer\u003c/strong\u003e for the current source module:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego install github.com/WaylonWalker/markata/cmd/markata@main\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUntil a release tag contains the new entry point, use \u003ccode\u003e@main\u003c/code\u003e for this canonical command rather than \u003ccode\u003e@latest\u003c/code\u003e. Make sure \u003ccode\u003e$(go env GOPATH)/bin\u003c/code\u003e is in \u003ccode\u003ePATH\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"pypi-uv-uvx-pip-pipx\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePyPI (uv, uvx, pip, pipx)\u003c/span\u003e \u003ca href=\"#pypi-uv-uvx-pip-pipx\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe current \u003ccode\u003emarkata\u003c/code\u003e PyPI distribution installs the Go CLI following the version break from the original Python implementation. Existing Python-era versions remain available when explicitly pinned; the Python source lives in \u003ca href=\"https://github.com/WaylonWalker/markata-py\"\u003emarkata-py\u003c/a\u003e. This is a CLI transition, not Python API compatibility.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv tool install markata\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euvx markata --help\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install markata\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epipx install markata\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse one installation method. On platforms without a matching Go binary wheel, check the selected package version and executable rather than assuming a compatible wheel is available.\u003c/p\u003e\n\u003ch2 id=\"verify-and-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVerify and start\u003c/span\u003e \u003ca href=\"#verify-and-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata --help\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir my-site \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"nb\"\u003ecd\u003c/span\u003e my-site\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata config init\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata new \u003cspan class=\"s2\"\u003e\u0026#34;Hello World\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata serve\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eContinue with the \u003ca href=\"/docs/quickstart/\"\u003equickstart\u003c/a\u003e. If you already use \u003ccode\u003emarkata-go\u003c/code\u003e, that command remains supported. Keep your \u003ccode\u003emarkata-go.toml\u003c/code\u003e filename and \u003ccode\u003e[markata-go]\u003c/code\u003e configuration section; the Go config file has \u003cstrong\u003enot\u003c/strong\u003e been renamed. See \u003ca href=\"/docs/guides/name-migration/\"\u003eNaming migration\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eFor more options, check \u003ca href=\"/docs/troubleshooting/\"\u003etroubleshooting\u003c/a\u003e and \u003ca href=\"https://github.com/WaylonWalker/markata/releases\"\u003ethe release list\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"troubleshooting-with-an-agent\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting with an agent\u003c/span\u003e \u003ca href=\"#troubleshooting-with-an-agent\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRun \u003ccode\u003emarkata triage\u003c/code\u003e to gather a bounded diagnostic prompt and choose a detected coding agent, clipboard, or stdout. See the \u003ca href=\"/docs/guides/triage/\"\u003etriage guide\u003c/a\u003e.\u003c/p\u003e\n",
      "content_text": "\n\nThe preferred executable is **`markata`**. The installer also installs the compatibility command **`markata-go`**.\n\nMarkata is a single Go binary; you do not need Python to run it. Choose your installation method.\n\n## Curl (Linux / macOS)\n\nRead [the installer source](https://github.com/WaylonWalker/markata/blob/main/install.sh) before running it, especially on managed machines.\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/WaylonWalker/markata/main/install.sh | bash\nmarkata version\n```\n\nThis checks GitHub Releases, detects platform and architecture, and installs into a writable binary directory (usually `~/.local/bin` for non-root users). Add that directory to your `PATH` if necessary.\n\n## Bash (download then inspect)\n\n```bash\ncurl -fsSLo install-markata.sh https://raw.githubusercontent.com/WaylonWalker/markata/main/install.sh\nless install-markata.sh\nbash install-markata.sh\nmarkata version\n```\n\nTo choose an install location or a version, pass variables to **the Bash process**:\n\n```bash\nMARKATA_INSTALL_DIR=\"$HOME/.local/bin\" MARKATA_VERSION=\"v0.13.0\" bash install-markata.sh\n```\n\nThe script refuses to overwrite an unrelated `markata` executable, including one belonging to Python Markata.\n\n## mise\n\nInstall from GitHub Releases:\n\n```bash\nmise use -g github:WaylonWalker/markata\nmarkata version\n```\n\nOr omit `-g` to pin it in your project's mise configuration. Check the installed command name: historical release archives may still contain `markata-go` rather than `markata`.\n\n## GitHub download\n\nGet the archive for your operating system and architecture from [GitHub Releases](https://github.com/WaylonWalker/markata/releases). Verify its checksum against the accompanying `checksums.txt`, extract it, and put the executable on your `PATH`.\n\nHistorical v0.13.0 release archives are named `markata-go_\u003cversion\u003e_\u003cos\u003e_\u003carch\u003e.tar.gz` (Windows uses `.zip`). New releases may use `markata_...`. Do not guess archive filenames: select one from the actual release assets.\n\n## Go (source build)\n\nUse **Go 1.27 or newer** for the current source module:\n\n```bash\ngo install github.com/WaylonWalker/markata/cmd/markata@main\nmarkata version\n```\n\nUntil a release tag contains the new entry point, use `@main` for this canonical command rather than `@latest`. Make sure `$(go env GOPATH)/bin` is in `PATH`.\n\n## PyPI (uv, uvx, pip, pipx)\n\nThe current `markata` PyPI distribution installs the Go CLI following the version break from the original Python implementation. Existing Python-era versions remain available when explicitly pinned; the Python source lives in [markata-py](https://github.com/WaylonWalker/markata-py). This is a CLI transition, not Python API compatibility.\n\n```bash\nuv tool install markata\nuvx markata --help\npip install markata\npipx install markata\n```\n\nUse one installation method. On platforms without a matching Go binary wheel, check the selected package version and executable rather than assuming a compatible wheel is available.\n\n## Verify and start\n\n```bash\nmarkata version\nmarkata --help\nmkdir my-site \u0026\u0026 cd my-site\nmarkata config init\nmarkata new \"Hello World\"\nmarkata serve\n```\n\nContinue with the [quickstart](/docs/quickstart/). If you already use `markata-go`, that command remains supported. Keep your `markata-go.toml` filename and `[markata-go]` configuration section; the Go config file has **not** been renamed. See [Naming migration](/docs/guides/name-migration/).\n\nFor more options, check [troubleshooting](/docs/troubleshooting/) and [the release list](https://github.com/WaylonWalker/markata/releases).\n\n## Troubleshooting with an agent\n\nRun `markata triage` to gather a bounded diagnostic prompt and choose a detected coding agent, clipboard, or stdout. See the [triage guide](/docs/guides/triage/).\n",
      "summary": "Install the Go static site generator with curl, mise, uv, pip, GitHub Releases, or Go.",
      "date_published": "2026-10-18T00:00:00Z",
      "date_modified": "2026-10-18T00:00:00Z",
      "tags": [
        "documentation",
        "installation"
      ]
    },
    {
      "id": "https://markata.dev/",
      "url": "https://markata.dev/",
      "title": "Markata documentation",
      "content_html": "\u003cp\u003e\u003cstrong\u003eA fast static site generator for people and their agents.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eLet\u0026rsquo;s be honest. We\u0026rsquo;re all running agents these days. They manage everything.\u003c/p\u003e\n\u003cp\u003eWrite Markdown. Give your agent the right context. Publish a site you own.\u003c/p\u003e\n\u003ch2 id=\"start-here\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStart here\u003c/span\u003e \u003ca href=\"#start-here\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"/docs/installation/\"\u003eInstall Markata\u003c/a\u003e using curl, a shell, mise, GitHub Releases, or Go.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/quickstart/\"\u003eQuickstart\u003c/a\u003e — create your first site and preview it locally.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/agent-skills/\"\u003eSet up your agent\u003c/a\u003e — install the bundled \u003ccode\u003emarkata-go-site\u003c/code\u003e skill.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/authoring/\"\u003eWrite your first post\u003c/a\u003e — Markdown, frontmatter, drafts, images, and links.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/deployment/\"\u003ePublish\u003c/a\u003e — deploy the generated static files.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"explore-as-you-grow\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExplore as you grow\u003c/span\u003e \u003ca href=\"#explore-as-you-grow\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfiguration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/themes/\"\u003eThemes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/feeds/\"\u003eFeeds and RSS\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/templates/\"\u003eTemplates\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/reference/plugins/\"\u003ePlugins\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/reference/cli/\"\u003eCLI reference\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/name-migration/\"\u003eNaming migration\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"releases\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReleases\u003c/span\u003e \u003ca href=\"#releases\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/releases/v0.14.0/\"\u003ev0.14.0 release notes\u003c/a\u003e — what\u0026rsquo;s new, compatibility and upgrade guidance (release preparation)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/releasing/\"\u003eRelease and deployment runbook\u003c/a\u003e — tag, artifacts, GitOps rollout, build verification and rollback\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eMarkata is still \u003cstrong\u003e0.x\u003c/strong\u003e. The older \u003ccode\u003emarkata-go\u003c/code\u003e command remains compatible. New Go sites should continue to use \u003ccode\u003emarkata-go.toml\u003c/code\u003e and \u003ccode\u003e[markata-go]\u003c/code\u003e until the configuration migration is complete.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePyPI version break:\u003c/strong\u003e Current \u003ccode\u003emarkata\u003c/code\u003e releases install the Go CLI; older pinned releases remain the original Python implementation. See \u003ca href=\"/docs/installation/\"\u003einstallation\u003c/a\u003e for details.\u003c/p\u003e\n\u003cp\u003eIf something fails, run \u003ccode\u003emarkata triage\u003c/code\u003e or see the \u003ca href=\"/docs/guides/triage/\"\u003etriage guide\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eUse Markata in a web application: \u003ca href=\"/docs/guides/python-renderer/\"\u003ePython and FastAPI rendering\u003c/a\u003e,\nthe \u003ca href=\"/docs/guides/go-workbench/\"\u003eGo workbench\u003c/a\u003e, or the \u003ca href=\"/docs/guides/wasm-workbench/\"\u003ebrowser WASM workbench\u003c/a\u003e.\nSee \u003ca href=\"/docs/guides/renderer-integration-benchmarks/\"\u003erenderer integration benchmarks\u003c/a\u003e for measured timings.\u003c/p\u003e\n",
      "content_text": "\n\n**A fast static site generator for people and their agents.**\n\nLet's be honest. We're all running agents these days. They manage everything.\n\nWrite Markdown. Give your agent the right context. Publish a site you own.\n\n## Start here\n\n1. [Install Markata](/docs/installation/) using curl, a shell, mise, GitHub Releases, or Go.\n2. [Quickstart](/docs/quickstart/) — create your first site and preview it locally.\n3. [Set up your agent](/docs/guides/agent-skills/) — install the bundled `markata-go-site` skill.\n4. [Write your first post](/docs/guides/authoring/) — Markdown, frontmatter, drafts, images, and links.\n5. [Publish](/docs/guides/deployment/) — deploy the generated static files.\n\n## Explore as you grow\n\n- [Configuration](/docs/guides/configuration/)\n- [Themes](/docs/guides/themes/)\n- [Feeds and RSS](/docs/guides/feeds/)\n- [Templates](/docs/guides/templates/)\n- [Plugins](/docs/reference/plugins/)\n- [CLI reference](/docs/reference/cli/)\n- [Naming migration](/docs/guides/name-migration/)\n\n## Releases\n\n- [v0.14.0 release notes](/docs/releases/v0.14.0/) — what's new, compatibility and upgrade guidance (release preparation)\n- [Release and deployment runbook](/docs/guides/releasing/) — tag, artifacts, GitOps rollout, build verification and rollback\n\nMarkata is still **0.x**. The older `markata-go` command remains compatible. New Go sites should continue to use `markata-go.toml` and `[markata-go]` until the configuration migration is complete.\n\n**PyPI version break:** Current `markata` releases install the Go CLI; older pinned releases remain the original Python implementation. See [installation](/docs/installation/) for details.\n\nIf something fails, run `markata triage` or see the [triage guide](/docs/guides/triage/).\n\nUse Markata in a web application: [Python and FastAPI rendering](/docs/guides/python-renderer/),\nthe [Go workbench](/docs/guides/go-workbench/), or the [browser WASM workbench](/docs/guides/wasm-workbench/).\nSee [renderer integration benchmarks](/docs/guides/renderer-integration-benchmarks/) for measured timings.\n",
      "summary": "Install Markata, teach your agent the site skill, and publish your first Markdown page.",
      "date_published": "2026-10-18T00:00:00Z",
      "date_modified": "2026-10-18T00:00:00Z",
      "tags": [
        "documentation",
        "getting-started"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/repository-cutover/",
      "url": "https://markata.dev/docs/guides/repository-cutover/",
      "title": "Markata GitHub repository cutover — owner runbook",
      "content_html": "\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eHistorical runbook:\u003c/strong\u003e The GitHub repository swap was completed on\nOctober 18, 2026. Do \u003cstrong\u003enot\u003c/strong\u003e rerun the rename command. Go is at\n\u003ccode\u003eWaylonWalker/markata\u003c/code\u003e and Python at \u003ccode\u003eWaylonWalker/markata-py\u003c/code\u003e; the Go\nproject remains on \u003cstrong\u003e0.x\u003c/strong\u003e without a release tag planned by this migration.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eNo release tag, PyPI overwrite, or production deployment\u003c/strong\u003e is implied\nby a repository rename. Source-path, package and deployment migrations\nare separate gates.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"identity-and-sequencing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIdentity and sequencing\u003c/span\u003e \u003ca href=\"#identity-and-sequencing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eGitHub repository\u003c/th\u003e\n\u003cth\u003eBefore\u003c/th\u003e\n\u003cth\u003eAfter\u003c/th\u003e\n\u003cth\u003eStable repository ID\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eHistorical Python\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eWaylonWalker/markata\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eWaylonWalker/markata-py\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e333449359\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eNew Go implementation\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eWaylonWalker/markata-go\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eWaylonWalker/markata\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e1140034778\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eOrder is mandatory.\u003c/strong\u003e The Python repository must vacate \u003ccode\u003emarkata\u003c/code\u003e before the\nGo repository can claim it. When Go takes over \u003ccode\u003eWaylonWalker/markata\u003c/code\u003e, existing\nPython links to that name will start opening the \u003cstrong\u003eGo repository\u003c/strong\u003e, not Python.\nDo not rely on GitHub redirects to keep Python bookmarks pointing to Python.\u003c/p\u003e\n\u003cp\u003eThe GitHub connector currently does not expose repository rename permissions.\nAn owner can use repository Settings → General → Repository name, or the guarded\nscript below with an authenticated \u003ccode\u003egh\u003c/code\u003e CLI that has repository administration\npermissions.\u003c/p\u003e\n\u003ch2 id=\"before-moving-either-repository\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBefore moving either repository\u003c/span\u003e \u003ca href=\"#before-moving-either-repository\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eConfirm \u003ca href=\"https://github.com/WaylonWalker/markata-py/pull/175\"\u003ePython PR #175\u003c/a\u003e\n(identity notice) and \u003ca href=\"https://github.com/WaylonWalker/markata-py/pull/176\"\u003e#176\u003c/a\u003e\n(disable automatic PyPI publishing, stabilize Python source URLs) are merged.\u003c/li\u003e\n\u003cli\u003eConfirm Go \u003ca href=\"https://github.com/WaylonWalker/markata/pull/1629\"\u003e#1629\u003c/a\u003e\n(dual CLI), \u003ca href=\"https://github.com/WaylonWalker/markata/pull/1671\"\u003e#1671\u003c/a\u003e\n(canonical/legacy config environment aliases),\n\u003ca href=\"https://github.com/WaylonWalker/markata/pull/1672\"\u003e#1672\u003c/a\u003e\n(legacy/canonical GHCR images), and\n\u003ca href=\"https://github.com/WaylonWalker/markata/pull/1673\"\u003e#1673\u003c/a\u003e\n(GoReleaser release target) are merged.\u003c/li\u003e\n\u003cli\u003eVerify GitHub Actions, branch rulesets, collaborators, Cloudflare Pages\nintegrations, GitHub Apps and registry publication rights for both repos.\nConfirm the current Go production builder image is still retrievable.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDo not\u003c/strong\u003e publish another Python package to PyPI as an incidental result of\na code/metadata edit. PyPI \u003ccode\u003emarkata\u003c/code\u003e is still the historic Python package.\n\u003ccode\u003emarkata-py\u003c/code\u003e is not automatically a new PyPI distribution.\u003c/li\u003e\n\u003cli\u003eDo not change site configs called \u003ccode\u003emarkata-go.toml\u003c/code\u003e, old Go module paths,\nsealed secrets, existing PVC names, Kubernetes Service identities, or Helm\nrelease names simply to match branding.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eRun from a clone of the \u003cstrong\u003eGo\u003c/strong\u003e repository:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egh auth status\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebash scripts/markata-repo-cutover.sh preflight\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe script checks immutable GitHub repository IDs, merged preparation PRs and\nthat \u003ccode\u003emarkata-py\u003c/code\u003e is unoccupied. It refuses ambiguous API/auth failures.\u003c/p\u003e\n\u003ch2 id=\"perform-the-owner-level-rename\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePerform the owner-level rename\u003c/span\u003e \u003ca href=\"#perform-the-owner-level-rename\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse GitHub Settings manually in the exact order above, \u003cstrong\u003eor\u003c/strong\u003e run:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebash scripts/markata-repo-cutover.sh apply --execute\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis requires an interactive explicit confirmation and checks repository IDs\nboth before and after each rename. \u003cstrong\u003eThere is no automatic rollback.\u003c/strong\u003e If the\nfirst rename succeeds and the second fails, stop and diagnose the second\nfailure; Python will already be at \u003ccode\u003emarkata-py\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eOnce done, re-clone the Go repository or update its checkout:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit remote set-url origin https://github.com/WaylonWalker/markata.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit remote -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebash scripts/markata-repo-cutover.sh postcheck\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor Python checkouts, point \u003ccode\u003eorigin\u003c/code\u003e to\n\u003ccode\u003ehttps://github.com/WaylonWalker/markata-py.git\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"post-swap-compatibility-work-while-remaining-on-0-x\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePost-swap compatibility work — while remaining on 0.x\u003c/span\u003e \u003ca href=\"#post-swap-compatibility-work-while-remaining-on-0-x\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eGo source/module:\u003c/strong\u003e migrate \u003ccode\u003ego.mod\u003c/code\u003e, import paths, generated code,\nbuild/linker flags, GoReleaser import targets, CI, embedded paths, and\ncode generators to \u003ccode\u003egithub.com/WaylonWalker/markata\u003c/code\u003e together. Test\n\u003ccode\u003ego test ./...\u003c/code\u003e, representative external Go consumers, cross-platform\ninstalls and \u003ccode\u003ego mod tidy\u003c/code\u003e. Never silently rewrite historical Python\n\u003ccode\u003emarkata.toml\u003c/code\u003e configuration or convert its semantics to Go.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eInstaller/docs:\u003c/strong\u003e update canonical install scripts, release links,\nREADME badges, bundled agent skill and documentation to the \u003cem\u003enew\u003c/em\u003e Go\nrepository. Keep both \u003ccode\u003emarkata\u003c/code\u003e and \u003ccode\u003emarkata-go\u003c/code\u003e executables and\nold release archives. A raw.githubusercontent.com URL pointing at an old\nrepository path must not be assumed to redirect after the move.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eImages/Argo:\u003c/strong\u003e verify the Docker job pushes identical tagged content to\n\u003ccode\u003eghcr.io/waylonwalker/markata\u003c/code\u003e,\n\u003ccode\u003eghcr.io/waylonwalker/markata-go\u003c/code\u003e,\n\u003ccode\u003eghcr.io/waylonwalker/markata-builder\u003c/code\u003e, and\n\u003ccode\u003eghcr.io/waylonwalker/markata-go-builder\u003c/code\u003e after the repo rename.\nConfirm GHCR Actions permissions to create/push the new package names.\nPin images by digest when practical; do not delete old image tags.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eHome infrastructure:\u003c/strong\u003e audit \u003ccode\u003eWaylonWalker/homelab-argo\u003c/code\u003e Argo\nsources and their repo access credentials, especially:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eargo-apps/apps/waylonwalker-com-prod.yaml\u003c/code\u003e (currently pinned to a commit)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eargo-apps/apps/go-waylonwalker-com.yaml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eargo-apps/apps/wyattbubbylee-com-prod.yaml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eargo-apps/apps/rhiannonwalker-com-prod.yaml\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTheir Git repository URLs were updated by \u003ca href=\"https://github.com/WaylonWalker/homelab-argo/pull/111\"\u003ehomelab-argo#111\u003c/a\u003e.\nVerify actual Argo CD repository access and application health rather than\ntreating a PR merge as successful production reconciliation. Also audit\n\u003ccode\u003ek8s/recipes-waylonwalker-com/\u003c/code\u003e and \u003ccode\u003ek8s/rhiannonwalker/source-seed-job.yaml\u003c/code\u003e\nfor historical builder images. Separate cosmetic renaming from functional\nKubernetes resource changes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003ePython archival:\u003c/strong\u003e verify Python source/issue/docs URLs and Cloudflare\npages deployments point to \u003ccode\u003emarkata-py\u003c/code\u003e. Preserve old Python tags,\nimport namespace and current installations. Plan PyPI \u003ccode\u003emarkata-py\u003c/code\u003e\ndistribution/alias separately rather than overwriting \u003ccode\u003emarkata\u003c/code\u003e with\nan untested Go wrapper.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eOngoing 0.x validation:\u003c/strong\u003e check old/new CLI parity on representative\nsites, installer compatibility, archive formats, Go consumers,\nDocker/Helm production smoke, registry permissions and GitHub source paths.\nSnapshot packaging can be tested without publishing a release. Any\nversioned tag requires a separate explicit decision; \u003cstrong\u003eno 1.0 release or\nrelease candidate is planned as part of the rename\u003c/strong\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eTracker: \u003ca href=\"https://github.com/WaylonWalker/markata/issues/1628\"\u003ehttps://github.com/WaylonWalker/markata/issues/1628\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\n\n\u003e **Historical runbook:** The GitHub repository swap was completed on\n\u003e October 18, 2026. Do **not** rerun the rename command. Go is at\n\u003e `WaylonWalker/markata` and Python at `WaylonWalker/markata-py`; the Go\n\u003e project remains on **0.x** without a release tag planned by this migration.\n\n\u003e **No release tag, PyPI overwrite, or production deployment** is implied\n\u003e by a repository rename. Source-path, package and deployment migrations\n\u003e are separate gates.\n\n## Identity and sequencing\n\n| GitHub repository | Before | After | Stable repository ID |\n| --- | --- | --- | --- |\n| Historical Python | `WaylonWalker/markata` | `WaylonWalker/markata-py` | `333449359` |\n| New Go implementation | `WaylonWalker/markata-go` | `WaylonWalker/markata` | `1140034778` |\n\n**Order is mandatory.** The Python repository must vacate `markata` before the\nGo repository can claim it. When Go takes over `WaylonWalker/markata`, existing\nPython links to that name will start opening the **Go repository**, not Python.\nDo not rely on GitHub redirects to keep Python bookmarks pointing to Python.\n\nThe GitHub connector currently does not expose repository rename permissions.\nAn owner can use repository Settings → General → Repository name, or the guarded\nscript below with an authenticated `gh` CLI that has repository administration\npermissions.\n\n## Before moving either repository\n\n- Confirm [Python PR #175](https://github.com/WaylonWalker/markata-py/pull/175)\n  (identity notice) and [#176](https://github.com/WaylonWalker/markata-py/pull/176)\n  (disable automatic PyPI publishing, stabilize Python source URLs) are merged.\n- Confirm Go [#1629](https://github.com/WaylonWalker/markata/pull/1629)\n  (dual CLI), [#1671](https://github.com/WaylonWalker/markata/pull/1671)\n  (canonical/legacy config environment aliases),\n  [#1672](https://github.com/WaylonWalker/markata/pull/1672)\n  (legacy/canonical GHCR images), and\n  [#1673](https://github.com/WaylonWalker/markata/pull/1673)\n  (GoReleaser release target) are merged.\n- Verify GitHub Actions, branch rulesets, collaborators, Cloudflare Pages\n  integrations, GitHub Apps and registry publication rights for both repos.\n  Confirm the current Go production builder image is still retrievable.\n- **Do not** publish another Python package to PyPI as an incidental result of\n  a code/metadata edit. PyPI `markata` is still the historic Python package.\n  `markata-py` is not automatically a new PyPI distribution.\n- Do not change site configs called `markata-go.toml`, old Go module paths,\n  sealed secrets, existing PVC names, Kubernetes Service identities, or Helm\n  release names simply to match branding.\n\nRun from a clone of the **Go** repository:\n\n```bash\ngh auth status\nbash scripts/markata-repo-cutover.sh preflight\n```\n\nThe script checks immutable GitHub repository IDs, merged preparation PRs and\nthat `markata-py` is unoccupied. It refuses ambiguous API/auth failures.\n\n## Perform the owner-level rename\n\nUse GitHub Settings manually in the exact order above, **or** run:\n\n```bash\nbash scripts/markata-repo-cutover.sh apply --execute\n```\n\nThis requires an interactive explicit confirmation and checks repository IDs\nboth before and after each rename. **There is no automatic rollback.** If the\nfirst rename succeeds and the second fails, stop and diagnose the second\nfailure; Python will already be at `markata-py`.\n\nOnce done, re-clone the Go repository or update its checkout:\n\n```bash\ngit remote set-url origin https://github.com/WaylonWalker/markata.git\ngit remote -v\nbash scripts/markata-repo-cutover.sh postcheck\n```\n\nFor Python checkouts, point `origin` to\n`https://github.com/WaylonWalker/markata-py.git`.\n\n## Post-swap compatibility work — while remaining on 0.x\n\n1. **Go source/module:** migrate `go.mod`, import paths, generated code,\n   build/linker flags, GoReleaser import targets, CI, embedded paths, and\n   code generators to `github.com/WaylonWalker/markata` together. Test\n   `go test ./...`, representative external Go consumers, cross-platform\n   installs and `go mod tidy`. Never silently rewrite historical Python\n   `markata.toml` configuration or convert its semantics to Go.\n2. **Installer/docs:** update canonical install scripts, release links,\n   README badges, bundled agent skill and documentation to the *new* Go\n   repository. Keep both `markata` and `markata-go` executables and\n   old release archives. A raw.githubusercontent.com URL pointing at an old\n   repository path must not be assumed to redirect after the move.\n3. **Images/Argo:** verify the Docker job pushes identical tagged content to\n   `ghcr.io/waylonwalker/markata`,\n   `ghcr.io/waylonwalker/markata-go`,\n   `ghcr.io/waylonwalker/markata-builder`, and\n   `ghcr.io/waylonwalker/markata-go-builder` after the repo rename.\n   Confirm GHCR Actions permissions to create/push the new package names.\n   Pin images by digest when practical; do not delete old image tags.\n4. **Home infrastructure:** audit `WaylonWalker/homelab-argo` Argo\n   sources and their repo access credentials, especially:\n\n   - `argo-apps/apps/waylonwalker-com-prod.yaml` (currently pinned to a commit)\n   - `argo-apps/apps/go-waylonwalker-com.yaml`\n   - `argo-apps/apps/wyattbubbylee-com-prod.yaml`\n   - `argo-apps/apps/rhiannonwalker-com-prod.yaml`\n\n   Their Git repository URLs were updated by [homelab-argo#111](https://github.com/WaylonWalker/homelab-argo/pull/111).\n   Verify actual Argo CD repository access and application health rather than\n   treating a PR merge as successful production reconciliation. Also audit\n   `k8s/recipes-waylonwalker-com/` and `k8s/rhiannonwalker/source-seed-job.yaml`\n   for historical builder images. Separate cosmetic renaming from functional\n   Kubernetes resource changes.\n5. **Python archival:** verify Python source/issue/docs URLs and Cloudflare\n   pages deployments point to `markata-py`. Preserve old Python tags,\n   import namespace and current installations. Plan PyPI `markata-py`\n   distribution/alias separately rather than overwriting `markata` with\n   an untested Go wrapper.\n6. **Ongoing 0.x validation:** check old/new CLI parity on representative\n   sites, installer compatibility, archive formats, Go consumers,\n   Docker/Helm production smoke, registry permissions and GitHub source paths.\n   Snapshot packaging can be tested without publishing a release. Any\n   versioned tag requires a separate explicit decision; **no 1.0 release or\n   release candidate is planned as part of the rename**.\n\nTracker: https://github.com/WaylonWalker/markata/issues/1628\n",
      "summary": "| GitHub repository | Before | After | Stable repository ID |",
      "date_published": "2026-10-18T00:00:00Z",
      "date_modified": "2026-10-18T00:00:00Z",
      "tags": [
        "documentation"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/authoring/",
      "url": "https://markata.dev/docs/guides/authoring/",
      "title": "Write your first post",
      "content_html": "\u003cp\u003eYou don\u0026rsquo;t need templates or plugins to start. \u003cstrong\u003eMarkdown is the source.\u003c/strong\u003e Markata turns it into pages.\u003c/p\u003e\n\u003ch2 id=\"create-a-post\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCreate a post\u003c/span\u003e \u003ca href=\"#create-a-post\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFrom your site directory:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata new \u003cspan class=\"s2\"\u003e\u0026#34;Hello, internet\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis normally creates \u003ccode\u003epages/post/hello-internet.md\u003c/code\u003e. Open it in your editor.\u003c/p\u003e\n\u003cp\u003eYou\u0026rsquo;ll see YAML frontmatter between two \u003ccode\u003e---\u003c/code\u003e lines. The body is ordinary Markdown.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Hello, internet\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2026-10-18\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edraft\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;notes\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;web\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My first post with Markata.\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHello, internet. I\u0026#39;m building a little corner of the web.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Why this exists\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eI want somewhere to write and share what I\u0026#39;m learning.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHere\u0026#39;s \u003cspan class=\"gs\"\u003e**bold text**\u003c/span\u003e, a [\u003cspan class=\"nt\"\u003elink\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://example.com\u003c/span\u003e), and a list:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e Make something small\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e Publish it\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e Improve it later\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eKeep the frontmatter simple: \u003ccode\u003etitle\u003c/code\u003e, \u003ccode\u003edate\u003c/code\u003e, \u003ccode\u003epublished\u003c/code\u003e, \u003ccode\u003edraft\u003c/code\u003e, and optional \u003ccode\u003etags\u003c/code\u003e are enough to begin. Markata can infer a slug, and additional frontmatter fields are available to templates.\u003c/p\u003e\n\u003ch2 id=\"preview-your-words\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePreview your words\u003c/span\u003e \u003ca href=\"#preview-your-words\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata serve\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eVisit \u003ca href=\"http://localhost:8000\"\u003ehttp://localhost:8000\u003c/a\u003e. Save your post; the development server rebuilds it. The page URL depends on your slug and theme configuration.\u003c/p\u003e\n\u003ch2 id=\"draft-before-you-publish\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDraft before you publish\u003c/span\u003e \u003ca href=\"#draft-before-you-publish\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata new \u003cspan class=\"s2\"\u003e\u0026#34;An unfinished idea\u0026#34;\u003c/span\u003e --draft\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor an existing post, set \u003ccode\u003edraft: true\u003c/code\u003e. To publish, set \u003ccode\u003edraft: false\u003c/code\u003e and \u003ccode\u003epublished: true\u003c/code\u003e, then rebuild. Draft handling also depends on feed filters: do not assume a draft is publicly hidden if you override the default feed configuration.\u003c/p\u003e\n\u003ch2 id=\"links-and-pictures\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLinks and pictures\u003c/span\u003e \u003ca href=\"#links-and-pictures\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse ordinary Markdown for external links and images:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003eMy favorite reference\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://example.com\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eA description of the photograph\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/my-photo.jpg\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePlace site assets in \u003ccode\u003estatic/\u003c/code\u003e according to your configured assets directory. Check the emitted URL in the browser.\u003c/p\u003e\n\u003cp\u003eMarkata also supports \u003cstrong\u003ewikilinks\u003c/strong\u003e for your own posts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eI wrote about this in [[hello-internet]].\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRead [[hello-internet|my first post]].\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse a matching target slug. Prefer a normal link when sending someone to an external site.\u003c/p\u003e\n\u003ch2 id=\"organize-later\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOrganize later\u003c/span\u003e \u003ca href=\"#organize-later\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd tags when they\u0026rsquo;re useful. Use \u003ca href=\"/docs/guides/feeds/\"\u003eFeeds\u003c/a\u003e for collections, archives, and RSS; \u003ca href=\"/docs/guides/themes/\"\u003eThemes\u003c/a\u003e for visual changes; and \u003ca href=\"/docs/guides/templates/\"\u003eTemplates\u003c/a\u003e for layout overrides.\u003c/p\u003e\n\u003cp\u003eDon\u0026rsquo;t start by writing a plugin. First ask whether frontmatter, config, an existing feed, or a template already does what you need.\u003c/p\u003e\n\u003ch2 id=\"writing-with-an-agent\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWriting with an agent\u003c/span\u003e \u003ca href=\"#writing-with-an-agent\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAfter \u003ca href=\"/docs/guides/agent-skills/\"\u003einstalling the skill\u003c/a\u003e, a safe first request is:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMake a draft in the existing posts directory from these notes. Keep my voice, use simple frontmatter, and don\u0026rsquo;t publish anything yet. Validate config and run \u003ccode\u003emarkata build --fast\u003c/code\u003e when done.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eReview the result yourself before changing \u003ccode\u003edraft\u003c/code\u003e or deploying.\u003c/p\u003e\n\u003ch2 id=\"ship-it\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eShip it\u003c/span\u003e \u003ca href=\"#ship-it\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata config validate\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUpload the generated \u003ccode\u003eoutput/\u003c/code\u003e directory to your static host. Follow \u003ca href=\"/docs/guides/deployment/\"\u003eDeployment\u003c/a\u003e, or return to the \u003ca href=\"/docs/quickstart/\"\u003eQuickstart\u003c/a\u003e.\u003c/p\u003e\n",
      "content_text": "\n\nYou don't need templates or plugins to start. **Markdown is the source.** Markata turns it into pages.\n\n## Create a post\n\nFrom your site directory:\n\n```bash\nmarkata new \"Hello, internet\"\n```\n\nThis normally creates `pages/post/hello-internet.md`. Open it in your editor.\n\nYou'll see YAML frontmatter between two `---` lines. The body is ordinary Markdown.\n\n```markdown\n---\ntitle: \"Hello, internet\"\ndate: 2026-10-18\npublished: true\ndraft: false\ntags: [\"notes\", \"web\"]\ndescription: \"My first post with Markata.\"\n---\n\nHello, internet. I'm building a little corner of the web.\n\n## Why this exists\n\nI want somewhere to write and share what I'm learning.\n\nHere's **bold text**, a [link](https://example.com), and a list:\n\n- Make something small\n- Publish it\n- Improve it later\n```\n\nKeep the frontmatter simple: `title`, `date`, `published`, `draft`, and optional `tags` are enough to begin. Markata can infer a slug, and additional frontmatter fields are available to templates.\n\n## Preview your words\n\n```bash\nmarkata serve\n```\n\nVisit [http://localhost:8000](http://localhost:8000). Save your post; the development server rebuilds it. The page URL depends on your slug and theme configuration.\n\n## Draft before you publish\n\n```bash\nmarkata new \"An unfinished idea\" --draft\n```\n\nFor an existing post, set `draft: true`. To publish, set `draft: false` and `published: true`, then rebuild. Draft handling also depends on feed filters: do not assume a draft is publicly hidden if you override the default feed configuration.\n\n## Links and pictures\n\nUse ordinary Markdown for external links and images:\n\n```markdown\n[My favorite reference](https://example.com)\n![A description of the photograph](/images/my-photo.jpg)\n```\n\nPlace site assets in `static/` according to your configured assets directory. Check the emitted URL in the browser.\n\nMarkata also supports **wikilinks** for your own posts:\n\n```markdown\nI wrote about this in [[hello-internet]].\nRead [[hello-internet|my first post]].\n```\n\nUse a matching target slug. Prefer a normal link when sending someone to an external site.\n\n## Organize later\n\nAdd tags when they're useful. Use [Feeds](/docs/guides/feeds/) for collections, archives, and RSS; [Themes](/docs/guides/themes/) for visual changes; and [Templates](/docs/guides/templates/) for layout overrides.\n\nDon't start by writing a plugin. First ask whether frontmatter, config, an existing feed, or a template already does what you need.\n\n## Writing with an agent\n\nAfter [installing the skill](/docs/guides/agent-skills/), a safe first request is:\n\n\u003e Make a draft in the existing posts directory from these notes. Keep my voice, use simple frontmatter, and don't publish anything yet. Validate config and run `markata build --fast` when done.\n\nReview the result yourself before changing `draft` or deploying.\n\n## Ship it\n\n```bash\nmarkata config validate\nmarkata build\n```\n\nUpload the generated `output/` directory to your static host. Follow [Deployment](/docs/guides/deployment/), or return to the [Quickstart](/docs/quickstart/).\n",
      "summary": "A practical Markata authoring guide: Markdown, frontmatter, drafts, tags, links, images, and preview.",
      "date_published": "2026-10-18T00:00:00Z",
      "date_modified": "2026-10-18T00:00:00Z",
      "tags": [
        "documentation",
        "authoring"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/agent-skills/",
      "url": "https://markata.dev/docs/guides/agent-skills/",
      "title": "Give your agent the Markata skill",
      "content_html": "\u003cp\u003eLet\u0026rsquo;s be honest: a lot of websites get built alongside coding agents. \u003cstrong\u003eGive the agent the instructions that ship with Markata\u003c/strong\u003e, rather than a stale prompt found in a chat.\u003c/p\u003e\n\u003cp\u003eThe skill is bundled with the \u003cstrong\u003eGo binary\u003c/strong\u003e; you don\u0026rsquo;t need a separate installer or a proprietary cloud service.\u003c/p\u003e\n\u003ch2 id=\"1-open-your-site-repository\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e1. Open your site repository\u003c/span\u003e \u003ca href=\"#1-open-your-site-repository\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e my-site\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata agent list-agents\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis prints the agent identifiers and their project/global skill locations. Supported harnesses include \u003cstrong\u003eOpenCode, Codex, Claude Code, Cursor, GitHub Copilot, Gemini CLI\u003c/strong\u003e, and more.\u003c/p\u003e\n\u003ch2 id=\"2-install-the-skill\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e2. Install the skill\u003c/span\u003e \u003ca href=\"#2-install-the-skill\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse auto-detection (fallback: portable \u003ccode\u003e.agents/skills/markata-go-site/\u003c/code\u003e):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata agent install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr choose your harness explicitly:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata agent install --agent opencode\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata agent install --agent claude-code\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata agent install --agent codex\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor a specific agent, use \u003ccode\u003e--agent\u003c/code\u003e. For Claude Code, the project skill goes in \u003ccode\u003e.claude/skills/markata-go-site/\u003c/code\u003e; for a universal project install, it goes in \u003ccode\u003e.agents/skills/markata-go-site/\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003esetup\u003c/code\u003e alias also installs the skill. On an interactive terminal, either\ncommand lists detected agents and asks whether to install for all of them. Press\nEnter or \u003ccode\u003ey\u003c/code\u003e to accept. Enter \u003ccode\u003en\u003c/code\u003e to choose an agent from the fuzzy picker.\nIf no agents are detected, the picker opens directly. Agents that share a skill\ndirectory use one installation.\u003c/p\u003e\n\u003cp\u003eFor a global installation, use:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata agent install -g\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe picker uses an fzf-style layout: the prompt stays at the bottom, with results above it.\nThe selected agent and matching characters use the terminal theme colors.\u003c/p\u003e\n\u003cp\u003eType an agent name or abbreviation, such as \u003ccode\u003ecopilot\u003c/code\u003e or \u003ccode\u003eghcp\u003c/code\u003e. Use the arrow keys to navigate. Press Enter to select.\nEscape or Ctrl+C cancels without an installation.\n\u003ccode\u003e--no-color\u003c/code\u003e or \u003ccode\u003eNO_COLOR\u003c/code\u003e disables the colors.\nIf an install for multiple agents fails, the error identifies the failed agent.\nInstallations completed before the error remain in place.\u003c/p\u003e\n\u003cp\u003eFor scripts, project installs keep the environment-detected agent or universal fallback. Global installs need an explicit agent:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata agent install --agent opencode --global\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata agent install --agent github-copilot --global\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe picker requires interactive input and output terminals. With \u003ccode\u003e--no-input\u003c/code\u003e or \u003ccode\u003eTERM=dumb\u003c/code\u003e, an explicit \u003ccode\u003e--agent\u003c/code\u003e is required.\nUnknown names show suggestions, such as \u003ccode\u003eDid you mean --agent github-copilot?\u003c/code\u003e for \u003ccode\u003e--agent copilot\u003c/code\u003e.\nSuggestions do not select an agent automatically.\u003c/p\u003e\n\u003ch2 id=\"3-check-it\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e3. Check it\u003c/span\u003e \u003ca href=\"#3-check-it\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata agent doctor\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOn a Markata upgrade, bring your skill up to date:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata agent update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata agent doctor\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse \u003ccode\u003e--dry-run\u003c/code\u003e on \u003ccode\u003einstall\u003c/code\u003e or \u003ccode\u003eupdate\u003c/code\u003e to preview paths, or \u003ccode\u003emarkata agent install --force\u003c/code\u003e to overwrite local customizations.\u003c/p\u003e\n\u003ch2 id=\"4-start-with-a-small-instruction\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e4. Start with a small instruction\u003c/span\u003e \u003ca href=\"#4-start-with-a-small-instruction\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eRead the installed Markata site skill and the current configuration. Create a draft Markdown post about what this site is for. Do not change the theme, plugins, or deployment setup. Show me the file and run a fast build to check it.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAgents can inspect the site with:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata config show\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata list posts\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata explain content\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata build --fast\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor rich content with symbols like :lucide-rocket: or :lucide-database:,\nresponsive icon cards, or status/reporting blocks, the bundled skill includes\n\u003ccode\u003etopics/rich-markdown.md\u003c/code\u003e. Ask the agent to read that topic before creating\nnew CSS, templates, or JS. The built-in icon syntax is documented under\n\u003ca href=\"/docs/guides/icons/\"\u003eIcon Shortcodes\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eKeep a human in the loop for publishing and deployment. Markata\u0026rsquo;s skill guides agents through frontmatter, themes, feed patterns, templates, site builds, and when \u003cstrong\u003enot\u003c/strong\u003e to create a plugin.\u003c/p\u003e\n\u003ch2 id=\"visualize-a-session-or-topic\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVisualize a session or topic\u003c/span\u003e \u003ca href=\"#visualize-a-session-or-topic\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAfter you install the skill, ask your agent:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eVisualize this session.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe agent creates a visual Markdown post from the conversation\u0026rsquo;s work, decisions, and unresolved items.\nIt serves a local preview, checks the exact post URL, and attempts to open that URL in your browser.\nThe handoff includes the Markdown path, preview URL, browser-open result, and server handle or stop instruction.\u003c/p\u003e\n\u003cp\u003eFor supplied material, use either phrase:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eVisualize this: our release process starts with a draft, then review, then approval.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMake a visual post from these notes.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThese are natural-language instructions for the agent, not Markata CLI commands.\nOrdinary chart, diagram, or styling requests do not automatically start a preview server.\u003c/p\u003e\n\u003cp\u003eFor Markdown without a preview, state that constraint:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eVisualize this session. Source only: create exactly one Markdown file.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe agent then creates the file without a server or preview scaffolding.\nOutside a Markata site, a full preview uses an isolated temporary site.\nThe agent keeps that scaffolding outside your repository.\u003c/p\u003e\n\u003cp\u003eLocal preview does not authorize public publication or deployment.\nThe agent preserves publication flags and excludes secrets.\nThe agent reports browser or persistent-server limitations instead of claiming that the page opened.\nOn a remote machine, the preview can require port forwarding to reach your browser.\u003c/p\u003e\n\u003cp\u003eThe workflow lives in the bundled skill\u0026rsquo;s \u003ccode\u003etopics/visualize-session.md\u003c/code\u003e.\nFor an existing installation, use \u003ccode\u003emarkata agent update\u003c/code\u003e after you install a binary with the updated skill.\u003c/p\u003e\n\u003ch2 id=\"fixes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFixes\u003c/span\u003e \u003ca href=\"#fixes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eIf the wrong harness is detected, pass \u003ccode\u003e--agent\u003c/code\u003e explicitly.\u003c/li\u003e\n\u003cli\u003eIf no skill is found, run \u003ccode\u003emarkata agent install --dry-run\u003c/code\u003e and check the reported destination.\u003c/li\u003e\n\u003cli\u003eAfter upgrading the binary, run \u003ccode\u003emarkata agent doctor\u003c/code\u003e and then \u003ccode\u003emarkata agent update\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eKeep the installed skill with your site\u0026rsquo;s source control when you want a reproducible project setup.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eNext: \u003ca href=\"/docs/guides/authoring/\"\u003eWrite your first post\u003c/a\u003e or \u003ca href=\"/docs/quickstart/\"\u003eQuickstart\u003c/a\u003e.\u003c/p\u003e\n",
      "content_text": "\n\nLet's be honest: a lot of websites get built alongside coding agents. **Give the agent the instructions that ship with Markata**, rather than a stale prompt found in a chat.\n\nThe skill is bundled with the **Go binary**; you don't need a separate installer or a proprietary cloud service.\n\n## 1. Open your site repository\n\n```bash\ncd my-site\nmarkata agent list-agents\n```\n\nThis prints the agent identifiers and their project/global skill locations. Supported harnesses include **OpenCode, Codex, Claude Code, Cursor, GitHub Copilot, Gemini CLI**, and more.\n\n## 2. Install the skill\n\nUse auto-detection (fallback: portable `.agents/skills/markata-go-site/`):\n\n```bash\nmarkata agent install\n```\n\nOr choose your harness explicitly:\n\n```bash\nmarkata agent install --agent opencode\nmarkata agent install --agent claude-code\nmarkata agent install --agent codex\n```\n\nFor a specific agent, use `--agent`. For Claude Code, the project skill goes in `.claude/skills/markata-go-site/`; for a universal project install, it goes in `.agents/skills/markata-go-site/`.\n\nThe `setup` alias also installs the skill. On an interactive terminal, either\ncommand lists detected agents and asks whether to install for all of them. Press\nEnter or `y` to accept. Enter `n` to choose an agent from the fuzzy picker.\nIf no agents are detected, the picker opens directly. Agents that share a skill\ndirectory use one installation.\n\nFor a global installation, use:\n\n```bash\nmarkata agent install -g\n```\n\nThe picker uses an fzf-style layout: the prompt stays at the bottom, with results above it.\nThe selected agent and matching characters use the terminal theme colors.\n\nType an agent name or abbreviation, such as `copilot` or `ghcp`. Use the arrow keys to navigate. Press Enter to select.\nEscape or Ctrl+C cancels without an installation.\n`--no-color` or `NO_COLOR` disables the colors.\nIf an install for multiple agents fails, the error identifies the failed agent.\nInstallations completed before the error remain in place.\n\nFor scripts, project installs keep the environment-detected agent or universal fallback. Global installs need an explicit agent:\n\n```bash\nmarkata agent install --agent opencode --global\nmarkata agent install --agent github-copilot --global\n```\n\nThe picker requires interactive input and output terminals. With `--no-input` or `TERM=dumb`, an explicit `--agent` is required.\nUnknown names show suggestions, such as `Did you mean --agent github-copilot?` for `--agent copilot`.\nSuggestions do not select an agent automatically.\n\n## 3. Check it\n\n```bash\nmarkata agent doctor\n```\n\nOn a Markata upgrade, bring your skill up to date:\n\n```bash\nmarkata agent update\nmarkata agent doctor\n```\n\nUse `--dry-run` on `install` or `update` to preview paths, or `markata agent install --force` to overwrite local customizations.\n\n## 4. Start with a small instruction\n\n\u003e Read the installed Markata site skill and the current configuration. Create a draft Markdown post about what this site is for. Do not change the theme, plugins, or deployment setup. Show me the file and run a fast build to check it.\n\nAgents can inspect the site with:\n\n```bash\nmarkata config show\nmarkata list posts\nmarkata explain content\nmarkata build --fast\n```\n\nFor rich content with symbols like :lucide-rocket: or :lucide-database:,\nresponsive icon cards, or status/reporting blocks, the bundled skill includes\n`topics/rich-markdown.md`. Ask the agent to read that topic before creating\nnew CSS, templates, or JS. The built-in icon syntax is documented under\n[Icon Shortcodes](/docs/guides/icons/).\n\nKeep a human in the loop for publishing and deployment. Markata's skill guides agents through frontmatter, themes, feed patterns, templates, site builds, and when **not** to create a plugin.\n\n## Visualize a session or topic\n\nAfter you install the skill, ask your agent:\n\n\u003e Visualize this session.\n\nThe agent creates a visual Markdown post from the conversation's work, decisions, and unresolved items.\nIt serves a local preview, checks the exact post URL, and attempts to open that URL in your browser.\nThe handoff includes the Markdown path, preview URL, browser-open result, and server handle or stop instruction.\n\nFor supplied material, use either phrase:\n\n\u003e Visualize this: our release process starts with a draft, then review, then approval.\n\n\u003e Make a visual post from these notes.\n\nThese are natural-language instructions for the agent, not Markata CLI commands.\nOrdinary chart, diagram, or styling requests do not automatically start a preview server.\n\nFor Markdown without a preview, state that constraint:\n\n\u003e Visualize this session. Source only: create exactly one Markdown file.\n\nThe agent then creates the file without a server or preview scaffolding.\nOutside a Markata site, a full preview uses an isolated temporary site.\nThe agent keeps that scaffolding outside your repository.\n\nLocal preview does not authorize public publication or deployment.\nThe agent preserves publication flags and excludes secrets.\nThe agent reports browser or persistent-server limitations instead of claiming that the page opened.\nOn a remote machine, the preview can require port forwarding to reach your browser.\n\nThe workflow lives in the bundled skill's `topics/visualize-session.md`.\nFor an existing installation, use `markata agent update` after you install a binary with the updated skill.\n\n## Fixes\n\n- If the wrong harness is detected, pass `--agent` explicitly.\n- If no skill is found, run `markata agent install --dry-run` and check the reported destination.\n- After upgrading the binary, run `markata agent doctor` and then `markata agent update`.\n- Keep the installed skill with your site's source control when you want a reproducible project setup.\n\nNext: [Write your first post](/docs/guides/authoring/) or [Quickstart](/docs/quickstart/).\n",
      "summary": "Teach OpenCode, Codex, Claude Code, Cursor, and other coding agents to build a Markata site.",
      "date_published": "2026-10-18T00:00:00Z",
      "date_modified": "2026-10-18T00:00:00Z",
      "tags": [
        "documentation",
        "agents"
      ]
    },
    {
      "id": "https://markata.dev/docs/getting-started/",
      "url": "https://markata.dev/docs/getting-started/",
      "title": "Getting started with Markata",
      "content_html": "\u003ch2 id=\"getting-started\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGetting started\u003c/span\u003e \u003ca href=\"#getting-started\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou do not need to learn the entire plugin system before publishing something.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eYour first hour:\u003c/strong\u003e install, create a directory, write one Markdown post, then build.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"/docs/installation/\"\u003eInstall Markata\u003c/a\u003e — pick your operating system or installer.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/quickstart/\"\u003eRun the quickstart\u003c/a\u003e — \u003ccode\u003emarkata config init\u003c/code\u003e, \u003ccode\u003emarkata new\u003c/code\u003e, \u003ccode\u003emarkata serve\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/agent-skills/\"\u003eInstall the bundled agent skill\u003c/a\u003e — let your agent work from accurate site-specific instructions.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/authoring/\"\u003eFollow the authoring guide\u003c/a\u003e — posts, drafts, tags, links, and images.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/deployment/\"\u003eDeploy the output\u003c/a\u003e — static hosting needs no Markata process in production.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eLater, explore \u003ca href=\"/docs/guides/themes/\"\u003ethemes\u003c/a\u003e, \u003ca href=\"/docs/guides/feeds/\"\u003efeeds\u003c/a\u003e, \u003ca href=\"/docs/guides/templates/\"\u003etemplates\u003c/a\u003e, and \u003ca href=\"/docs/reference/plugins/\"\u003eplugins\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eMarkata is the \u003cstrong\u003eGo\u003c/strong\u003e project at \u003ca href=\"https://github.com/WaylonWalker/markata\"\u003eWaylonWalker/markata\u003c/a\u003e. It is still \u003cstrong\u003e0.x\u003c/strong\u003e. The original Python product lives at \u003ca href=\"https://github.com/WaylonWalker/markata-py\"\u003eWaylonWalker/markata-py\u003c/a\u003e, and current PyPI releases install the Go CLI after a version break. Older Python versions remain available when pinned; see \u003ca href=\"/docs/installation/\"\u003einstallation\u003c/a\u003e.\u003c/p\u003e\n",
      "content_text": "\n## Getting started\n\nYou do not need to learn the entire plugin system before publishing something.\n\n**Your first hour:** install, create a directory, write one Markdown post, then build.\n\n1. [Install Markata](/docs/installation/) — pick your operating system or installer.\n2. [Run the quickstart](/docs/quickstart/) — `markata config init`, `markata new`, `markata serve`.\n3. [Install the bundled agent skill](/docs/guides/agent-skills/) — let your agent work from accurate site-specific instructions.\n4. [Follow the authoring guide](/docs/guides/authoring/) — posts, drafts, tags, links, and images.\n5. [Deploy the output](/docs/guides/deployment/) — static hosting needs no Markata process in production.\n\nLater, explore [themes](/docs/guides/themes/), [feeds](/docs/guides/feeds/), [templates](/docs/guides/templates/), and [plugins](/docs/reference/plugins/).\n\nMarkata is the **Go** project at [WaylonWalker/markata](https://github.com/WaylonWalker/markata). It is still **0.x**. The original Python product lives at [WaylonWalker/markata-py](https://github.com/WaylonWalker/markata-py), and current PyPI releases install the Go CLI after a version break. Older Python versions remain available when pinned; see [installation](/docs/installation/).\n",
      "summary": "A beginner-friendly path from installation to publishing a website.",
      "date_published": "2026-10-18T00:00:00Z",
      "date_modified": "2026-10-18T00:00:00Z",
      "tags": [
        "documentation",
        "getting-started"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/name-migration/",
      "url": "https://markata.dev/docs/guides/name-migration/",
      "title": "Markata naming migration",
      "content_html": "\u003cp\u003eThe Go static site generator formerly known as \u003cstrong\u003emarkata-go\u003c/strong\u003e is now \u003cstrong\u003eMarkata\u003c/strong\u003e.\nThe repository rename is complete, but Markata remains on the \u003cstrong\u003e0.x\u003c/strong\u003e release\nline; the name change does not imply a 1.0 release. The original Python\nimplementation is now at \u003cstrong\u003eWaylonWalker/markata-py\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"what-works-now\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat works now\u003c/span\u003e \u003ca href=\"#what-works-now\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNew development builds provide the preferred \u003ccode\u003emarkata\u003c/code\u003e executable. The legacy\n\u003ccode\u003emarkata-go\u003c/code\u003e command remains supported, including existing tagged downloads.\nThe official install script attempts a canonical archive and falls back to a\nlegacy release where needed, installing both command names. If a different application (including Python Markata) already owns the \u003ccode\u003emarkata\u003c/code\u003e command at the destination, the installer stops rather than overwriting it. Move the conflicting executable or choose a separate install directory.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -sSL https://raw.githubusercontent.com/WaylonWalker/markata/main/install.sh \u003cspan class=\"p\"\u003e|\u003c/span\u003e bash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata --help\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Existing automation still works:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf you install from Go source rather than binary releases, the new command is\navailable from \u003ccode\u003emain\u003c/code\u003e until the first tagged version with the new entry point:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego install github.com/WaylonWalker/markata/cmd/markata@main\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"configuration-stays-as-is-for-now\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration stays as-is for now\u003c/span\u003e \u003ca href=\"#configuration-stays-as-is-for-now\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThere is no immediate need to rename configuration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# markata-go.toml remains correct during the compatibility window\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;output\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003eMARKATA_GO_OUTPUT_DIR\u003c/code\u003e, \u003ccode\u003eMARKATA_GO_SITE_DIR\u003c/code\u003e and other existing\n\u003ccode\u003eMARKATA_GO_*\u003c/code\u003e overrides continue working. Configuration overrides applied by\nthe Go config loader also accept the canonical \u003ccode\u003eMARKATA_*\u003c/code\u003e aliases, for example\n\u003ccode\u003eMARKATA_OUTPUT_DIR\u003c/code\u003e. The canonical name takes precedence if both are set;\nconflicting values record \u003ccode\u003ename_migration_warnings\u003c/code\u003e on the loaded config\n(without exposing the values). Other runtime-specific settings may still use\nlegacy names; migrate those only after their individual support is verified.\u003c/p\u003e\n\u003cp\u003eRenaming the config file to \u003ccode\u003emarkata.toml\u003c/code\u003e or the TOML section to \u003ccode\u003e[markata]\u003c/code\u003e\nis \u003cstrong\u003enot yet supported\u003c/strong\u003e by the Go CLI, and may be confused with an original\nPython Markata configuration. Keep existing TOML filenames/sections for now.\u003c/p\u003e\n\u003cp\u003eFor the installer, \u003ccode\u003eMARKATA_INSTALL_DIR\u003c/code\u003e and \u003ccode\u003eMARKATA_VERSION\u003c/code\u003e are preferred;\nthe legacy \u003ccode\u003eMARKATA_GO_INSTALL_DIR\u003c/code\u003e and \u003ccode\u003eMARKATA_GO_VERSION\u003c/code\u003e still work.\u003c/p\u003e\n\u003ch2 id=\"github-repository-cutover-completed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGitHub repository cutover completed\u003c/span\u003e \u003ca href=\"#github-repository-cutover-completed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe repository swap was completed on October 18, 2026. The Go implementation\nis now \u003ca href=\"https://github.com/WaylonWalker/markata\"\u003eWaylonWalker/markata\u003c/a\u003e\n(repository ID \u003ccode\u003e1140034778\u003c/code\u003e); the original Python implementation is\n\u003ca href=\"https://github.com/WaylonWalker/markata-py\"\u003eWaylonWalker/markata-py\u003c/a\u003e\n(repository ID \u003ccode\u003e333449359\u003c/code\u003e). The old Go GitHub URL may redirect to the\ncanonical Go repository, but use the new URL explicitly in new automation.\nOld Python bookmarks targeting \u003ccode\u003eWaylonWalker/markata\u003c/code\u003e now land on Go.\u003c/p\u003e\n\u003cp\u003eRead the \u003ca href=\"repository-cutover.md\"\u003erepository cutover runbook\u003c/a\u003e for the owner\nrename checks and post-cutover infrastructure audit. The GitHub rename alone\n\u003cstrong\u003edoes not\u003c/strong\u003e migrate the Go module import path, Python PyPI ownership,\nlegacy configuration names, container registry permissions, or live sites.\u003c/p\u003e\n\u003ch2 id=\"package-and-production-migration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePackage and production migration\u003c/span\u003e \u003ca href=\"#package-and-production-migration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe Go module now declares \u003ccode\u003egithub.com/WaylonWalker/markata\u003c/code\u003e,\nand tracked Go imports have migrated to that path. Pinned pre-cutover\nreleases may still be available under the old\n\u003ccode\u003egithub.com/WaylonWalker/markata-go\u003c/code\u003e module identity.\nAvoid mixing both module paths in a single dependency graph.\nFor new Go code and \u003ccode\u003ego install\u003c/code\u003e, use\n\u003ccode\u003egithub.com/WaylonWalker/markata\u003c/code\u003e. See the\n\u003ca href=\"go-module-cutover.md\"\u003eGo module cutover guide\u003c/a\u003e for migration details.\u003c/p\u003e\n\u003cp\u003eExisting \u003ccode\u003emarkata-go.toml\u003c/code\u003e, \u003ccode\u003e[markata-go]\u003c/code\u003e, \u003ccode\u003eMARKATA_GO_*\u003c/code\u003e,\n\u003ccode\u003emarkata-go\u003c/code\u003e binaries and legacy GHCR builder references are intentionally\npreserved. Do not rename Kubernetes PVCs, Helm release names or secrets merely\nto match branding. Audit Argo CD chart repo URLs and permissions separately,\nand verify published image compatibility and live workloads before changing\nproduction images. No new release tag is implied by the rename.\u003c/p\u003e\n",
      "content_text": "\n\nThe Go static site generator formerly known as **markata-go** is now **Markata**.\nThe repository rename is complete, but Markata remains on the **0.x** release\nline; the name change does not imply a 1.0 release. The original Python\nimplementation is now at **WaylonWalker/markata-py**.\n\n## What works now\n\nNew development builds provide the preferred `markata` executable. The legacy\n`markata-go` command remains supported, including existing tagged downloads.\nThe official install script attempts a canonical archive and falls back to a\nlegacy release where needed, installing both command names. If a different application (including Python Markata) already owns the `markata` command at the destination, the installer stops rather than overwriting it. Move the conflicting executable or choose a separate install directory.\n\n```bash\ncurl -sSL https://raw.githubusercontent.com/WaylonWalker/markata/main/install.sh | bash\nmarkata --help\nmarkata build\n\n# Existing automation still works:\nmarkata-go build\n```\n\nIf you install from Go source rather than binary releases, the new command is\navailable from `main` until the first tagged version with the new entry point:\n\n```bash\ngo install github.com/WaylonWalker/markata/cmd/markata@main\n```\n\n## Configuration stays as-is for now\n\nThere is no immediate need to rename configuration:\n\n```toml\n# markata-go.toml remains correct during the compatibility window\n[markata-go]\noutput_dir = \"output\"\n```\n\n`MARKATA_GO_OUTPUT_DIR`, `MARKATA_GO_SITE_DIR` and other existing\n`MARKATA_GO_*` overrides continue working. Configuration overrides applied by\nthe Go config loader also accept the canonical `MARKATA_*` aliases, for example\n`MARKATA_OUTPUT_DIR`. The canonical name takes precedence if both are set;\nconflicting values record `name_migration_warnings` on the loaded config\n(without exposing the values). Other runtime-specific settings may still use\nlegacy names; migrate those only after their individual support is verified.\n\nRenaming the config file to `markata.toml` or the TOML section to `[markata]`\nis **not yet supported** by the Go CLI, and may be confused with an original\nPython Markata configuration. Keep existing TOML filenames/sections for now.\n\nFor the installer, `MARKATA_INSTALL_DIR` and `MARKATA_VERSION` are preferred;\nthe legacy `MARKATA_GO_INSTALL_DIR` and `MARKATA_GO_VERSION` still work.\n\n## GitHub repository cutover completed\n\nThe repository swap was completed on October 18, 2026. The Go implementation\nis now [WaylonWalker/markata](https://github.com/WaylonWalker/markata)\n(repository ID `1140034778`); the original Python implementation is\n[WaylonWalker/markata-py](https://github.com/WaylonWalker/markata-py)\n(repository ID `333449359`). The old Go GitHub URL may redirect to the\ncanonical Go repository, but use the new URL explicitly in new automation.\nOld Python bookmarks targeting `WaylonWalker/markata` now land on Go.\n\nRead the [repository cutover runbook](repository-cutover.md) for the owner\nrename checks and post-cutover infrastructure audit. The GitHub rename alone\n**does not** migrate the Go module import path, Python PyPI ownership,\nlegacy configuration names, container registry permissions, or live sites.\n\n## Package and production migration\n\nThe Go module now declares `github.com/WaylonWalker/markata`,\nand tracked Go imports have migrated to that path. Pinned pre-cutover\nreleases may still be available under the old\n`github.com/WaylonWalker/markata-go` module identity.\nAvoid mixing both module paths in a single dependency graph.\nFor new Go code and `go install`, use\n`github.com/WaylonWalker/markata`. See the\n[Go module cutover guide](go-module-cutover.md) for migration details.\n\nExisting `markata-go.toml`, `[markata-go]`, `MARKATA_GO_*`,\n`markata-go` binaries and legacy GHCR builder references are intentionally\npreserved. Do not rename Kubernetes PVCs, Helm release names or secrets merely\nto match branding. Audit Argo CD chart repo URLs and permissions separately,\nand verify published image compatibility and live workloads before changing\nproduction images. No new release tag is implied by the rename.\n",
      "summary": "Moving from markata-go to Markata while preserving existing Go and Python installations",
      "date_published": "2026-10-16T00:00:00Z",
      "date_modified": "2026-10-16T00:00:00Z",
      "tags": [
        "documentation",
        "migration"
      ]
    },
    {
      "id": "https://markata.dev/docs/reports/slow3g-1554/",
      "url": "https://markata.dev/docs/reports/slow3g-1554/",
      "title": "Slow 3G Harness A/A Validation on WaylonWalker.com",
      "content_html": "\u003ch2 id=\"slow-3g-a-a-validation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSlow 3G A/A validation\u003c/span\u003e \u003ca href=\"#slow-3g-a-a-validation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis report validates PR \u003ca href=\"https://github.com/WaylonWalker/markata-go/pull/1554\"\u003e#1554\u003c/a\u003e\nagainst a fresh build of the actual WaylonWalker.com working source. These are\nA/A measurements for harness noise and filmstrip inspection. No site\noptimization was included, so this report makes no A/B performance claim.\u003c/p\u003e\n\u003ch2 id=\"pinned-inputs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePinned inputs\u003c/span\u003e \u003ca href=\"#pinned-inputs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eSite source commit: \u003ccode\u003e82ae5bcfc67674abfd2e5a169ca9551e2255ff57\u003c/code\u003e with local\nworking-tree edits and untracked site posts included in an isolated snapshot.\u003c/li\u003e\n\u003cli\u003eSHA-256 of the exact copied build-input tree:\n\u003ccode\u003eba2a97aa9f0b4a870555c19c6b5bcf3e055b59e34f8567c46449feedbbfca346\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eMarkata Go build revision: \u003ccode\u003e0af03c725fecacec934ba1d51649ca7a86155e01\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eHarness capture revision: \u003ccode\u003efd66fbd0eb1480a69a5ea2dbebac93d5cb28d9e5\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eBrowser: Chromium \u003ccode\u003e153.0.8010.52\u003c/code\u003e; Playwright from the harness PEP 723\ndependency declaration; Python \u003ccode\u003e3.14.7\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eFresh generated output: 3,540 discovered posts, 3,518 rendered, 421 feeds;\nbuild completed in 45.35 seconds. Output size was 2.4 GiB.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe site checkout contains private encrypted source. Its configured\n\u003ccode\u003eMARKATA_GO_ENCRYPTION_KEY_*\u003c/code\u003e values were passed directly from the local\n\u003ccode\u003e.env\u003c/code\u003e to the isolated build process. Secret values were not recorded. The\nsnapshot excluded \u003ccode\u003e.env\u003c/code\u003e, Git metadata, previous output and build caches.\u003c/p\u003e\n\u003ch2 id=\"capture-setup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCapture setup\u003c/span\u003e \u003ca href=\"#capture-setup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe same generated output directory was served from ports 8000 and 8001 with\n\u003ccode\u003escripts/slow3g_site_server.py\u003c/code\u003e. Each browser run used a new context, disabled\nthe browser cache and used the harness defaults: 390×844 viewport, 400 ms\nlatency, 51,200 bytes/second up and down, and 4× CPU slowdown. Each route ran\nfive alternating A/B and B/A pairs, with a 16-second observation window and\nframes requested at 1, 2, 5, 8, 12 and 15 seconds. The A and B labels refer to\nthe two server ports; both serve identical bytes.\u003c/p\u003e\n\u003ch2 id=\"results\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eResults\u003c/span\u003e \u003ca href=\"#results\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMedian values below are across five valid runs for each port. Encoded bytes are\ncompleted transfers during the 16-second window, not bytes received at paint.\nFirst-readable times are manual estimates from the saved frames, rounded to\nthe checkpoint interval.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eRoute\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eValid runs per port\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eMedian FCP A/B\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eMedian LCP A/B\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eMedian CLS A/B\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eMedian bytes A/B\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eMedian requests A/B\u003c/th\u003e\n\u003cth\u003eFirst readable main content\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e5/5\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e6292/6204 ms\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e6292/6204 ms\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.010765/0.010765\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e613690/613514\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e66/66\u003c/td\u003e\n\u003ctd\u003eAbout 8 s; intro/about text is visible.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/archive/\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e5/5\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e5120/5136 ms\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e7504/7392 ms\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.000337/0.000337\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e301620/301582\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e32/32\u003c/td\u003e\n\u003ctd\u003eAbout 8 s; first post title and snippet are readable.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/blogging-for-me/\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e5/5\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e4072/4064 ms\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e4280/4276 ms\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.010112/0.010112\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e372229/372229\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e47/47\u003c/td\u003e\n\u003ctd\u003eBy 5 s; article title and opening paragraph are readable.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/shorts/\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e5/5\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e972/972 ms\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e2848/2836 ms\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.006164/0.006164\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e53185/53178\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e8/8\u003c/td\u003e\n\u003ctd\u003eBy 5 s; the image is sharp and its “Bat Cap” title is readable. At 2 s the media is still blurred.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/reader/\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0/5\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e—\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e—\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e—\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e—\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e—\u003c/td\u003e\n\u003ctd\u003eThe 5 s frame shows the Reader heading and an empty-state message, with 0 entries. Runs are invalid as described below.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eMedian absolute paired FCP differences for the four valid routes were 84 ms\n(home), 88 ms (archive), 24 ms (article) and 8 ms (shorts). Median absolute\npaired LCP differences were 84 ms, 224 ms, 40 ms and 36 ms respectively.\nThese describe same-build measurement variability; they are not performance\ngains. Archive request counts varied between 32 and 57 in individual runs,\nwhich is one reason to inspect raw \u003ccode\u003eresults.json\u003c/code\u003e instead of relying only on\nthe medians.\u003c/p\u003e\n\u003cp\u003eLargest completed resources observed included the gzip archive document at\n266,979 bytes, \u003ccode\u003esource-sans-3-prose-core.woff2\u003c/code\u003e at 79,495 bytes,\n\u003ccode\u003ecaveat-brush-display-core.woff2\u003c/code\u003e at 47,883 bytes, the local \u003ccode\u003e/8bitcc.png\u003c/code\u003e at\n56,890 bytes, and the shared palette CSS at 30,787 bytes. The home and shorts\nroutes also fetched images from \u003ccode\u003edropper.waylonwalker.com\u003c/code\u003e; those remain\nexternal to the local test server. Per-request encoded and decoded transfer\nlengths, URLs, types and completion state are retained in each \u003ccode\u003eresults.json\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"invalid-reader-route\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInvalid reader route\u003c/span\u003e \u003ca href=\"#invalid-reader-route\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAll ten reader runs were marked invalid. The freshly generated \u003ccode\u003ereader/index.html\u003c/code\u003e\nrequests \u003ccode\u003e/_pagefind/pagefind-ui.css\u003c/code\u003e and \u003ccode\u003e.js\u003c/code\u003e, but this output has neither\nfile; the server correctly returns 404 with HTML MIME. The harness records two\nfailed requests and two invalid asset responses per run. This is missing output\nfrom the site build, not a reason to suppress the harness checks. Also, the\nfresh page contains zero reader entries, so it does not represent a populated\nproduction reader. Reader timings are excluded from the table and from any\nnoise estimate.\u003c/p\u003e\n\u003ch2 id=\"reproduction\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReproduction\u003c/span\u003e \u003ca href=\"#reproduction\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse a clean snapshot of the same site source state, including the intended\nworking-tree content changes. Keep \u003ccode\u003e.env\u003c/code\u003e out of the snapshot and provide the\nsite\u0026rsquo;s encryption keys only to the build process through environment\nvariables. Pin the Markata Go and harness revisions above.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ersync -a --delete \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --exclude\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;.git\u0026#39;\u003c/span\u003e --exclude\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;.env\u0026#39;\u003c/span\u003e --exclude\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;.env.*\u0026#39;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --exclude\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;output/\u0026#39;\u003c/span\u003e --exclude\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;cache/\u0026#39;\u003c/span\u003e --exclude\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;.markata/\u0026#39;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --exclude\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;.markata-cache/\u0026#39;\u003c/span\u003e --exclude\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;.steam_cache/\u0026#39;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --exclude\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;.output.markata-serving/\u0026#39;\u003c/span\u003e --exclude\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;node_modules/\u0026#39;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$SITE_CHECKOUT\u003c/span\u003e\u003cspan class=\"s2\"\u003e/\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$SITE_SRC\u003c/span\u003e\u003cspan class=\"s2\"\u003e/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit -C \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$MARKATA_REPO\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e worktree add --detach \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$MARKATA_BUILD\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  0af03c725fecacec934ba1d51649ca7a86155e01\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego -C \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$MARKATA_BUILD\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e build -o \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$MARKATA_BIN\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e ./cmd/markata-go\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$MARKATA_BIN\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e build --clean \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -c markata-go.toml \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --site-dir \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$SITE_SRC\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -o \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$SITE_OUT\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython scripts/slow3g_site_server.py --root \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$SITE_OUT\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e --port \u003cspan class=\"m\"\u003e8000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython scripts/slow3g_site_server.py --root \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$SITE_OUT\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e --port \u003cspan class=\"m\"\u003e8001\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv run --script scripts/slow3g_compare.py \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --chromium /usr/bin/chromium \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --before http://127.0.0.1:8000/ \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --after http://127.0.0.1:8001/ \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --runs \u003cspan class=\"m\"\u003e5\u003c/span\u003e --observe-ms \u003cspan class=\"m\"\u003e16000\u003c/span\u003e --timeout-ms \u003cspan class=\"m\"\u003e26000\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --checkpoints \u003cspan class=\"m\"\u003e1000\u003c/span\u003e \u003cspan class=\"m\"\u003e2000\u003c/span\u003e \u003cspan class=\"m\"\u003e5000\u003c/span\u003e \u003cspan class=\"m\"\u003e8000\u003c/span\u003e \u003cspan class=\"m\"\u003e12000\u003c/span\u003e \u003cspan class=\"m\"\u003e15000\u003c/span\u003e --min-frames \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --output docs/reports/slow3g-1554/aa-home\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRepeat the capture command with both route URLs changed to \u003ccode\u003e/archive/\u003c/code\u003e,\n\u003ccode\u003e/blogging-for-me/\u003c/code\u003e, \u003ccode\u003e/shorts/\u003c/code\u003e and \u003ccode\u003e/reader/\u003c/code\u003e, and use separate output\ndirectories. Inspect the saved \u003ccode\u003efilmstrip.html\u003c/code\u003e and frames for readability.\nKeep failed requests and wrong-MIME responses in the report as invalid runs.\u003c/p\u003e\n\u003ch2 id=\"preserved-artifacts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePreserved artifacts\u003c/span\u003e \u003ca href=\"#preserved-artifacts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEach \u003ccode\u003eaa-*\u003c/code\u003e directory contains \u003ccode\u003eresults.json\u003c/code\u003e, \u003ccode\u003esummary.json\u003c/code\u003e, \u003ccode\u003esummary.csv\u003c/code\u003e,\n\u003ccode\u003efilmstrip.html\u003c/code\u003e, all 60 requested checkpoint frames and the contact sheets\nused for the manual readability review. The reader directory preserves its\nfailed requests and invalid-asset diagnostics as well.\u003c/p\u003e\n",
      "content_text": "\n## Slow 3G A/A validation\n\nThis report validates PR [#1554](https://github.com/WaylonWalker/markata-go/pull/1554)\nagainst a fresh build of the actual WaylonWalker.com working source. These are\nA/A measurements for harness noise and filmstrip inspection. No site\noptimization was included, so this report makes no A/B performance claim.\n\n## Pinned inputs\n\n- Site source commit: `82ae5bcfc67674abfd2e5a169ca9551e2255ff57` with local\n  working-tree edits and untracked site posts included in an isolated snapshot.\n- SHA-256 of the exact copied build-input tree:\n  `ba2a97aa9f0b4a870555c19c6b5bcf3e055b59e34f8567c46449feedbbfca346`.\n- Markata Go build revision: `0af03c725fecacec934ba1d51649ca7a86155e01`.\n- Harness capture revision: `fd66fbd0eb1480a69a5ea2dbebac93d5cb28d9e5`.\n- Browser: Chromium `153.0.8010.52`; Playwright from the harness PEP 723\n  dependency declaration; Python `3.14.7`.\n- Fresh generated output: 3,540 discovered posts, 3,518 rendered, 421 feeds;\n  build completed in 45.35 seconds. Output size was 2.4 GiB.\n\nThe site checkout contains private encrypted source. Its configured\n`MARKATA_GO_ENCRYPTION_KEY_*` values were passed directly from the local\n`.env` to the isolated build process. Secret values were not recorded. The\nsnapshot excluded `.env`, Git metadata, previous output and build caches.\n\n## Capture setup\n\nThe same generated output directory was served from ports 8000 and 8001 with\n`scripts/slow3g_site_server.py`. Each browser run used a new context, disabled\nthe browser cache and used the harness defaults: 390×844 viewport, 400 ms\nlatency, 51,200 bytes/second up and down, and 4× CPU slowdown. Each route ran\nfive alternating A/B and B/A pairs, with a 16-second observation window and\nframes requested at 1, 2, 5, 8, 12 and 15 seconds. The A and B labels refer to\nthe two server ports; both serve identical bytes.\n\n## Results\n\nMedian values below are across five valid runs for each port. Encoded bytes are\ncompleted transfers during the 16-second window, not bytes received at paint.\nFirst-readable times are manual estimates from the saved frames, rounded to\nthe checkpoint interval.\n\n| Route | Valid runs per port | Median FCP A/B | Median LCP A/B | Median CLS A/B | Median bytes A/B | Median requests A/B | First readable main content |\n| --- | ---: | ---: | ---: | ---: | ---: | ---: | --- |\n| `/` | 5/5 | 6292/6204 ms | 6292/6204 ms | 0.010765/0.010765 | 613690/613514 | 66/66 | About 8 s; intro/about text is visible. |\n| `/archive/` | 5/5 | 5120/5136 ms | 7504/7392 ms | 0.000337/0.000337 | 301620/301582 | 32/32 | About 8 s; first post title and snippet are readable. |\n| `/blogging-for-me/` | 5/5 | 4072/4064 ms | 4280/4276 ms | 0.010112/0.010112 | 372229/372229 | 47/47 | By 5 s; article title and opening paragraph are readable. |\n| `/shorts/` | 5/5 | 972/972 ms | 2848/2836 ms | 0.006164/0.006164 | 53185/53178 | 8/8 | By 5 s; the image is sharp and its “Bat Cap” title is readable. At 2 s the media is still blurred. |\n| `/reader/` | 0/5 | — | — | — | — | — | The 5 s frame shows the Reader heading and an empty-state message, with 0 entries. Runs are invalid as described below. |\n\nMedian absolute paired FCP differences for the four valid routes were 84 ms\n(home), 88 ms (archive), 24 ms (article) and 8 ms (shorts). Median absolute\npaired LCP differences were 84 ms, 224 ms, 40 ms and 36 ms respectively.\nThese describe same-build measurement variability; they are not performance\ngains. Archive request counts varied between 32 and 57 in individual runs,\nwhich is one reason to inspect raw `results.json` instead of relying only on\nthe medians.\n\nLargest completed resources observed included the gzip archive document at\n266,979 bytes, `source-sans-3-prose-core.woff2` at 79,495 bytes,\n`caveat-brush-display-core.woff2` at 47,883 bytes, the local `/8bitcc.png` at\n56,890 bytes, and the shared palette CSS at 30,787 bytes. The home and shorts\nroutes also fetched images from `dropper.waylonwalker.com`; those remain\nexternal to the local test server. Per-request encoded and decoded transfer\nlengths, URLs, types and completion state are retained in each `results.json`.\n\n### Invalid reader route\n\nAll ten reader runs were marked invalid. The freshly generated `reader/index.html`\nrequests `/_pagefind/pagefind-ui.css` and `.js`, but this output has neither\nfile; the server correctly returns 404 with HTML MIME. The harness records two\nfailed requests and two invalid asset responses per run. This is missing output\nfrom the site build, not a reason to suppress the harness checks. Also, the\nfresh page contains zero reader entries, so it does not represent a populated\nproduction reader. Reader timings are excluded from the table and from any\nnoise estimate.\n\n## Reproduction\n\nUse a clean snapshot of the same site source state, including the intended\nworking-tree content changes. Keep `.env` out of the snapshot and provide the\nsite's encryption keys only to the build process through environment\nvariables. Pin the Markata Go and harness revisions above.\n\n```sh\nrsync -a --delete \\\n  --exclude='.git' --exclude='.env' --exclude='.env.*' \\\n  --exclude='output/' --exclude='cache/' --exclude='.markata/' \\\n  --exclude='.markata-cache/' --exclude='.steam_cache/' \\\n  --exclude='.output.markata-serving/' --exclude='node_modules/' \\\n  \"$SITE_CHECKOUT/\" \"$SITE_SRC/\"\n\ngit -C \"$MARKATA_REPO\" worktree add --detach \"$MARKATA_BUILD\" \\\n  0af03c725fecacec934ba1d51649ca7a86155e01\ngo -C \"$MARKATA_BUILD\" build -o \"$MARKATA_BIN\" ./cmd/markata-go\n\n\"$MARKATA_BIN\" build --clean \\\n  -c markata-go.toml \\\n  --site-dir \"$SITE_SRC\" \\\n  -o \"$SITE_OUT\"\n\npython scripts/slow3g_site_server.py --root \"$SITE_OUT\" --port 8000\npython scripts/slow3g_site_server.py --root \"$SITE_OUT\" --port 8001\n\nuv run --script scripts/slow3g_compare.py \\\n  --chromium /usr/bin/chromium \\\n  --before http://127.0.0.1:8000/ \\\n  --after http://127.0.0.1:8001/ \\\n  --runs 5 --observe-ms 16000 --timeout-ms 26000 \\\n  --checkpoints 1000 2000 5000 8000 12000 15000 --min-frames 5 \\\n  --output docs/reports/slow3g-1554/aa-home\n```\n\nRepeat the capture command with both route URLs changed to `/archive/`,\n`/blogging-for-me/`, `/shorts/` and `/reader/`, and use separate output\ndirectories. Inspect the saved `filmstrip.html` and frames for readability.\nKeep failed requests and wrong-MIME responses in the report as invalid runs.\n\n## Preserved artifacts\n\nEach `aa-*` directory contains `results.json`, `summary.json`, `summary.csv`,\n`filmstrip.html`, all 60 requested checkpoint frames and the contact sheets\nused for the manual readability review. The reader directory preserves its\nfailed requests and invalid-asset diagnostics as well.\n",
      "summary": "Real generated-site A/A measurements validating the Slow 3G filmstrip harness.",
      "date_published": "2026-10-13T00:00:00Z",
      "date_modified": "2026-10-13T00:00:00Z",
      "tags": [
        "performance",
        "benchmarking",
        "validation"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/editorial-history/",
      "url": "https://markata.dev/docs/guides/editorial-history/",
      "title": "Editorial history",
      "content_html": "\u003cp\u003eKeep the writer prominent while giving every editor credit. The default theme\nshows editors below the author byline. The first credited editor is visible;\nadditional editors appear in a compact avatar stack that expands to show their\nnames and roles. Credit order follows the post\u0026rsquo;s \u003ccode\u003eauthors\u003c/code\u003e list. Editing and\nreviewing roles, including \u003ccode\u003ecopy editor\u003c/code\u003e, \u003ccode\u003einternal-link-editor\u003c/code\u003e, \u003ccode\u003eeditor\u003c/code\u003e, and\n\u003ccode\u003ewriting-review-editing\u003c/code\u003e, are grouped as editors. Coauthors keep their original\norder and prominence.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ewaylon\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecopy-editor-agent\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erole\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecopy editor\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elinking-agent\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erole\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003einternal link editor\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eConfigure contributor names and avatars as described in \u003ca href=\"../authors/\"\u003eAuthors\u003c/a\u003e.\nThe native \u003ca href=\"../editorial-authoring/\"\u003eeditorial authoring commands\u003c/a\u003e can commit\nselected human or agent edits and fill in the revision history automatically.\u003c/p\u003e\n\u003ch2 id=\"record-a-revision\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRecord a revision\u003c/span\u003e \u003ca href=\"#record-a-revision\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd an event to \u003ccode\u003eeditorial_history\u003c/code\u003e after committing an editor\u0026rsquo;s changes. Keep\nprevious events. Each event points to one file at one exact revision, even when\na commit edits several posts.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eeditorial_history\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003eschema_version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eevent_id\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;session-id:pages/blog/example.md\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eauthor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecopy-editor-agent\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erole\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecopy-editor\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eedited\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erecorded_by\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecopy-editor-agent\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erecorded_at\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;2026-10-11T15:00:00Z\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebase_commit\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecommit\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epages/blog/example.md\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003efile_url\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://github.com/OWNER/REPO/blob/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/pages/blog/example.md\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esummary\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCorrected spelling and grammar.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eReplace the example SHAs with real full 40-character commit SHAs and the URL\nwith the matching repository and file. Use \u003ccode\u003eaction: reviewed\u003c/code\u003e for an unchanged\nreview. Set \u003ccode\u003erecorded_by\u003c/code\u003e to the importer when someone else records existing\nwork; the page displays that distinction. The native tools also record digest\nfields, diff URLs, and event IDs for later automation. The viewer does not claim\nthat a historical review covers today\u0026rsquo;s content.\u003c/p\u003e\n\u003ch2 id=\"inspect-changes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInspect changes\u003c/span\u003e \u003ca href=\"#inspect-changes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe built post has a collapsed \u003cstrong\u003eEditorial history\u003c/strong\u003e section, newest event\nfirst. Each entry identifies the contributor, role, action, timestamp, summary,\nand commit. Readers can open the exact file or its diff in GitHub. These links\nand the history work without JavaScript.\u003c/p\u003e\n\u003cp\u003eFor edit events with valid before and after revisions, \u003cstrong\u003eShow changes here\u003c/strong\u003e\nloads a small comparison viewer and fetches those two files directly from\nGitHub. Added words are underlined and removed words are struck through.\nThe viewer compares historical Markdown source, excluding YAML frontmatter.\nMarkdown syntax remains visible; it does not execute historical HTML or\nreconstruct ownership of the current rendered article. A change affecting only\nfrontmatter reports that no Markdown body changes occurred.\u003c/p\u003e\n\u003cp\u003eRevision fetching starts only after a reader clicks the comparison control.\nThe build does not contact GitHub or require the site\u0026rsquo;s full Git history.\nThe viewer has no third-party script dependency, limits each file to 512 KiB,\nand caps comparison work for extensive rewrites. Large rewrites may highlight\na whole changed passage rather than each word.\u003c/p\u003e\n\u003cp\u003ePush the recorded commits before publishing their links. Private repositories,\nmissing revisions, offline connections, and restrictive content security\npolicies can prevent inline comparisons. Readers can retry or open the GitHub\ndiff with their own account. No credentials are sent to GitHub by the inline\nviewer. For a CSP, allow the site\u0026rsquo;s own scripts and styles and permit\n\u003ccode\u003econnect-src https://raw.githubusercontent.com\u003c/code\u003e for inline comparisons.\u003c/p\u003e\n\u003ch2 id=\"custom-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom templates\u003c/span\u003e \u003ca href=\"#custom-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe normalized template fields are \u003ccode\u003epost.editorial_history_view\u003c/code\u003e,\n\u003ccode\u003epost.byline_authors\u003c/code\u003e, \u003ccode\u003epost.byline_editors\u003c/code\u003e, and\n\u003ccode\u003epost.additional_editor_count\u003c/code\u003e. The original \u003ccode\u003epost.author_objects\u003c/code\u003e and\n\u003ccode\u003epost.Extra.editorial_history\u003c/code\u003e remain available. The default template uses\n\u003ccode\u003ecomponents/editorial_history.html\u003c/code\u003e; sites overriding \u003ccode\u003epost.html\u003c/code\u003e should\ninclude that component and conditionally load \u003ccode\u003ecss/editorial-history.css\u003c/code\u003e\nand \u003ccode\u003ejs/editorial-history.js\u003c/code\u003e when normalized history exists. Asset paths\nshould use \u003ccode\u003etheme_asset_hashed\u003c/code\u003e. The component supplies the heavy viewer\u0026rsquo;s\nhashed asset URL for loading only on demand.\u003c/p\u003e\n\u003cp\u003eMalformed records and unsupported schema versions are skipped. Unsafe or\nmismatched revision coordinates leave metadata without executable links.\nGitHub diff links are rebuilt from validated file coordinates, so they always\ntarget the recorded file in the recorded commit.\u003c/p\u003e\n",
      "content_text": "\nKeep the writer prominent while giving every editor credit. The default theme\nshows editors below the author byline. The first credited editor is visible;\nadditional editors appear in a compact avatar stack that expands to show their\nnames and roles. Credit order follows the post's `authors` list. Editing and\nreviewing roles, including `copy editor`, `internal-link-editor`, `editor`, and\n`writing-review-editing`, are grouped as editors. Coauthors keep their original\norder and prominence.\n\n```yaml\nauthors:\n  - waylon\n  - id: copy-editor-agent\n    role: copy editor\n  - id: linking-agent\n    role: internal link editor\n```\n\nConfigure contributor names and avatars as described in [Authors](../authors/).\nThe native [editorial authoring commands](../editorial-authoring/) can commit\nselected human or agent edits and fill in the revision history automatically.\n\n## Record a revision\n\nAdd an event to `editorial_history` after committing an editor's changes. Keep\nprevious events. Each event points to one file at one exact revision, even when\na commit edits several posts.\n\n```yaml\neditorial_history:\n  - schema_version: 1\n    event_id: \"session-id:pages/blog/example.md\"\n    author: copy-editor-agent\n    role: copy-editor\n    action: edited\n    recorded_by: copy-editor-agent\n    recorded_at: \"2026-10-11T15:00:00Z\"\n    base_commit: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n    commit: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n    path: pages/blog/example.md\n    file_url: https://github.com/OWNER/REPO/blob/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/pages/blog/example.md\n    summary: Corrected spelling and grammar.\n```\n\nReplace the example SHAs with real full 40-character commit SHAs and the URL\nwith the matching repository and file. Use `action: reviewed` for an unchanged\nreview. Set `recorded_by` to the importer when someone else records existing\nwork; the page displays that distinction. The native tools also record digest\nfields, diff URLs, and event IDs for later automation. The viewer does not claim\nthat a historical review covers today's content.\n\n## Inspect changes\n\nThe built post has a collapsed **Editorial history** section, newest event\nfirst. Each entry identifies the contributor, role, action, timestamp, summary,\nand commit. Readers can open the exact file or its diff in GitHub. These links\nand the history work without JavaScript.\n\nFor edit events with valid before and after revisions, **Show changes here**\nloads a small comparison viewer and fetches those two files directly from\nGitHub. Added words are underlined and removed words are struck through.\nThe viewer compares historical Markdown source, excluding YAML frontmatter.\nMarkdown syntax remains visible; it does not execute historical HTML or\nreconstruct ownership of the current rendered article. A change affecting only\nfrontmatter reports that no Markdown body changes occurred.\n\nRevision fetching starts only after a reader clicks the comparison control.\nThe build does not contact GitHub or require the site's full Git history.\nThe viewer has no third-party script dependency, limits each file to 512 KiB,\nand caps comparison work for extensive rewrites. Large rewrites may highlight\na whole changed passage rather than each word.\n\nPush the recorded commits before publishing their links. Private repositories,\nmissing revisions, offline connections, and restrictive content security\npolicies can prevent inline comparisons. Readers can retry or open the GitHub\ndiff with their own account. No credentials are sent to GitHub by the inline\nviewer. For a CSP, allow the site's own scripts and styles and permit\n`connect-src https://raw.githubusercontent.com` for inline comparisons.\n\n## Custom templates\n\nThe normalized template fields are `post.editorial_history_view`,\n`post.byline_authors`, `post.byline_editors`, and\n`post.additional_editor_count`. The original `post.author_objects` and\n`post.Extra.editorial_history` remain available. The default template uses\n`components/editorial_history.html`; sites overriding `post.html` should\ninclude that component and conditionally load `css/editorial-history.css`\nand `js/editorial-history.js` when normalized history exists. Asset paths\nshould use `theme_asset_hashed`. The component supplies the heavy viewer's\nhashed asset URL for loading only on demand.\n\nMalformed records and unsupported schema versions are skipped. Unsafe or\nmismatched revision coordinates leave metadata without executable links.\nGitHub diff links are rebuilt from validated file coordinates, so they always\ntarget the recorded file in the recorded commit.\n",
      "summary": "Credit editors and inspect their recorded changes on built posts",
      "date_published": "2026-10-11T00:00:00Z",
      "date_modified": "2026-10-11T00:00:00Z",
      "tags": [
        "documentation",
        "authors",
        "frontmatter"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/editorial-authoring/",
      "url": "https://markata.dev/docs/guides/editorial-authoring/",
      "title": "Attributed editorial authoring",
      "content_html": "\u003ch2 id=\"editorial-authoring\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEditorial authoring\u003c/span\u003e \u003ca href=\"#editorial-authoring\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse the editorial commands when a person or agent is editing a post and the\nresult needs a durable author, role, commit, and GitHub link.\u003c/p\u003e\n\u003cp\u003eStart a session from clean tracked Markdown files:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go editorial start posts/my-post.md \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --author editor-id --role copy-editor\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEdit the files, then finish the session:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go editorial finish --session SESSION-UUID \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --summary \u003cspan class=\"s2\"\u003e\u0026#34;Corrected grammar and tightened headings\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAn edited session creates two owned commits. The first contains the post edits\nand contributor credit. The second appends an \u003ccode\u003eeditorial_history\u003c/code\u003e event with\nthe exact file URL, diff URL, commit SHA, digest, role, and summary. Unchanged\nposts are recorded as reviews with a metadata commit only.\u003c/p\u003e\n\u003cp\u003eFor changes that already exist in the working tree, use the explicit commit\npath:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go editorial commit posts/my-post.md \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --author linker-id --role internal-link-editor \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --summary \u003cspan class=\"s2\"\u003e\u0026#34;Added links to related posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSelected staged changes are rejected so ownership is explicit. Other staged\nand unstaged files stay in place. Add \u003ccode\u003e--json\u003c/code\u003e for automation or \u003ccode\u003e--dry-run\u003c/code\u003e\nto validate inputs without changing the repository.\u003c/p\u003e\n\u003cp\u003eWhen a post has no \u003ccode\u003eauthor\u003c/code\u003e or \u003ccode\u003eauthors\u003c/code\u003e field, the command uses the configured\ndefault author when one is marked in the site\u0026rsquo;s author configuration. You can\noverride it explicitly with \u003ccode\u003e--primary-author writer-id\u003c/code\u003e; the editor is never\nsilently promoted to the post\u0026rsquo;s primary writer.\u003c/p\u003e\n\u003cp\u003eWhen an agent runs commands for a human who wrote the edits, keep the human\u0026rsquo;s\nID in \u003ccode\u003e--author\u003c/code\u003e and use \u003ccode\u003e--recorded-by\u003c/code\u003e for the agent\u0026rsquo;s ID:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go editorial commit posts/my-post.md \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --author alex --role copy-editor --recorded-by agent-model-id \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --summary \u003cspan class=\"s2\"\u003e\u0026#34;Alex corrected grammar\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe content commit credits Alex; the attribution commit credits the recorder.\nThe built history shows that distinction. For a session, supply \u003ccode\u003e--recorded-by\u003c/code\u003e\nwhen starting it; the recorder ID is retained for finish and retries.\u003c/p\u003e\n",
      "content_text": "\n## Editorial authoring\n\nUse the editorial commands when a person or agent is editing a post and the\nresult needs a durable author, role, commit, and GitHub link.\n\nStart a session from clean tracked Markdown files:\n\n```bash\nmarkata-go editorial start posts/my-post.md \\\n  --author editor-id --role copy-editor\n```\n\nEdit the files, then finish the session:\n\n```bash\nmarkata-go editorial finish --session SESSION-UUID \\\n  --summary \"Corrected grammar and tightened headings\"\n```\n\nAn edited session creates two owned commits. The first contains the post edits\nand contributor credit. The second appends an `editorial_history` event with\nthe exact file URL, diff URL, commit SHA, digest, role, and summary. Unchanged\nposts are recorded as reviews with a metadata commit only.\n\nFor changes that already exist in the working tree, use the explicit commit\npath:\n\n```bash\nmarkata-go editorial commit posts/my-post.md \\\n  --author linker-id --role internal-link-editor \\\n  --summary \"Added links to related posts\"\n```\n\nSelected staged changes are rejected so ownership is explicit. Other staged\nand unstaged files stay in place. Add `--json` for automation or `--dry-run`\nto validate inputs without changing the repository.\n\nWhen a post has no `author` or `authors` field, the command uses the configured\ndefault author when one is marked in the site's author configuration. You can\noverride it explicitly with `--primary-author writer-id`; the editor is never\nsilently promoted to the post's primary writer.\n\nWhen an agent runs commands for a human who wrote the edits, keep the human's\nID in `--author` and use `--recorded-by` for the agent's ID:\n\n```bash\nmarkata-go editorial commit posts/my-post.md \\\n  --author alex --role copy-editor --recorded-by agent-model-id \\\n  --summary \"Alex corrected grammar\"\n```\n\nThe content commit credits Alex; the attribution commit credits the recorder.\nThe built history shows that distinction. For a session, supply `--recorded-by`\nwhen starting it; the recorder ID is retained for finish and retries.\n",
      "summary": "Use markata-go to make isolated, attributed post edits.",
      "date_published": "2026-10-11T00:00:00Z",
      "date_modified": "2026-10-11T00:00:00Z",
      "tags": [
        "editorial",
        "cli"
      ]
    },
    {
      "id": "https://markata.dev/docs/reports/adaptive-client-loading-hardening/",
      "url": "https://markata.dev/docs/reports/adaptive-client-loading-hardening/",
      "title": "Adaptive Loading Hardening",
      "content_html": "\u003cp\u003eAn audit of the existing full-document View Transition navigator found that it\ncould reset loading attributes to server defaults. The final follow-up preserves\nthose attributes, initializes new-route authored media, and restarts a bounded\ntiming window on its existing completion event. Chromium integration exercises\nthat actual navigator for Auto and both manual modes. The CDP/Lighthouse tables\nbelow measure checkpoint \u003ccode\u003eaa86d8ec\u003c/code\u003e; this route-entry follow-up adds about 68 gzip\nbytes to the controller and runs on subsequent route completion, not initial\npaint. Initial-load policies and representative media markup are unchanged.\u003c/p\u003e\n\u003cp\u003eIssue \u003ca href=\"https://github.com/WaylonWalker/markata-go/issues/1524\"\u003e#1524\u003c/a\u003e, existing\n\u003ccode\u003efeat/adaptive-client-loading\u003c/code\u003e branch. This continues the design and implementation\ncommits rather than replacing their architecture.\u003c/p\u003e\n\u003ch2 id=\"benefit\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBenefit\u003c/span\u003e \u003ca href=\"#benefit\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe final controller is 12,072 source bytes, 6,408 generated/minified bytes,\n2,393 bytes gzip (level 6), and 2,125 bytes Brotli.\nThe generated main stylesheet delta is 2,134 bytes uncompressed and 433 bytes\ngzip. One deferred controller request is added; CSS uses the existing request.\nOverall route request counts also reflect removed optional player assets.\u003c/p\u003e\n\u003cp\u003eReal HTTP transfer tests prove deferred startup before \u003ccode\u003eload\u003c/code\u003e, timing collection\nwith PerformanceObserver and Network Information disabled, constrained Auto,\nfour-good recovery, offline/online hysteresis, manual precedence, mismatch\nKeep/Use Auto actions, unchanged loaded image sources, stable video geometry,\nand no playback restart. Cached images cannot masquerade as fast network\nmeasurements. A page stops after twelve votes; another page can provide new\nmeasurements. Generic healthy 4g hints cannot erase measured poor confidence;\nbrowser Save Data intent keeps Auto constrained even with fast measurements.\u003c/p\u003e\n\u003ch3 id=\"cdp-repeat-measurements\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCDP repeat measurements\u003c/span\u003e \u003ca href=\"#cdp-repeat-measurements\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEach cell is a median of three fresh contexts. Network Information is disabled;\nAuto has no manual preference or seeded confidence. Mobile is 390×844, with\n150 ms latency and 192 KiB/s downstream for constrained cases. Desktop is\n1365×900. Feed/image routes receive the same four 700-pixel scrolls. LCP and\nCLS are captured before scrolling; transfer totals include exploration.\u003c/p\u003e\n\u003cp\u003eBaseline is \u003ccode\u003e73c4f606\u003c/code\u003e. Final candidate after-runs were repeated after reserving\nposter geometry. All runs use gzip responses from the same local server and\nlive external media, with a 2.5-second post-load observation window. Baseline\nand candidate are built from an isolated copy of the current real site\u0026rsquo;s inputs,\nincluding its local edits, with separate cache/output directories. The source\nsite is unchanged. Encryption is disabled equally for both builds; Searchcraft\nindex publication is disabled. These totals are not directly comparable to the\nolder report\u0026rsquo;s server/compression setup. First-party inputs and build output\nare deterministic; external media and server redirect latency still vary.\u003c/p\u003e\n\u003cp\u003eRaw per-run metrics, paint attribution, confidence, and aborted requests are in\n\u003ccode\u003edocs/reports/adaptive-loading-hardening-results.json\u003c/code\u003e. Aborted baseline video\nrequests are included in request counts; totals include completed CDP transfers.\nThis is a bounded observation window, not the lifetime download volume.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eMode\u003c/th\u003e\n\u003cth\u003eRoute\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eBytes before → after\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eRequests\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eMedia bytes\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eLCP seconds\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eCLS\u003c/th\u003e\n\u003cth\u003eFinal policy\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eauto-constrained\u003c/td\u003e\n\u003ctd\u003e/vimgrep-open-buffers/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e652,982 → 649,995\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e50 → 49\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1.344 → 1.812\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0266 → 0.0276\u003c/td\u003e\n\u003ctd\u003econstrained\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eauto-constrained\u003c/td\u003e\n\u003ctd\u003e/til/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e723,982 → 688,951\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e63 → 56\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e32,520 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1.420 → 1.412\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0674 → 0.0681\u003c/td\u003e\n\u003ctd\u003enormal\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eauto-constrained\u003c/td\u003e\n\u003ctd\u003e/2025-nas/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1,334,700 → 1,331,512\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e60 → 59\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e3.996 → 3.952\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0073 → 0.0075\u003c/td\u003e\n\u003ctd\u003econstrained\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eauto-constrained\u003c/td\u003e\n\u003ctd\u003e/tmux-pop-size/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1,387,406 → 886,531\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e57 → 57\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e502,099 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e4.044 → 4.036\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0073 → 0.0075\u003c/td\u003e\n\u003ctd\u003econstrained\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eauto-constrained\u003c/td\u003e\n\u003ctd\u003e/bloatware-is-dying/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e766,187 → 763,718\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e60 → 57\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e2.844 → 2.948\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0109 → 0.0111\u003c/td\u003e\n\u003ctd\u003econstrained\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eauto-normal\u003c/td\u003e\n\u003ctd\u003e/vimgrep-open-buffers/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e652,978 → 649,995\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e50 → 49\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.672 → 0.428\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0072 → 0.0071\u003c/td\u003e\n\u003ctd\u003enormal\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eauto-normal\u003c/td\u003e\n\u003ctd\u003e/til/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e952,811 → 688,694\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e60 → 56\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e261,857 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.732 → 0.560\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0618 → 0.0071\u003c/td\u003e\n\u003ctd\u003enormal\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eauto-normal\u003c/td\u003e\n\u003ctd\u003e/2025-nas/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1,334,030 → 1,331,506\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e60 → 59\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.760 → 0.444\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0072 → 0.0071\u003c/td\u003e\n\u003ctd\u003enormal\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eauto-normal\u003c/td\u003e\n\u003ctd\u003e/tmux-pop-size/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1,387,390 → 886,532\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e57 → 57\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e502,099 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.776 → 0.472\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0072 → 0.0071\u003c/td\u003e\n\u003ctd\u003enormal\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eauto-normal\u003c/td\u003e\n\u003ctd\u003e/bloatware-is-dying/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1,539,251 → 763,718\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e60 → 57\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e773,075 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.992 → 0.520\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0072 → 0.0071\u003c/td\u003e\n\u003ctd\u003enormal\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003esave-data-constrained\u003c/td\u003e\n\u003ctd\u003e/vimgrep-open-buffers/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e652,998 → 649,995\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e50 → 49\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1.632 → 1.536\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0266 → 0.0279\u003c/td\u003e\n\u003ctd\u003econstrained\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003esave-data-constrained\u003c/td\u003e\n\u003ctd\u003e/til/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e723,756 → 688,683\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e63 → 56\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e32,512 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1.520 → 1.400\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0674 → 0.0702\u003c/td\u003e\n\u003ctd\u003econstrained\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003esave-data-constrained\u003c/td\u003e\n\u003ctd\u003e/2025-nas/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1,334,510 → 1,331,521\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e60 → 59\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e3.932 → 3.972\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0073 → 0.0084\u003c/td\u003e\n\u003ctd\u003econstrained\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003esave-data-constrained\u003c/td\u003e\n\u003ctd\u003e/tmux-pop-size/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1,387,402 → 886,536\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e57 → 57\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e502,095 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e4.044 → 4.040\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0073 → 0.0084\u003c/td\u003e\n\u003ctd\u003econstrained\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003esave-data-constrained\u003c/td\u003e\n\u003ctd\u003e/bloatware-is-dying/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e766,187 → 763,718\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e60 → 57\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e2.772 → 2.988\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0109 → 0.0141\u003c/td\u003e\n\u003ctd\u003econstrained\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003edesktop-normal\u003c/td\u003e\n\u003ctd\u003e/vimgrep-open-buffers/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e652,986 → 649,995\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e50 → 49\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.724 → 0.548\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0000 → 0.0000\u003c/td\u003e\n\u003ctd\u003enormal\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003edesktop-normal\u003c/td\u003e\n\u003ctd\u003e/til/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e953,124 → 688,679\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e61 → 56\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e262,085 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.848 → 0.904\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0342 → 0.0052\u003c/td\u003e\n\u003ctd\u003enormal\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003edesktop-normal\u003c/td\u003e\n\u003ctd\u003e/2025-nas/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1,334,502 → 1,331,513\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e60 → 59\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.812 → 0.484\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0000 → 0.0000\u003c/td\u003e\n\u003ctd\u003enormal\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003edesktop-normal\u003c/td\u003e\n\u003ctd\u003e/tmux-pop-size/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1,387,905 → 886,530\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e58 → 57\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e502,096 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1.504 → 0.960\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0138 → 0.0000\u003c/td\u003e\n\u003ctd\u003enormal\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003edesktop-normal\u003c/td\u003e\n\u003ctd\u003e/bloatware-is-dying/\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1,539,761 → 763,718\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e61 → 57\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e773,093 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1.012 → 0.592\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0052 → 0.0058\u003c/td\u003e\n\u003ctd\u003enormal\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eAuto independently detects the constrained profile on the text, image-heavy,\nvideo, and embed routes. The feed has only one usable poor sample and remains\nNormal: many remote media responses omit Timing-Allow-Origin. It still saves\nabout 35 KB and seven requests through the conservative static policy. This\nis not a claim that Auto classified the feed as constrained. Auto normal\nalso stays Normal when there are fewer than four actual good media/navigation\nsamples; generic 4g alone does not grant autoplay.\u003c/p\u003e\n\u003cp\u003eConstrained video avoids approximately 501 KB total and 502 KB media transfer.\nConstrained embed transfer is essentially unchanged (about 2.5 KB less), with\nthree fewer requests; that baseline did not transfer embed media in the window.\nNormal embed runs do show substantial deferred media savings. The controller\ncost and media savings are separate measurements.\u003c/p\u003e\n\u003ch3 id=\"lighthouse-separate-method\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLighthouse (separate method)\u003c/span\u003e \u003ca href=\"#lighthouse-separate-method\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eLighthouse 12.8.2 mobile simulated throttling, performance category, Chromium.\nComparable before/after configurations; these are snapshots for four routes,\nand three-run medians for video. Never subtract these from CDP measurements.\nTotals and counts come from Lighthouse network-requests, including redirects.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eRoute\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eLCP seconds\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eCLS\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eTotal bytes\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eMedia bytes\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eRequests\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003etext\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e4.956 → 5.105\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0000 → 0.0000\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e652,988 → 649,995\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e50 → 49\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003etil\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e5.482 → 5.189\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0000 → 0.0647\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e5,214,156 → 689,525\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e4,522,564 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e60 → 56\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2025-nas\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e7.385 → 6.382\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0000 → 0.0075\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1,334,327 → 1,331,554\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e60 → 59\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003evideo\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e6.157 → 6.229\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0000 → 0.0086\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1,387,879 → 887,168\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e502,101 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e57 → 57\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ebloatware-is-dying\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e5.855 → 5.708\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0.0000 → 0.0075\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e1,540,179 → 763,718\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e773,608 → 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e60 → 57\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"video-lcp-and-stability\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVideo LCP and stability\u003c/span\u003e \u003ca href=\"#video-lcp-and-stability\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe original 10.78 → 13.85 s constrained regression did not reproduce. Final\nconstrained CDP video medians are 4.044 → 4.036 s; desktop is\n1.504 → 0.960 s. Absolute times changed with response compression and harness\nconditions, so this establishes a comparable local delta, not a universal\nspeedup. Mobile\u0026rsquo;s measured LCP is a paragraph, while desktop may count a\nvideo frame or its new poster. First candidate desktop medians were\n1.50 → 1.56 s, with substantial per-run variance.\u003c/p\u003e\n\u003cp\u003eA Lighthouse trace shows the poster API request returning a 307 after about\n629 ms, followed by a 78 ms, 3.3 KB thumbnail response. Both poster and video\nrequests were Low priority; poster work starts earlier, not later. This\nredirect/server latency explains why a tiny poster can still be a late desktop\npaint. No evidence attributes the old regression to controller initialization.\nThe historical run lacks a trace, so its exact cause cannot be established.\u003c/p\u003e\n\u003cp\u003eLayout-shift attribution identified content below the unsized video moving\nwhen the poster arrives. Reserving a 16:9 frame for derived 1200×675 posters\nremoved that shift in final desktop video runs (CLS about .00002). Raw authored\nheight/inline styles remain authoritative. Loaded images are not replaced and\npolicy updates do not pause, rewind, reload, or replace actively requested media.\nThe controller does not enable animations in response to improved connectivity.\nSmall mobile font/layout shifts remain site-level baseline behavior.\u003c/p\u003e\n\u003ch2 id=\"tradeoffs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTradeoffs\u003c/span\u003e \u003ca href=\"#tradeoffs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGeneric network hints bootstrap conservatively rather than declaring a fast\nconnection. Timing needs useful same-origin/Timing-Allow-Origin transfers;\nopaque, cached, tiny, and neutral-rate resources do not vote. Observations end\nafter thirty seconds or twelve votes, so later changes may require another page.\nNo continuous polling or framework is added. Session confidence expires after\nten minutes. The new observer adds bounded lifecycle work for late resources.\u003c/p\u003e\n\u003cp\u003eExplicit raw autoplay and configured Markdown autoplay survive as\n\u003ccode\u003edata-authored-autoplay=\u0026quot;true\u0026quot;\u003c/code\u003e. Full Quality or measured fast Auto at page entry can start\nunrequested authored media. Fresh fast evidence during a page view affects\nsubsequent pages and does not suddenly animate an existing poster. Save Data, unknown/Normal/constrained Auto, and\nreduced motion suppress automatic playback. Raw video without autoplay never\ninherits it merely from site-wide config. Native controls and sources remain.\nWith JavaScript disabled, authored autoplay also requires interaction: this\nis the deliberate conservative-baseline tradeoff. Browser autoplay permissions\ncan still reject playback; the controller does not retry or restart it.\u003c/p\u003e\n\u003cp\u003eChromium, Firefox (installed Playwright Firefox 1511), and Brave integration\npassed with missing Network Information, real timing fallback, all user modes,\nmismatch UI, video interaction, recovery, offline/online, sample caps, and cache\nexclusion. Brave\u0026rsquo;s Network Information is deliberately disabled in the portable\npath tests; this is not a claim about every privacy setting. Safari/iOS were\nnot run. No broader device study is claimed.\u003c/p\u003e\n\u003ch2 id=\"readiness\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReadiness\u003c/span\u003e \u003ca href=\"#readiness\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdaptive loading: \u003cstrong\u003eREADY FOR PR\u003c/strong\u003e after the recorded validation and clean commit.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ego test ./...\u003c/code\u003e passes using disk-backed TMPDIR.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enode --test scripts/adaptive-loading.test.cjs\u003c/code\u003e: 13 pass.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enode --test scripts/adaptive-loading.browser.test.cjs\u003c/code\u003e: Chromium/Firefox/Brave pass.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ejust lint-new\u003c/code\u003e, \u003ccode\u003ego fmt ./...\u003c/code\u003e, and \u003ccode\u003egit diff --check\u003c/code\u003e pass.\u003c/li\u003e\n\u003cli\u003eGenerated controller stays below the 3 KB gzip ceiling.\u003c/li\u003e\n\u003cli\u003eSpec, configuration/plugin/user docs, and bundled site-agent guidance updated.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eInitial test/build attempts hit the temporary-filesystem quota, and a moved\noutput root was rejected as a symlink. Those incomplete builds and failing\nruns are discarded. Final corpus builds use direct disk paths; final checks\nuse disk-backed temporary files. No unrelated heading_anchors change was made.\u003c/p\u003e\n\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eReview the focused adaptive branch without merging. Keep the poster redirect\nas a measured deployment/media-service follow-up rather than expanding this\ncontroller. Recheck on Safari/iOS when a real device is available. Investigate\npartial navigation separately only after this readiness gate.\u003c/p\u003e\n\u003ch2 id=\"reproduction\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReproduction\u003c/span\u003e \u003ca href=\"#reproduction\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003eadaptive-loading.benchmark.cjs BEFORE_URL AFTER_URL RESULTS.json\u003c/code\u003e runs three\nfresh contexts per mode/route. Serve both output trees with identical gzip\nhandling; the historical Python plain-file server is not the same measurement\nconfiguration. Optional \u003ccode\u003eBENCHMARK_MODES\u003c/code\u003e, \u003ccode\u003eBENCHMARK_ROUTES\u003c/code\u003e, and\n\u003ccode\u003eBENCHMARK_VERSIONS\u003c/code\u003e limit reruns. The browser integration test uses Playwright\nbundled with agent-browser, or \u003ccode\u003ePLAYWRIGHT_MODULE\u003c/code\u003e for another installation.\nSet \u003ccode\u003eADAPTIVE_FIREFOX_EXECUTABLE\u003c/code\u003e when the installed Firefox path differs from\nthe Playwright version\u0026rsquo;s default. Test SVGs use real delayed server responses,\nnot injected vote/state samples. The tiny WebM fixture is a three-second,\n160×90 blue frame generated with FFmpeg/libvpx-vp9; it tests actual media playback.\u003c/p\u003e\n\u003cp\u003eKeep native controls enabled (or supply an accessible play action) for deferred\nvideos. A video deliberately authored without controls needs its own interaction\npath in Save Data and no-JS mode; autoplay intent alone is not a play control.\u003c/p\u003e\n",
      "content_text": "\n\nAn audit of the existing full-document View Transition navigator found that it\ncould reset loading attributes to server defaults. The final follow-up preserves\nthose attributes, initializes new-route authored media, and restarts a bounded\ntiming window on its existing completion event. Chromium integration exercises\nthat actual navigator for Auto and both manual modes. The CDP/Lighthouse tables\nbelow measure checkpoint `aa86d8ec`; this route-entry follow-up adds about 68 gzip\nbytes to the controller and runs on subsequent route completion, not initial\npaint. Initial-load policies and representative media markup are unchanged.\n\nIssue [#1524](https://github.com/WaylonWalker/markata-go/issues/1524), existing\n`feat/adaptive-client-loading` branch. This continues the design and implementation\ncommits rather than replacing their architecture.\n\n## Benefit\n\nThe final controller is 12,072 source bytes, 6,408 generated/minified bytes,\n2,393 bytes gzip (level 6), and 2,125 bytes Brotli.\nThe generated main stylesheet delta is 2,134 bytes uncompressed and 433 bytes\ngzip. One deferred controller request is added; CSS uses the existing request.\nOverall route request counts also reflect removed optional player assets.\n\nReal HTTP transfer tests prove deferred startup before `load`, timing collection\nwith PerformanceObserver and Network Information disabled, constrained Auto,\nfour-good recovery, offline/online hysteresis, manual precedence, mismatch\nKeep/Use Auto actions, unchanged loaded image sources, stable video geometry,\nand no playback restart. Cached images cannot masquerade as fast network\nmeasurements. A page stops after twelve votes; another page can provide new\nmeasurements. Generic healthy 4g hints cannot erase measured poor confidence;\nbrowser Save Data intent keeps Auto constrained even with fast measurements.\n\n### CDP repeat measurements\n\nEach cell is a median of three fresh contexts. Network Information is disabled;\nAuto has no manual preference or seeded confidence. Mobile is 390×844, with\n150 ms latency and 192 KiB/s downstream for constrained cases. Desktop is\n1365×900. Feed/image routes receive the same four 700-pixel scrolls. LCP and\nCLS are captured before scrolling; transfer totals include exploration.\n\nBaseline is `73c4f606`. Final candidate after-runs were repeated after reserving\nposter geometry. All runs use gzip responses from the same local server and\nlive external media, with a 2.5-second post-load observation window. Baseline\nand candidate are built from an isolated copy of the current real site's inputs,\nincluding its local edits, with separate cache/output directories. The source\nsite is unchanged. Encryption is disabled equally for both builds; Searchcraft\nindex publication is disabled. These totals are not directly comparable to the\nolder report's server/compression setup. First-party inputs and build output\nare deterministic; external media and server redirect latency still vary.\n\nRaw per-run metrics, paint attribution, confidence, and aborted requests are in\n`docs/reports/adaptive-loading-hardening-results.json`. Aborted baseline video\nrequests are included in request counts; totals include completed CDP transfers.\nThis is a bounded observation window, not the lifetime download volume.\n\n| Mode | Route | Bytes before → after | Requests | Media bytes | LCP seconds | CLS | Final policy |\n|---|---|---:|---:|---:|---:|---:|---|\n| auto-constrained | /vimgrep-open-buffers/ | 652,982 → 649,995 | 50 → 49 | 0 → 0 | 1.344 → 1.812 | 0.0266 → 0.0276 | constrained |\n| auto-constrained | /til/ | 723,982 → 688,951 | 63 → 56 | 32,520 → 0 | 1.420 → 1.412 | 0.0674 → 0.0681 | normal |\n| auto-constrained | /2025-nas/ | 1,334,700 → 1,331,512 | 60 → 59 | 0 → 0 | 3.996 → 3.952 | 0.0073 → 0.0075 | constrained |\n| auto-constrained | /tmux-pop-size/ | 1,387,406 → 886,531 | 57 → 57 | 502,099 → 0 | 4.044 → 4.036 | 0.0073 → 0.0075 | constrained |\n| auto-constrained | /bloatware-is-dying/ | 766,187 → 763,718 | 60 → 57 | 0 → 0 | 2.844 → 2.948 | 0.0109 → 0.0111 | constrained |\n| auto-normal | /vimgrep-open-buffers/ | 652,978 → 649,995 | 50 → 49 | 0 → 0 | 0.672 → 0.428 | 0.0072 → 0.0071 | normal |\n| auto-normal | /til/ | 952,811 → 688,694 | 60 → 56 | 261,857 → 0 | 0.732 → 0.560 | 0.0618 → 0.0071 | normal |\n| auto-normal | /2025-nas/ | 1,334,030 → 1,331,506 | 60 → 59 | 0 → 0 | 0.760 → 0.444 | 0.0072 → 0.0071 | normal |\n| auto-normal | /tmux-pop-size/ | 1,387,390 → 886,532 | 57 → 57 | 502,099 → 0 | 0.776 → 0.472 | 0.0072 → 0.0071 | normal |\n| auto-normal | /bloatware-is-dying/ | 1,539,251 → 763,718 | 60 → 57 | 773,075 → 0 | 0.992 → 0.520 | 0.0072 → 0.0071 | normal |\n| save-data-constrained | /vimgrep-open-buffers/ | 652,998 → 649,995 | 50 → 49 | 0 → 0 | 1.632 → 1.536 | 0.0266 → 0.0279 | constrained |\n| save-data-constrained | /til/ | 723,756 → 688,683 | 63 → 56 | 32,512 → 0 | 1.520 → 1.400 | 0.0674 → 0.0702 | constrained |\n| save-data-constrained | /2025-nas/ | 1,334,510 → 1,331,521 | 60 → 59 | 0 → 0 | 3.932 → 3.972 | 0.0073 → 0.0084 | constrained |\n| save-data-constrained | /tmux-pop-size/ | 1,387,402 → 886,536 | 57 → 57 | 502,095 → 0 | 4.044 → 4.040 | 0.0073 → 0.0084 | constrained |\n| save-data-constrained | /bloatware-is-dying/ | 766,187 → 763,718 | 60 → 57 | 0 → 0 | 2.772 → 2.988 | 0.0109 → 0.0141 | constrained |\n| desktop-normal | /vimgrep-open-buffers/ | 652,986 → 649,995 | 50 → 49 | 0 → 0 | 0.724 → 0.548 | 0.0000 → 0.0000 | normal |\n| desktop-normal | /til/ | 953,124 → 688,679 | 61 → 56 | 262,085 → 0 | 0.848 → 0.904 | 0.0342 → 0.0052 | normal |\n| desktop-normal | /2025-nas/ | 1,334,502 → 1,331,513 | 60 → 59 | 0 → 0 | 0.812 → 0.484 | 0.0000 → 0.0000 | normal |\n| desktop-normal | /tmux-pop-size/ | 1,387,905 → 886,530 | 58 → 57 | 502,096 → 0 | 1.504 → 0.960 | 0.0138 → 0.0000 | normal |\n| desktop-normal | /bloatware-is-dying/ | 1,539,761 → 763,718 | 61 → 57 | 773,093 → 0 | 1.012 → 0.592 | 0.0052 → 0.0058 | normal |\n\nAuto independently detects the constrained profile on the text, image-heavy,\nvideo, and embed routes. The feed has only one usable poor sample and remains\nNormal: many remote media responses omit Timing-Allow-Origin. It still saves\nabout 35 KB and seven requests through the conservative static policy. This\nis not a claim that Auto classified the feed as constrained. Auto normal\nalso stays Normal when there are fewer than four actual good media/navigation\nsamples; generic 4g alone does not grant autoplay.\n\nConstrained video avoids approximately 501 KB total and 502 KB media transfer.\nConstrained embed transfer is essentially unchanged (about 2.5 KB less), with\nthree fewer requests; that baseline did not transfer embed media in the window.\nNormal embed runs do show substantial deferred media savings. The controller\ncost and media savings are separate measurements.\n\n### Lighthouse (separate method)\n\nLighthouse 12.8.2 mobile simulated throttling, performance category, Chromium.\nComparable before/after configurations; these are snapshots for four routes,\nand three-run medians for video. Never subtract these from CDP measurements.\nTotals and counts come from Lighthouse network-requests, including redirects.\n\n| Route | LCP seconds | CLS | Total bytes | Media bytes | Requests |\n|---|---:|---:|---:|---:|---:|\n| text | 4.956 → 5.105 | 0.0000 → 0.0000 | 652,988 → 649,995 | 0 → 0 | 50 → 49 |\n| til | 5.482 → 5.189 | 0.0000 → 0.0647 | 5,214,156 → 689,525 | 4,522,564 → 0 | 60 → 56 |\n| 2025-nas | 7.385 → 6.382 | 0.0000 → 0.0075 | 1,334,327 → 1,331,554 | 0 → 0 | 60 → 59 |\n| video | 6.157 → 6.229 | 0.0000 → 0.0086 | 1,387,879 → 887,168 | 502,101 → 0 | 57 → 57 |\n| bloatware-is-dying | 5.855 → 5.708 | 0.0000 → 0.0075 | 1,540,179 → 763,718 | 773,608 → 0 | 60 → 57 |\n\n### Video LCP and stability\n\nThe original 10.78 → 13.85 s constrained regression did not reproduce. Final\nconstrained CDP video medians are 4.044 → 4.036 s; desktop is\n1.504 → 0.960 s. Absolute times changed with response compression and harness\nconditions, so this establishes a comparable local delta, not a universal\nspeedup. Mobile's measured LCP is a paragraph, while desktop may count a\nvideo frame or its new poster. First candidate desktop medians were\n1.50 → 1.56 s, with substantial per-run variance.\n\nA Lighthouse trace shows the poster API request returning a 307 after about\n629 ms, followed by a 78 ms, 3.3 KB thumbnail response. Both poster and video\nrequests were Low priority; poster work starts earlier, not later. This\nredirect/server latency explains why a tiny poster can still be a late desktop\npaint. No evidence attributes the old regression to controller initialization.\nThe historical run lacks a trace, so its exact cause cannot be established.\n\nLayout-shift attribution identified content below the unsized video moving\nwhen the poster arrives. Reserving a 16:9 frame for derived 1200×675 posters\nremoved that shift in final desktop video runs (CLS about .00002). Raw authored\nheight/inline styles remain authoritative. Loaded images are not replaced and\npolicy updates do not pause, rewind, reload, or replace actively requested media.\nThe controller does not enable animations in response to improved connectivity.\nSmall mobile font/layout shifts remain site-level baseline behavior.\n\n## Tradeoffs\n\nGeneric network hints bootstrap conservatively rather than declaring a fast\nconnection. Timing needs useful same-origin/Timing-Allow-Origin transfers;\nopaque, cached, tiny, and neutral-rate resources do not vote. Observations end\nafter thirty seconds or twelve votes, so later changes may require another page.\nNo continuous polling or framework is added. Session confidence expires after\nten minutes. The new observer adds bounded lifecycle work for late resources.\n\nExplicit raw autoplay and configured Markdown autoplay survive as\n`data-authored-autoplay=\"true\"`. Full Quality or measured fast Auto at page entry can start\nunrequested authored media. Fresh fast evidence during a page view affects\nsubsequent pages and does not suddenly animate an existing poster. Save Data, unknown/Normal/constrained Auto, and\nreduced motion suppress automatic playback. Raw video without autoplay never\ninherits it merely from site-wide config. Native controls and sources remain.\nWith JavaScript disabled, authored autoplay also requires interaction: this\nis the deliberate conservative-baseline tradeoff. Browser autoplay permissions\ncan still reject playback; the controller does not retry or restart it.\n\nChromium, Firefox (installed Playwright Firefox 1511), and Brave integration\npassed with missing Network Information, real timing fallback, all user modes,\nmismatch UI, video interaction, recovery, offline/online, sample caps, and cache\nexclusion. Brave's Network Information is deliberately disabled in the portable\npath tests; this is not a claim about every privacy setting. Safari/iOS were\nnot run. No broader device study is claimed.\n\n## Readiness\n\nAdaptive loading: **READY FOR PR** after the recorded validation and clean commit.\n\n- `go test ./...` passes using disk-backed TMPDIR.\n- `node --test scripts/adaptive-loading.test.cjs`: 13 pass.\n- `node --test scripts/adaptive-loading.browser.test.cjs`: Chromium/Firefox/Brave pass.\n- `just lint-new`, `go fmt ./...`, and `git diff --check` pass.\n- Generated controller stays below the 3 KB gzip ceiling.\n- Spec, configuration/plugin/user docs, and bundled site-agent guidance updated.\n\nInitial test/build attempts hit the temporary-filesystem quota, and a moved\noutput root was rejected as a symlink. Those incomplete builds and failing\nruns are discarded. Final corpus builds use direct disk paths; final checks\nuse disk-backed temporary files. No unrelated heading_anchors change was made.\n\n## Next steps\n\nReview the focused adaptive branch without merging. Keep the poster redirect\nas a measured deployment/media-service follow-up rather than expanding this\ncontroller. Recheck on Safari/iOS when a real device is available. Investigate\npartial navigation separately only after this readiness gate.\n\n## Reproduction\n\n`adaptive-loading.benchmark.cjs BEFORE_URL AFTER_URL RESULTS.json` runs three\nfresh contexts per mode/route. Serve both output trees with identical gzip\nhandling; the historical Python plain-file server is not the same measurement\nconfiguration. Optional `BENCHMARK_MODES`, `BENCHMARK_ROUTES`, and\n`BENCHMARK_VERSIONS` limit reruns. The browser integration test uses Playwright\nbundled with agent-browser, or `PLAYWRIGHT_MODULE` for another installation.\nSet `ADAPTIVE_FIREFOX_EXECUTABLE` when the installed Firefox path differs from\nthe Playwright version's default. Test SVGs use real delayed server responses,\nnot injected vote/state samples. The tiny WebM fixture is a three-second,\n160×90 blue frame generated with FFmpeg/libvpx-vp9; it tests actual media playback.\n\n\nKeep native controls enabled (or supply an accessible play action) for deferred\nvideos. A video deliberately authored without controls needs its own interaction\npath in Save Data and no-JS mode; autoplay intent alone is not a play control.\n",
      "summary": "Auto detection, browser correctness, repeat transfer measurements, and PR readiness.",
      "date_published": "2026-10-08T00:00:00Z",
      "date_modified": "2026-10-08T00:00:00Z",
      "tags": [
        "performance",
        "adaptive-loading",
        "benchmark"
      ]
    },
    {
      "id": "https://markata.dev/docs/reports/adaptive-client-loading-benchmark/",
      "url": "https://markata.dev/docs/reports/adaptive-client-loading-benchmark/",
      "title": "Adaptive Client Loading Benchmark",
      "content_html": "\u003cp\u003eHistorical measurements from implementation commit \u003ccode\u003ebbb5cb53\u003c/code\u003e. The hardening\nreport supersedes its policy, autoplay, browser coverage, and readiness findings.\nSee \u003ca href=\"../adaptive-client-loading-hardening/\"\u003eAdaptive loading hardening\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThis report records browser measurements before and after adaptive client loading on the real \u003ccode\u003ewaylonwalker.com\u003c/code\u003e corpus. The source site was not edited. Both builds used the worktree binary and wrote to temporary output directories.\u003c/p\u003e\n\u003ch2 id=\"reproduce\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReproduce\u003c/span\u003e \u003ca href=\"#reproduce\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe site normally builds with \u003ccode\u003ejust build\u003c/code\u003e, which runs \u003ccode\u003emarkata-go build -m config/no-tailwind.toml\u003c/code\u003e. The benchmark used the same site and config with a separate output path and cache:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --site-dir ~/git/waylonwalker.com \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -m ~/git/waylonwalker.com/config/no-tailwind.toml \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -o /tmp/markata-adaptive/output\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eServe the output with \u003ccode\u003epython3 -m http.server 8766 --directory /tmp/markata-adaptive/output\u003c/code\u003e. The Chromium harness used Puppeteer already bundled with Lighthouse, 390×844 with 150 ms latency and 192 KiB/s downstream for mobile, and 1365×900 without shaping for desktop. The constrained run selected Save Data in local storage and rapidly scrolled the feed. Counts and byte totals are CDP transferred bytes, including responses captured during that scroll. LCP and CLS are from the same short run and are directional; the rapid scroll and third-party timing make CLS especially noisy. DOM text is the number of body text characters available at \u003ccode\u003eDOMContentLoaded\u003c/code\u003e, not a paint timestamp.\u003c/p\u003e\n\u003ch2 id=\"representative-mobile-run\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRepresentative mobile run\u003c/span\u003e \u003ca href=\"#representative-mobile-run\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePage\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eBefore requests / bytes\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eAfter requests / bytes\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eBefore / after media bytes\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eBefore / after LCP\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eBefore / after CLS\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eText article \u003ccode\u003e/vimgrep-open-buffers/\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e50 / 1,401,880\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e49 / 1,405,312\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0 / 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e5.90 / 5.93 s\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e.0074 / .0086\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFeed \u003ccode\u003e/til/\u003c/code\u003e after rapid scroll\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e63 / 1,604,478\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e55 / 1,578,159\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e32,513 / 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e5.91 / 5.51 s\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e.442 / .395\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eVideo article \u003ccode\u003e/tmux-pop-size/\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e57 / 2,843,230\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e55 / 2,348,743\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e501,728 / 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e10.78 / 13.85 s\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e.0074 / .0086\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eEmbed article \u003ccode\u003e/bloatware-is-dying/\u003c/code\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e60 / 2,252,247\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e57 / 2,255,430\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0 / 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e9.74 / 9.78 s\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e.056 / .0082\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe text article added about 3.4 KB net and one fewer request. Across the four pages, JavaScript transfer increased by 1.3–1.4 KB; the generated controller is 5,281 bytes uncompressed and 2,031 bytes gzip. It is deferred, non-blocking, and shares the existing page CSS. The video article avoided about 494 KB total, including its 502 KB autoplay transfer, while adding a right-sized poster. The feed avoided 26 KB net and eight requests in this particular rapid-scroll pass. Its remaining images still load as native lazy images when scrolling brings them near the viewport.\u003c/p\u003e\n\u003cp\u003eThe embed page did not transfer media in either CDP run; this run therefore does not support a media-savings claim for that page. It did avoid three requests overall, while its byte total changed by about +3 KB. Its external embed behavior is timing-sensitive. The controller does not make claims about bytes that were not observed.\u003c/p\u003e\n\u003ch2 id=\"desktop-normal-run\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDesktop normal run\u003c/span\u003e \u003ca href=\"#desktop-normal-run\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePage\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eBefore requests / bytes\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eAfter requests / bytes\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eBefore / after media bytes\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eBefore / after LCP\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eText article\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e50 / 1,402,359\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e49 / 1,405,312\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e0 / 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e.93 / .59 s\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFeed\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e59 / 1,605,506\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e53 / 1,577,633\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e32,165 / 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e.80 / .51 s\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eVideo article\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e57 / 2,843,745\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e55 / 2,348,743\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e501,622 / 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e.83 / 1.45 s\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eEmbed article\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e59 / 2,992,113\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e56 / 2,221,185\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e773,597 / 0\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003e.62 / .52 s\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe video article’s raw HTML previously autoplayed a remote MP4. It now keeps native controls and source markup but defaults to no autoplay and \u003ccode\u003epreload=\u0026quot;none\u0026quot;\u003c/code\u003e, so its poster is the initial visual. This accounts for the large stable transfer reduction on both desktop and mobile. The embed page’s desktop reduction is observed in this run; it should be rechecked against a second cache/network state before treating that amount as typical.\u003c/p\u003e\n\u003ch2 id=\"lighthouse-baseline\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLighthouse baseline\u003c/span\u003e \u003ca href=\"#lighthouse-baseline\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMobile Lighthouse baseline reports (12.8.2, simulated throttling) recorded 50 requests / 1.40 MB / 6.37 s LCP for the text page; 63 / 4.32 MB / 7.93 s for the feed (2.74 MB media); 57 / 2.85 MB / 11.86 s for the video page (502 KB media); and 60 / 3.00 MB / 11.42 s for the embed page (774 KB media). These are a separate measurement method from the CDP table above. A comparable post-change Lighthouse run was not captured, so no Lighthouse delta is claimed.\u003c/p\u003e\n\u003ch2 id=\"stability-and-ux-checks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStability and UX checks\u003c/span\u003e \u003ca href=\"#stability-and-ux-checks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eChromium mobile and desktop generated pages kept article/card geometry stable when the policy changed. The Save Data video run made zero media requests; the generated HTML contained no \u003ccode\u003eautoplay\u003c/code\u003e, used \u003ccode\u003epreload=\u0026quot;none\u0026quot;\u003c/code\u003e, and retained a poster and native controls. A Chromium UI smoke check seeded a confident constrained recommendation with manual Full Quality selected: the small status affordance appeared, opened the settings panel with “Full Quality is on. Your connection appears constrained.”, and “Use Auto” cleared the local override. No full-page screenshot is included because the UI is a small native disclosure/status control rather than a separate screen.\u003c/p\u003e\n\u003cp\u003eThe rendered controller gzip size is 2,031 bytes. The added CSS is part of the existing stylesheet (no extra CSS request); the appended rules gzip to roughly 0.5 KB. The control layer adds one script request on pages that do not already bundle it, but the site’s overall request count was flat or lower because optional player CSS and automatic external video loads were removed/deferred. No long-lived observer or polling loop is used; resource timing samples stop after six observations.\u003c/p\u003e\n\u003ch2 id=\"browser-coverage-and-limits\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBrowser coverage and limits\u003c/span\u003e \u003ca href=\"#browser-coverage-and-limits\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eBrowser\u003c/th\u003e\n\u003cth\u003eResult\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eChromium\u003c/td\u003e\n\u003ctd\u003eMobile constrained and desktop normal transfer runs; manual mismatch and Auto action smoke-tested.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eChrome\u003c/td\u003e\n\u003ctd\u003eNot separately installed; Chromium run covers the shared engine behavior.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBrave\u003c/td\u003e\n\u003ctd\u003eNot installed locally. Network Information API is optional and not required.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFirefox\u003c/td\u003e\n\u003ctd\u003eNot installed locally. Portable resource timing, online/offline, and native loading paths are used without browser detection.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSafari/iOS\u003c/td\u003e\n\u003ctd\u003eNot run. The baseline uses native image/video/HTML behavior and avoids reliance on Chromium-only APIs.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThis is a local corpus benchmark, not a broad device study. Timing variation, browser cache state, third-party responses, and site-level autoplay configuration can affect totals. Sites that explicitly set \u003ccode\u003e[markata-go.md_video] autoplay = true\u003c/code\u003e retain that opt-in behavior. The primary tradeoff is that autoplay is no longer the default; readers press native video controls to start playback. More aggressive image deferral, embed-specific click facades, and a repeat Lighthouse after-run remain follow-up work.\u003c/p\u003e\n",
      "content_text": "\n\nHistorical measurements from implementation commit `bbb5cb53`. The hardening\nreport supersedes its policy, autoplay, browser coverage, and readiness findings.\nSee [Adaptive loading hardening](../adaptive-client-loading-hardening/).\n\nThis report records browser measurements before and after adaptive client loading on the real `waylonwalker.com` corpus. The source site was not edited. Both builds used the worktree binary and wrote to temporary output directories.\n\n## Reproduce\n\nThe site normally builds with `just build`, which runs `markata-go build -m config/no-tailwind.toml`. The benchmark used the same site and config with a separate output path and cache:\n\n```sh\nmarkata-go build --site-dir ~/git/waylonwalker.com \\\n  -m ~/git/waylonwalker.com/config/no-tailwind.toml \\\n  -o /tmp/markata-adaptive/output\n```\n\nServe the output with `python3 -m http.server 8766 --directory /tmp/markata-adaptive/output`. The Chromium harness used Puppeteer already bundled with Lighthouse, 390×844 with 150 ms latency and 192 KiB/s downstream for mobile, and 1365×900 without shaping for desktop. The constrained run selected Save Data in local storage and rapidly scrolled the feed. Counts and byte totals are CDP transferred bytes, including responses captured during that scroll. LCP and CLS are from the same short run and are directional; the rapid scroll and third-party timing make CLS especially noisy. DOM text is the number of body text characters available at `DOMContentLoaded`, not a paint timestamp.\n\n## Representative mobile run\n\n| Page | Before requests / bytes | After requests / bytes | Before / after media bytes | Before / after LCP | Before / after CLS |\n|---|---:|---:|---:|---:|---:|\n| Text article `/vimgrep-open-buffers/` | 50 / 1,401,880 | 49 / 1,405,312 | 0 / 0 | 5.90 / 5.93 s | .0074 / .0086 |\n| Feed `/til/` after rapid scroll | 63 / 1,604,478 | 55 / 1,578,159 | 32,513 / 0 | 5.91 / 5.51 s | .442 / .395 |\n| Video article `/tmux-pop-size/` | 57 / 2,843,230 | 55 / 2,348,743 | 501,728 / 0 | 10.78 / 13.85 s | .0074 / .0086 |\n| Embed article `/bloatware-is-dying/` | 60 / 2,252,247 | 57 / 2,255,430 | 0 / 0 | 9.74 / 9.78 s | .056 / .0082 |\n\nThe text article added about 3.4 KB net and one fewer request. Across the four pages, JavaScript transfer increased by 1.3–1.4 KB; the generated controller is 5,281 bytes uncompressed and 2,031 bytes gzip. It is deferred, non-blocking, and shares the existing page CSS. The video article avoided about 494 KB total, including its 502 KB autoplay transfer, while adding a right-sized poster. The feed avoided 26 KB net and eight requests in this particular rapid-scroll pass. Its remaining images still load as native lazy images when scrolling brings them near the viewport.\n\nThe embed page did not transfer media in either CDP run; this run therefore does not support a media-savings claim for that page. It did avoid three requests overall, while its byte total changed by about +3 KB. Its external embed behavior is timing-sensitive. The controller does not make claims about bytes that were not observed.\n\n## Desktop normal run\n\n| Page | Before requests / bytes | After requests / bytes | Before / after media bytes | Before / after LCP |\n|---|---:|---:|---:|---:|\n| Text article | 50 / 1,402,359 | 49 / 1,405,312 | 0 / 0 | .93 / .59 s |\n| Feed | 59 / 1,605,506 | 53 / 1,577,633 | 32,165 / 0 | .80 / .51 s |\n| Video article | 57 / 2,843,745 | 55 / 2,348,743 | 501,622 / 0 | .83 / 1.45 s |\n| Embed article | 59 / 2,992,113 | 56 / 2,221,185 | 773,597 / 0 | .62 / .52 s |\n\nThe video article’s raw HTML previously autoplayed a remote MP4. It now keeps native controls and source markup but defaults to no autoplay and `preload=\"none\"`, so its poster is the initial visual. This accounts for the large stable transfer reduction on both desktop and mobile. The embed page’s desktop reduction is observed in this run; it should be rechecked against a second cache/network state before treating that amount as typical.\n\n## Lighthouse baseline\n\nMobile Lighthouse baseline reports (12.8.2, simulated throttling) recorded 50 requests / 1.40 MB / 6.37 s LCP for the text page; 63 / 4.32 MB / 7.93 s for the feed (2.74 MB media); 57 / 2.85 MB / 11.86 s for the video page (502 KB media); and 60 / 3.00 MB / 11.42 s for the embed page (774 KB media). These are a separate measurement method from the CDP table above. A comparable post-change Lighthouse run was not captured, so no Lighthouse delta is claimed.\n\n## Stability and UX checks\n\nChromium mobile and desktop generated pages kept article/card geometry stable when the policy changed. The Save Data video run made zero media requests; the generated HTML contained no `autoplay`, used `preload=\"none\"`, and retained a poster and native controls. A Chromium UI smoke check seeded a confident constrained recommendation with manual Full Quality selected: the small status affordance appeared, opened the settings panel with “Full Quality is on. Your connection appears constrained.”, and “Use Auto” cleared the local override. No full-page screenshot is included because the UI is a small native disclosure/status control rather than a separate screen.\n\nThe rendered controller gzip size is 2,031 bytes. The added CSS is part of the existing stylesheet (no extra CSS request); the appended rules gzip to roughly 0.5 KB. The control layer adds one script request on pages that do not already bundle it, but the site’s overall request count was flat or lower because optional player CSS and automatic external video loads were removed/deferred. No long-lived observer or polling loop is used; resource timing samples stop after six observations.\n\n## Browser coverage and limits\n\n| Browser | Result |\n|---|---|\n| Chromium | Mobile constrained and desktop normal transfer runs; manual mismatch and Auto action smoke-tested. |\n| Chrome | Not separately installed; Chromium run covers the shared engine behavior. |\n| Brave | Not installed locally. Network Information API is optional and not required. |\n| Firefox | Not installed locally. Portable resource timing, online/offline, and native loading paths are used without browser detection. |\n| Safari/iOS | Not run. The baseline uses native image/video/HTML behavior and avoids reliance on Chromium-only APIs. |\n\nThis is a local corpus benchmark, not a broad device study. Timing variation, browser cache state, third-party responses, and site-level autoplay configuration can affect totals. Sites that explicitly set `[markata-go.md_video] autoplay = true` retain that opt-in behavior. The primary tradeoff is that autoplay is no longer the default; readers press native video controls to start playback. More aggressive image deferral, embed-specific click facades, and a repeat Lighthouse after-run remain follow-up work.\n",
      "summary": "Baseline and post-change browser measurements for adaptive loading on waylonwalker.com.",
      "date_published": "2026-10-07T00:00:00Z",
      "date_modified": "2026-10-07T00:00:00Z",
      "tags": [
        "performance",
        "adaptive-loading",
        "benchmark"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/adaptive-loading/",
      "url": "https://markata.dev/docs/guides/adaptive-loading/",
      "title": "Adaptive Loading",
      "content_html": "\u003cp\u003eMarkata-Go sites keep article text available immediately and let the browser\nload images and video with native HTML behavior. Visitors can choose how much\noptional media work the site should do.\u003c/p\u003e\n\u003ch2 id=\"choose-a-loading-mode\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChoose a loading mode\u003c/span\u003e \u003ca href=\"#choose-a-loading-mode\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOpen \u003cstrong\u003eLoading\u003c/strong\u003e in the site header and choose one of these modes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eAuto\u003c/strong\u003e uses recent browser connection hints and a few real resource timings.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSave Data\u003c/strong\u003e limits optional media work and speculative requests.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFull Quality\u003c/strong\u003e allows optional work to begin sooner.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAuto is the default. A saved Save Data or Full Quality choice always takes\nprecedence over Auto. The preference is stored in the current browser only.\u003c/p\u003e\n\u003ch2 id=\"what-auto-does\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat Auto does\u003c/span\u003e \u003ca href=\"#what-auto-does\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAuto uses \u003ccode\u003enavigator.connection\u003c/code\u003e when the browser exposes it, but the site\nworks without that API. It also learns from a small number of recent navigation\nand resource timings. One slow image or request does not change the mode. Auto\nrequires two meaningful transfers below 2 Mbps to constrain optional work and\nfour consecutive transfers above 4 Mbps with low response latency to recover.\nGeneric 4g/downlink hints initialize Auto but cannot erase measured evidence.\nBrowser Save Data intent constrains Auto immediately. Each page observes at\nmost twelve transfers for thirty seconds; later pages can provide fresh evidence.\nOffline constrains Auto immediately, and reconnecting needs fresh evidence.\nSuggestions require four poor observations for Full Quality or five good ones\nfor Save Data.\u003c/p\u003e\n\u003cp\u003eIf Auto becomes confident that your manual choice no longer fits the\nconnection, a small status prompt offers \u003cstrong\u003eUse Auto\u003c/strong\u003e or \u003cstrong\u003eKeep [mode]\u003c/strong\u003e.\nKeeping or dismissing the choice quiets the prompt for the current session.\u003c/p\u003e\n\u003ch2 id=\"media-and-javascript\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMedia and JavaScript\u003c/span\u003e \u003ca href=\"#media-and-javascript\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eImages use browser-native loading and retain their dimensions while loading.\nDerived video posters reserve a 16:9 frame when the author has not supplied\nheight or inline styling. Supply your own height/style for a different frame.\nVideo previews show a poster and do not fetch the video until playback is\nrequested. Article video keeps native controls and remains usable if JavaScript\ndoes not run. The adaptive script does not replace an image that is already\nvisible or restart a video when the connection changes.\u003c/p\u003e\n\u003cp\u003eMarkdown videos default to no autoplay and \u003ccode\u003epreload = \u0026quot;none\u0026quot;\u003c/code\u003e. Raw HTML keeps\nexplicit autoplay intent in \u003ccode\u003edata-authored-autoplay=\u0026quot;true\u0026quot;\u003c/code\u003e, while removing the\nnative autoplay attribute and using preload none. Raw HTML without autoplay\nnever gains it from the site-wide Markdown setting.\nTo opt into GIF-like playback for site videos, set:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emd_video\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eautoplay\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eloop\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emuted\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epreload\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;metadata\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe generated intent marker allows Full Quality or already-confident fast Auto at page entry to\nstart authored autoplay. Save Data and constrained/unknown Auto leave the poster\nuntil interaction. Videos authored without autoplay stay manual in every mode.\nReduced motion also prevents automatic playback. Changing policy does not pause,\nrestart, or replace a video that has begun loading or playing. With JavaScript\ndisabled, even authored autoplay requires pressing the native controls; this\nkeeps the initial document conservative before a visitor\u0026rsquo;s preference is known.\u003c/p\u003e\n\u003cp\u003eThe controller is a small theme asset. Video and embed helpers remain\nconditional, so a text-only page does not load a player just in case.\u003c/p\u003e\n\u003cp\u003eAuto honors authored autoplay when measured confidence is already fast at page\nentry. Learning that the network is fast during a page view affects subsequent\npages; it does not suddenly animate an existing poster. An explicit Full Quality\nchoice may start unrequested authored video on the current page. Active media\nremains untouched in either case.\u003c/p\u003e\n\u003cp\u003eKeep native controls enabled (or supply an accessible play action) for deferred\nvideos. A video deliberately authored without controls needs its own interaction\npath in Save Data and no-JS mode; autoplay intent alone is not a play control.\u003c/p\u003e\n\u003cp\u003eThe existing full-document View Transition navigator preserves loading-mode\nattributes and the persistent control. Each completed route initializes only\nits newly inserted authored media, expires stale session evidence, and opens a\nfresh bounded timing window. It does not rerun the controller or reset the\nvisitor\u0026rsquo;s manual choice.\u003c/p\u003e\n",
      "content_text": "\n\nMarkata-Go sites keep article text available immediately and let the browser\nload images and video with native HTML behavior. Visitors can choose how much\noptional media work the site should do.\n\n## Choose a loading mode\n\nOpen **Loading** in the site header and choose one of these modes:\n\n- **Auto** uses recent browser connection hints and a few real resource timings.\n- **Save Data** limits optional media work and speculative requests.\n- **Full Quality** allows optional work to begin sooner.\n\nAuto is the default. A saved Save Data or Full Quality choice always takes\nprecedence over Auto. The preference is stored in the current browser only.\n\n## What Auto does\n\nAuto uses `navigator.connection` when the browser exposes it, but the site\nworks without that API. It also learns from a small number of recent navigation\nand resource timings. One slow image or request does not change the mode. Auto\nrequires two meaningful transfers below 2 Mbps to constrain optional work and\nfour consecutive transfers above 4 Mbps with low response latency to recover.\nGeneric 4g/downlink hints initialize Auto but cannot erase measured evidence.\nBrowser Save Data intent constrains Auto immediately. Each page observes at\nmost twelve transfers for thirty seconds; later pages can provide fresh evidence.\nOffline constrains Auto immediately, and reconnecting needs fresh evidence.\nSuggestions require four poor observations for Full Quality or five good ones\nfor Save Data.\n\nIf Auto becomes confident that your manual choice no longer fits the\nconnection, a small status prompt offers **Use Auto** or **Keep [mode]**.\nKeeping or dismissing the choice quiets the prompt for the current session.\n\n## Media and JavaScript\n\nImages use browser-native loading and retain their dimensions while loading.\nDerived video posters reserve a 16:9 frame when the author has not supplied\nheight or inline styling. Supply your own height/style for a different frame.\nVideo previews show a poster and do not fetch the video until playback is\nrequested. Article video keeps native controls and remains usable if JavaScript\ndoes not run. The adaptive script does not replace an image that is already\nvisible or restart a video when the connection changes.\n\nMarkdown videos default to no autoplay and `preload = \"none\"`. Raw HTML keeps\nexplicit autoplay intent in `data-authored-autoplay=\"true\"`, while removing the\nnative autoplay attribute and using preload none. Raw HTML without autoplay\nnever gains it from the site-wide Markdown setting.\nTo opt into GIF-like playback for site videos, set:\n\n```toml\n[markata-go.md_video]\nautoplay = true\nloop = true\nmuted = true\npreload = \"metadata\"\n```\n\nThe generated intent marker allows Full Quality or already-confident fast Auto at page entry to\nstart authored autoplay. Save Data and constrained/unknown Auto leave the poster\nuntil interaction. Videos authored without autoplay stay manual in every mode.\nReduced motion also prevents automatic playback. Changing policy does not pause,\nrestart, or replace a video that has begun loading or playing. With JavaScript\ndisabled, even authored autoplay requires pressing the native controls; this\nkeeps the initial document conservative before a visitor's preference is known.\n\nThe controller is a small theme asset. Video and embed helpers remain\nconditional, so a text-only page does not load a player just in case.\n\n\nAuto honors authored autoplay when measured confidence is already fast at page\nentry. Learning that the network is fast during a page view affects subsequent\npages; it does not suddenly animate an existing poster. An explicit Full Quality\nchoice may start unrequested authored video on the current page. Active media\nremains untouched in either case.\n\n\nKeep native controls enabled (or supply an accessible play action) for deferred\nvideos. A video deliberately authored without controls needs its own interaction\npath in Save Data and no-JS mode; autoplay intent alone is not a play control.\n\n\nThe existing full-document View Transition navigator preserves loading-mode\nattributes and the persistent control. Each completed route initializes only\nits newly inserted authored media, expires stale session evidence, and opens a\nfresh bounded timing window. It does not rerun the controller or reset the\nvisitor's manual choice.\n",
      "summary": "How Markata-Go keeps sites useful and calm on slow or unstable connections.",
      "date_published": "2026-10-07T00:00:00Z",
      "date_modified": "2026-10-07T00:00:00Z",
      "tags": [
        "performance",
        "themes"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/feed-views/",
      "url": "https://markata.dev/docs/guides/feed-views/",
      "title": "Feed Views",
      "content_html": "\u003cp\u003eBuilt-in feeds expose three presentation views by default: \u003ccode\u003edefault\u003c/code\u003e, \u003ccode\u003esimple\u003c/code\u003e, and \u003ccode\u003ecalendar\u003c/code\u003e. An opt-in fourth view, \u003ccode\u003eshorts\u003c/code\u003e, adds a full-screen photo/video player.\n\u003ccode\u003edefault\u003c/code\u003e is the feed\u0026rsquo;s normal card/grid page and is always required. \u003ccode\u003esimple\u003c/code\u003e is the compact\n\u003ccode\u003e/simple/\u003c/code\u003e page, and \u003ccode\u003ecalendar\u003c/code\u003e is the interactive \u003ccode\u003e?view=calendar\u003c/code\u003e peer view.\u003c/p\u003e\n\u003cp\u003eTo disable an alternate view for every feed, set site-wide feed defaults:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eviews\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;calendar\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eA feed can override that set:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;notes\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eviews\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;simple\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOmitting \u003ccode\u003eviews\u003c/code\u003e inherits the site defaults. Unknown view names are configuration errors, and an\nexplicit list must include \u003ccode\u003edefault\u003c/code\u003e. Disabling \u003ccode\u003esimple\u003c/code\u003e also stops Markata from generating that\nfeed\u0026rsquo;s \u003ccode\u003e/simple/\u003c/code\u003e HTML output even when \u003ccode\u003eformats.simple_html\u003c/code\u003e is enabled. Disabling \u003ccode\u003ecalendar\u003c/code\u003e\nremoves Calendar controls and avoids loading its CSS, JavaScript, and hidden calendar source data.\nOutput-format settings for RSS, Atom, JSON, Markdown, text, and sitemaps are independent of views.\u003c/p\u003e\n\u003cp\u003eAn empty list is invalid. Config overlays replace the view list rather than\nadding to it. Keep \u003ccode\u003edefault\u003c/code\u003e in every explicit list. Rebuilding after disabling\nSimple removes its stale generated \u003ccode\u003e/simple/\u003c/code\u003e pages.\u003c/p\u003e\n\u003cp\u003eSee \u003ca href=\"./configuration.md\"\u003efeed configuration\u003c/a\u003e and \u003ca href=\"./feeds.md\"\u003ethe feed guide\u003c/a\u003e\nfor pagination and output-format options.\u003c/p\u003e\n\u003ch2 id=\"shorts-view\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eShorts view\u003c/span\u003e \u003ca href=\"#shorts-view\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe Shorts presentation uses the existing feed\u0026rsquo;s selected posts and sort order, without copying the filter. To enable it for a Shots gallery:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;shots\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eviews\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;simple\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;calendar\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;shorts\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshorts_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/shorts/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;feed-photo-grid.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe grid remains at \u003ccode\u003e/shots/\u003c/code\u003e, and the full-screen player is available at\n\u003ccode\u003e/shorts/\u003c/code\u003e. A URL fragment such as \u003ccode\u003e#id=shots%2Fdog\u003c/code\u003e identifies an individual\npost. The reader traverses the complete feed using static JSON chunks,\nindependent of normal feed pagination. Only one video plays at a time;\nsurrounding posts are loaded as previews. The previous and next buttons stay\nfixed at the right center of the screen, separate from the video controls. Use\n\u003ccode\u003ej\u003c/code\u003e/\u003ccode\u003ek\u003c/code\u003e or the up/down arrows to move, Escape to return to the grid, Space to\nplay or pause a video, left/right arrows to seek five seconds, and \u003ccode\u003em\u003c/code\u003e to mute\nor unmute.\u003c/p\u003e\n\u003cp\u003eIf not configured, the Shorts route defaults to \u003ccode\u003e/\u0026lt;feed-slug\u0026gt;/shorts/\u003c/code\u003e. Only enable Shorts on a feed that should expose a full-screen player.\u003c/p\u003e\n\u003ch2 id=\"adaptive-html-layouts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdaptive HTML layouts\u003c/span\u003e \u003ca href=\"#adaptive-html-layouts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe main HTML feed can use \u003ccode\u003eclassic\u003c/code\u003e, \u003ccode\u003eeditorial\u003c/code\u003e, \u003ccode\u003egallery\u003c/code\u003e, \u003ccode\u003ereading\u003c/code\u003e,\n\u003ccode\u003etimeline\u003c/code\u003e, or \u003ccode\u003eresources\u003c/code\u003e. Select \u003ccode\u003eauto\u003c/code\u003e to choose from the feed\u0026rsquo;s post\ntypes. The default is \u003cstrong\u003eclassic\u003c/strong\u003e to preserve existing sites.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;archive\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epresentation\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;editorial\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ping\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epresentation\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;timeline\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;stars\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epresentation\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;resources\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSite-wide defaults may be set in \u003ccode\u003e[markata-go.feed_defaults]\u003c/code\u003e with\n\u003ccode\u003epresentation = \u0026quot;classic\u0026quot;\u003c/code\u003e (or a different layout). A feed\u0026rsquo;s own\n\u003ccode\u003epresentation\u003c/code\u003e overrides that default.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eauto\u003c/code\u003e chooses a specialized layout when at least 80% of eight or more\nposts are photos, notes, links, or articles. Feeds with at least twelve\nposts and three content types represented by two posts each use editorial\ngrouping. Smaller or unclassified feeds retain the classic view.\nCustom HTML templates, such as \u003ccode\u003efeed-photo-grid.html\u003c/code\u003e, take precedence\nover automatic layout detection.\u003c/p\u003e\n\u003cp\u003eEditorial grouping uses Monday-start publishing weeks. Weekly headings show relative\ncalendar time (This week, Last week, 2 weeks ago, 2 months ago, 2 years ago)\nwith the exact week range as a smaller caption. Relative labels are rendered\nat build time and refreshed in the browser so long-cached static pages remain\naccurate without a rebuild. Dates and weekly grouping remain unchanged.\nArticles are\nemphasized, substantial links and video follow, and all photos from a\npublishing week appear together in a single responsive gallery. One-photo\nweeks also use the gallery layout rather than stretching a photo into a\nfull-width card. Each photograph retains its own publication date, caption,\nand permalink, even when photos come from different days. Brief notes are\nvisually quieter. \u003ccode\u003efeatured: true\u003c/code\u003e on a post explicitly elevates it\nwithin its week. Each post retains its original HTML card and metadata.\u003c/p\u003e\n\u003cp\u003ePresentation never modifies RSS, Atom, JSON, Simple, Calendar, source\nordering, or the existing pagination boundaries. Weeks that span two\nHTML pagination pages continue on the next page. JS-pagination feeds\nkeep classic markup because the JS paginator requires direct child cards.\u003c/p\u003e\n",
      "content_text": "\n\nBuilt-in feeds expose three presentation views by default: `default`, `simple`, and `calendar`. An opt-in fourth view, `shorts`, adds a full-screen photo/video player.\n`default` is the feed's normal card/grid page and is always required. `simple` is the compact\n`/simple/` page, and `calendar` is the interactive `?view=calendar` peer view.\n\nTo disable an alternate view for every feed, set site-wide feed defaults:\n\n```toml\n[markata-go.feed_defaults]\nviews = [\"default\", \"calendar\"]\n```\n\nA feed can override that set:\n\n```toml\n[[markata-go.feeds]]\nslug = \"notes\"\nviews = [\"default\", \"simple\"]\n```\n\nOmitting `views` inherits the site defaults. Unknown view names are configuration errors, and an\nexplicit list must include `default`. Disabling `simple` also stops Markata from generating that\nfeed's `/simple/` HTML output even when `formats.simple_html` is enabled. Disabling `calendar`\nremoves Calendar controls and avoids loading its CSS, JavaScript, and hidden calendar source data.\nOutput-format settings for RSS, Atom, JSON, Markdown, text, and sitemaps are independent of views.\n\nAn empty list is invalid. Config overlays replace the view list rather than\nadding to it. Keep `default` in every explicit list. Rebuilding after disabling\nSimple removes its stale generated `/simple/` pages.\n\nSee [feed configuration](./configuration.md) and [the feed guide](./feeds.md)\nfor pagination and output-format options.\n\n## Shorts view\n\nThe Shorts presentation uses the existing feed's selected posts and sort order, without copying the filter. To enable it for a Shots gallery:\n\n```toml\n[[markata-go.feeds]]\nslug = \"shots\"\nviews = [\"default\", \"simple\", \"calendar\", \"shorts\"]\nshorts_path = \"/shorts/\"\n\n[markata-go.feeds.templates]\nhtml = \"feed-photo-grid.html\"\n```\n\nThe grid remains at `/shots/`, and the full-screen player is available at\n`/shorts/`. A URL fragment such as `#id=shots%2Fdog` identifies an individual\npost. The reader traverses the complete feed using static JSON chunks,\nindependent of normal feed pagination. Only one video plays at a time;\nsurrounding posts are loaded as previews. The previous and next buttons stay\nfixed at the right center of the screen, separate from the video controls. Use\n`j`/`k` or the up/down arrows to move, Escape to return to the grid, Space to\nplay or pause a video, left/right arrows to seek five seconds, and `m` to mute\nor unmute.\n\nIf not configured, the Shorts route defaults to `/\u003cfeed-slug\u003e/shorts/`. Only enable Shorts on a feed that should expose a full-screen player.\n\n## Adaptive HTML layouts\n\nThe main HTML feed can use `classic`, `editorial`, `gallery`, `reading`,\n`timeline`, or `resources`. Select `auto` to choose from the feed's post\ntypes. The default is **classic** to preserve existing sites.\n\n```toml\n[[markata-go.feeds]]\nslug = \"archive\"\npresentation = \"editorial\"\n\n[[markata-go.feeds]]\nslug = \"ping\"\npresentation = \"timeline\"\n\n[[markata-go.feeds]]\nslug = \"stars\"\npresentation = \"resources\"\n```\n\nSite-wide defaults may be set in `[markata-go.feed_defaults]` with\n`presentation = \"classic\"` (or a different layout). A feed's own\n`presentation` overrides that default.\n\n`auto` chooses a specialized layout when at least 80% of eight or more\nposts are photos, notes, links, or articles. Feeds with at least twelve\nposts and three content types represented by two posts each use editorial\ngrouping. Smaller or unclassified feeds retain the classic view.\nCustom HTML templates, such as `feed-photo-grid.html`, take precedence\nover automatic layout detection.\n\nEditorial grouping uses Monday-start publishing weeks. Weekly headings show relative\ncalendar time (This week, Last week, 2 weeks ago, 2 months ago, 2 years ago)\nwith the exact week range as a smaller caption. Relative labels are rendered\nat build time and refreshed in the browser so long-cached static pages remain\naccurate without a rebuild. Dates and weekly grouping remain unchanged.\nArticles are\nemphasized, substantial links and video follow, and all photos from a\npublishing week appear together in a single responsive gallery. One-photo\nweeks also use the gallery layout rather than stretching a photo into a\nfull-width card. Each photograph retains its own publication date, caption,\nand permalink, even when photos come from different days. Brief notes are\nvisually quieter. `featured: true` on a post explicitly elevates it\nwithin its week. Each post retains its original HTML card and metadata.\n\nPresentation never modifies RSS, Atom, JSON, Simple, Calendar, source\nordering, or the existing pagination boundaries. Weeks that span two\nHTML pagination pages continue on the next page. JS-pagination feeds\nkeep classic markup because the JS paginator requires direct child cards.\n",
      "summary": "Choose default, simple, and calendar presentations globally or per feed",
      "date_published": "2026-10-02T00:00:00Z",
      "date_modified": "2026-10-02T00:00:00Z",
      "tags": [
        "documentation",
        "feeds"
      ]
    },
    {
      "id": "https://markata.dev/docs/architecture/span-presentation/",
      "url": "https://markata.dev/docs/architecture/span-presentation/",
      "title": "Build Span Presentation Model",
      "content_html": "\u003cp\u003eBuilder Admin has an internal span presentation model for future trace views.\nIt converts completed build spans into rows ordered by start time, with nesting\ndepth, integer millisecond timings, attribution, and copied attributes.\u003c/p\u003e\n\u003cp\u003eThe highlighted completion chain follows the latest-finishing leaf and its\nancestors. This is a timing heuristic; it does not calculate a dependency-aware\ncritical path. Missing parents and cyclic parent links terminate traversal.\nNegative timings display as zero, and sub-millisecond timings round down.\u003c/p\u003e\n\u003cp\u003eThe model does not yet expose a waterfall or trace API. Benchmark retention and\noperator UI integration remain follow-up work. For recorded span data today,\nsee \u003ca href=\"/guides/performance/\"\u003ethe performance guide\u003c/a\u003e.\u003c/p\u003e\n",
      "content_text": "\nBuilder Admin has an internal span presentation model for future trace views.\nIt converts completed build spans into rows ordered by start time, with nesting\ndepth, integer millisecond timings, attribution, and copied attributes.\n\nThe highlighted completion chain follows the latest-finishing leaf and its\nancestors. This is a timing heuristic; it does not calculate a dependency-aware\ncritical path. Missing parents and cyclic parent links terminate traversal.\nNegative timings display as zero, and sub-millisecond timings round down.\n\nThe model does not yet expose a waterfall or trace API. Benchmark retention and\noperator UI integration remain follow-up work. For recorded span data today,\nsee [the performance guide](/guides/performance/).\n",
      "summary": "Developer contract for the Builder Admin span view foundation",
      "date_published": "2026-10-02T00:00:00Z",
      "date_modified": "2026-10-02T00:00:00Z",
      "tags": [
        "documentation",
        "architecture",
        "builder-admin"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/maintainer-ci/",
      "url": "https://markata.dev/docs/guides/maintainer-ci/",
      "title": "Maintainer CI",
      "content_html": "\u003cp\u003eThis guide describes CI for the \u003cstrong\u003emarkata-go product repository\u003c/strong\u003e (issue #1487).\nFor site-author deployments, use the [[ci-cd-guide|CI/CD guide]] instead.\nThe policy is specified in \u003ca href=\"../../spec/spec/CI.md\"\u003eCI.md\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"routine-validation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRoutine validation\u003c/span\u003e \u003ca href=\"#routine-validation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCI runs on pushes and pull requests targeting \u003ccode\u003emain\u003c/code\u003e/\u003ccode\u003emaster\u003c/code\u003e, daily at 08:23 UTC,\nand through \u003cstrong\u003eActions → CI → Run workflow\u003c/strong\u003e. Lint, all three Linux race/coverage\nshards, their aggregate \u003ccode\u003eTest (ubuntu-latest, 1.27)\u003c/code\u003e check, and macOS/Windows tests\nremain active. The CLI/search shard smoke-tests its existing binary with\n\u003ccode\u003eversion\u003c/code\u003e and \u003ccode\u003e--help\u003c/code\u003e; there is no separate duplicate build.\u003c/p\u003e\n\u003cp\u003eSpecialized checks use job-level changed-file filters on PRs and pushes:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eChecks\u003c/th\u003e\n\u003cth\u003eInputs\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eFont completeness and determinism\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003escripts/generate_font_manifests.py\u003c/code\u003e, \u003ccode\u003einternal/fontcatalog/**\u003c/code\u003e (catalog, lock, manifests, licenses, font assets), \u003ccode\u003evendor/google-fonts/**\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRendering contract\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003escripts/rendering-contract/**\u003c/code\u003e, \u003ccode\u003espec/rendering-contract/**\u003c/code\u003e, \u003ccode\u003epkg/renderingcontract/**\u003c/code\u003e, \u003ccode\u003epkg/palettes/**\u003c/code\u003e, \u003ccode\u003epalettes/**\u003c/code\u003e, \u003ccode\u003ego.mod\u003c/code\u003e, \u003ccode\u003ego.sum\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHelm\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehelm-chart/**\u003c/code\u003e, including chart dependencies and chained test scripts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGoReleaser config\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.goreleaser.yml\u003c/code\u003e, \u003ccode\u003ego.mod\u003c/code\u003e, \u003ccode\u003ego.sum\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eChanges under \u003ccode\u003e.github/workflows/**\u003c/code\u003e select every specialized check. Scheduled\nand manual CI runs execute all specialized checks regardless of paths.\nDocs-only PRs still receive ordinary checks rather than skipping the entire\nworkflow and potentially leaving required checks pending.\u003c/p\u003e\n\u003cp\u003eThe detection job uses \u003ccode\u003edorny/paths-filter@v3\u003c/code\u003e: PRs use the changed-files API,\nincluding fork PRs, while pushes compare against the previous push commit.\nOnly this job gets \u003ccode\u003epull-requests: read\u003c/code\u003e, alongside \u003ccode\u003econtents: read\u003c/code\u003e.\nIf detection fails, do not interpret skipped specialized jobs as validation.\nWhen adding a generator dependency, update its filter in \u003ccode\u003eci.yml\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"spec-conformance-manifest\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSpec conformance manifest\u003c/span\u003e \u003ca href=\"#spec-conformance-manifest\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen adding a normative requirement, assign it a stable \u003ccode\u003eDOMAIN-NNN\u003c/code\u003e ID in\n\u003ccode\u003espec/conformance/requirements.yaml\u003c/code\u003e. Record its specification file, scope,\nconformance status, and the implementation and test files that support it. Mark\nincomplete or intentionally different behavior as \u003ccode\u003epartial\u003c/code\u003e and explain it in\n\u003ccode\u003enotes\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eRun \u003ccode\u003ego test ./pkg/specconformance\u003c/code\u003e to check IDs, allowed values, referenced\nfiles, and the evidence required for \u003ccode\u003eimplemented\u003c/code\u003e status. The normal CI test\nsuite runs the same check. See \u003ca href=\"../../spec/conformance/README.md\"\u003ethe conformance manifest guide\u003c/a\u003e\nfor the field definitions and rollout plan.\u003c/p\u003e\n\u003ch2 id=\"build-lab-observation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Lab observation\u003c/span\u003e \u003ca href=\"#build-lab-observation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe expensive \u003ccode\u003eTestBuildLab_LinkedAndFixtureMutationsCharacterizeProduct\u003c/code\u003e logs\nproduct failures as observations. PR CLI validation skips that test while\nretaining focused regression tests. Main push and daily/manual CI include it.\u003c/p\u003e\n\u003cp\u003eFor a focused rerun, select \u003cstrong\u003eActions → Build Lab characterization → Run\nworkflow\u003c/strong\u003e and the desired ref. This separate workflow is manual-only because\ndaily CI already runs the observation; a second daily run would duplicate work.\nIt retains harness race detection, but no longer writes unused coverage data.\nIts success does not mean that every logged product observation passed.\u003c/p\u003e\n\u003ch2 id=\"docker-preview-publishing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocker preview publishing\u003c/span\u003e \u003ca href=\"#docker-preview-publishing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMinimal and builder images publish automatically only on \u003ccode\u003emain\u003c/code\u003e pushes and\n\u003ccode\u003ev*\u003c/code\u003e tags. Relevant PR changes still build and validate both images without\npublishing. Tagged builds retain amd64/arm64 images and Trivy scanning.\u003c/p\u003e\n\u003cp\u003eTo publish a feature preview explicitly, select \u003cstrong\u003eActions → Docker → Run\nworkflow\u003c/strong\u003e and choose the feature branch in \u003cstrong\u003eUse workflow from\u003c/strong\u003e. Both images\npublish to GHCR with branch and \u003ccode\u003esha-\u003c/code\u003e tags; feature previews do not receive\n\u003ccode\u003elatest\u003c/code\u003e. Use the SHA tag when a stable preview reference is needed. Manual\ndispatch on \u003ccode\u003emain\u003c/code\u003e follows the existing default-branch tagging policy, and\ndispatch on a version tag follows the existing semver/multiarch policy.\u003c/p\u003e\n\u003ch2 id=\"performance-comparisons\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePerformance comparisons\u003c/span\u003e \u003ca href=\"#performance-comparisons\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe initial benchmark sample selects only \u003ccode\u003eBenchmarkBuild_EndToEnd\u003c/code\u003e and\n\u003ccode\u003eBenchmarkBuild_Incremental\u003c/code\u003e. Concurrency keeps its separate three-sample run.\nProfiling and stage-specific sampling remain unchanged.\u003c/p\u003e\n\u003cp\u003eFor a comparison, manually run \u003cstrong\u003ePerformance Benchmarks\u003c/strong\u003e with \u003ccode\u003ecompare_branch\u003c/code\u003e.\nThe current checkout remains available for Go version/module setup; its\nbenchmark measurements come from the downloaded current-results artifact.\nOnly the comparison checkout generates a fixture and executes comparison\nbenchmarks. Fixture or benchmark failures fail the job instead of being hidden\nas a successful comparison.\u003c/p\u003e\n\u003ch2 id=\"scope\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eScope\u003c/span\u003e \u003ca href=\"#scope\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRelease tests, signing, SBOM generation, action versions, and repository settings\nare unchanged. Required-check or remote workflow registry changes are separate\nmaintainer operations, not part of these repository workflows.\u003c/p\u003e\n\u003cp\u003eThe bundled \u003ccode\u003emarkata-go-site\u003c/code\u003e skill was reviewed (entrypoint, build/deployment,\nand faster-build guidance). No update is needed: these changes govern product\nmaintainer CI, not site-author commands, build behavior, deployment workflows,\nor benchmarking guidance.\u003c/p\u003e\n\u003ch2 id=\"golangci-lint-v2-on-go-1-27\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGolangci-lint v2 on Go 1.27\u003c/span\u003e \u003ca href=\"#golangci-lint-v2-on-go-1-27\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGo 1.27 uses \u003ccode\u003egolangci-lint\u003c/code\u003e \u003cstrong\u003ev2.15.0\u003c/strong\u003e, rather than the older v1.64.8\ntool which cannot decode the Go 1.27 compiler export format. The migrated\n\u003ccode\u003e.golangci.yml\u003c/code\u003e retains all existing configured linters.\u003c/p\u003e\n\u003cp\u003eThe new v2 analyzers also surfaced hundreds of historical findings in\nuntouched files. To keep meaningful merge protection while progressively\nresolving that debt (tracked in\n\u003ca href=\"https://github.com/WaylonWalker/markata/issues/1902\"\u003eissue #1902\u003c/a\u003e),\nPR and push CI now rejects \u003cstrong\u003enew findings relative to the PR base or previous\nmain commit\u003c/strong\u003e. Scheduled CI runs the same new-issue gate plus a\n\u003cstrong\u003efull-tree lint audit\u003c/strong\u003e that reports failures without blocking the daily\nbuild. The full audit is deliberately visible, not suppressed.\u003c/p\u003e\n\u003cp\u003eFor local work, run \u003ccode\u003ejust lint\u003c/code\u003e after fetching \u003ccode\u003eorigin/main\u003c/code\u003e to enforce\nnew findings, or \u003ccode\u003ejust lint-full\u003c/code\u003e to inspect all existing diagnostics.\n\u003ccode\u003ejust lint-fast\u003c/code\u003e uses the supported v2 \u003ccode\u003e--fast-only\u003c/code\u003e mode. Once issue\n#1902 is resolved, restoring blocking full-tree lint is the exit criterion.\u003c/p\u003e\n",
      "content_text": "\n\nThis guide describes CI for the **markata-go product repository** (issue #1487).\nFor site-author deployments, use the [[ci-cd-guide|CI/CD guide]] instead.\nThe policy is specified in [CI.md](../../spec/spec/CI.md).\n\n## Routine validation\n\nCI runs on pushes and pull requests targeting `main`/`master`, daily at 08:23 UTC,\nand through **Actions → CI → Run workflow**. Lint, all three Linux race/coverage\nshards, their aggregate `Test (ubuntu-latest, 1.27)` check, and macOS/Windows tests\nremain active. The CLI/search shard smoke-tests its existing binary with\n`version` and `--help`; there is no separate duplicate build.\n\nSpecialized checks use job-level changed-file filters on PRs and pushes:\n\n| Checks | Inputs |\n|--------|--------|\n| Font completeness and determinism | `scripts/generate_font_manifests.py`, `internal/fontcatalog/**` (catalog, lock, manifests, licenses, font assets), `vendor/google-fonts/**` |\n| Rendering contract | `scripts/rendering-contract/**`, `spec/rendering-contract/**`, `pkg/renderingcontract/**`, `pkg/palettes/**`, `palettes/**`, `go.mod`, `go.sum` |\n| Helm | `helm-chart/**`, including chart dependencies and chained test scripts |\n| GoReleaser config | `.goreleaser.yml`, `go.mod`, `go.sum` |\n\nChanges under `.github/workflows/**` select every specialized check. Scheduled\nand manual CI runs execute all specialized checks regardless of paths.\nDocs-only PRs still receive ordinary checks rather than skipping the entire\nworkflow and potentially leaving required checks pending.\n\nThe detection job uses `dorny/paths-filter@v3`: PRs use the changed-files API,\nincluding fork PRs, while pushes compare against the previous push commit.\nOnly this job gets `pull-requests: read`, alongside `contents: read`.\nIf detection fails, do not interpret skipped specialized jobs as validation.\nWhen adding a generator dependency, update its filter in `ci.yml`.\n\n## Spec conformance manifest\n\nWhen adding a normative requirement, assign it a stable `DOMAIN-NNN` ID in\n`spec/conformance/requirements.yaml`. Record its specification file, scope,\nconformance status, and the implementation and test files that support it. Mark\nincomplete or intentionally different behavior as `partial` and explain it in\n`notes`.\n\nRun `go test ./pkg/specconformance` to check IDs, allowed values, referenced\nfiles, and the evidence required for `implemented` status. The normal CI test\nsuite runs the same check. See [the conformance manifest guide](../../spec/conformance/README.md)\nfor the field definitions and rollout plan.\n\n## Build Lab observation\n\nThe expensive `TestBuildLab_LinkedAndFixtureMutationsCharacterizeProduct` logs\nproduct failures as observations. PR CLI validation skips that test while\nretaining focused regression tests. Main push and daily/manual CI include it.\n\nFor a focused rerun, select **Actions → Build Lab characterization → Run\nworkflow** and the desired ref. This separate workflow is manual-only because\ndaily CI already runs the observation; a second daily run would duplicate work.\nIt retains harness race detection, but no longer writes unused coverage data.\nIts success does not mean that every logged product observation passed.\n\n## Docker preview publishing\n\nMinimal and builder images publish automatically only on `main` pushes and\n`v*` tags. Relevant PR changes still build and validate both images without\npublishing. Tagged builds retain amd64/arm64 images and Trivy scanning.\n\nTo publish a feature preview explicitly, select **Actions → Docker → Run\nworkflow** and choose the feature branch in **Use workflow from**. Both images\npublish to GHCR with branch and `sha-` tags; feature previews do not receive\n`latest`. Use the SHA tag when a stable preview reference is needed. Manual\ndispatch on `main` follows the existing default-branch tagging policy, and\ndispatch on a version tag follows the existing semver/multiarch policy.\n\n## Performance comparisons\n\nThe initial benchmark sample selects only `BenchmarkBuild_EndToEnd` and\n`BenchmarkBuild_Incremental`. Concurrency keeps its separate three-sample run.\nProfiling and stage-specific sampling remain unchanged.\n\nFor a comparison, manually run **Performance Benchmarks** with `compare_branch`.\nThe current checkout remains available for Go version/module setup; its\nbenchmark measurements come from the downloaded current-results artifact.\nOnly the comparison checkout generates a fixture and executes comparison\nbenchmarks. Fixture or benchmark failures fail the job instead of being hidden\nas a successful comparison.\n\n## Scope\n\nRelease tests, signing, SBOM generation, action versions, and repository settings\nare unchanged. Required-check or remote workflow registry changes are separate\nmaintainer operations, not part of these repository workflows.\n\nThe bundled `markata-go-site` skill was reviewed (entrypoint, build/deployment,\nand faster-build guidance). No update is needed: these changes govern product\nmaintainer CI, not site-author commands, build behavior, deployment workflows,\nor benchmarking guidance.\n\n## Golangci-lint v2 on Go 1.27\n\nGo 1.27 uses `golangci-lint` **v2.15.0**, rather than the older v1.64.8\ntool which cannot decode the Go 1.27 compiler export format. The migrated\n`.golangci.yml` retains all existing configured linters.\n\nThe new v2 analyzers also surfaced hundreds of historical findings in\nuntouched files. To keep meaningful merge protection while progressively\nresolving that debt (tracked in\n[issue #1902](https://github.com/WaylonWalker/markata/issues/1902)),\nPR and push CI now rejects **new findings relative to the PR base or previous\nmain commit**. Scheduled CI runs the same new-issue gate plus a\n**full-tree lint audit** that reports failures without blocking the daily\nbuild. The full audit is deliberately visible, not suppressed.\n\nFor local work, run `just lint` after fetching `origin/main` to enforce\nnew findings, or `just lint-full` to inspect all existing diagnostics.\n`just lint-fast` uses the supported v2 `--fast-only` mode. Once issue\n#1902 is resolved, restoring blocking full-tree lint is the exit criterion.\n",
      "summary": "Run focused product-repository checks, Docker previews, and performance comparisons.",
      "date_published": "2026-10-01T00:00:00Z",
      "date_modified": "2026-10-01T00:00:00Z",
      "tags": [
        "documentation",
        "ci",
        "maintenance"
      ]
    },
    {
      "id": "https://markata.dev/docs/architecture/builddag-plugin-ownership/",
      "url": "https://markata.dev/docs/architecture/builddag-plugin-ownership/",
      "title": "Build DAG plugin ownership inventory",
      "content_html": "\u003cp\u003eThis document is the conservative ownership audit for the feature-flagged DAG executor. It follows the resource vocabulary in \u003ccode\u003epkg/builddag\u003c/code\u003e: \u003ccode\u003esite\u003c/code\u003e, \u003ccode\u003efiles\u003c/code\u003e, \u003ccode\u003epost\u003c/code\u003e, \u003ccode\u003efeed\u003c/code\u003e, \u003ccode\u003ecache\u003c/code\u003e, \u003ccode\u003eoutput\u003c/code\u003e, \u003ccode\u003etemplate\u003c/code\u003e, \u003ccode\u003eexternal\u003c/code\u003e, and \u003ccode\u003eplugin\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThe inventory is intentionally stricter than an implementation-level code review. A plugin is \u003cstrong\u003enot\u003c/strong\u003e parallel-safe merely because its loop body looks independent. Unknown ownership, manager mutation, package/global caches, filesystem walks, external processes, and network access all keep work serialized until an explicit task boundary owns those resources.\u003c/p\u003e\n\u003ch2 id=\"classification\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eClassification\u003c/span\u003e \u003ca href=\"#classification\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eexclusive\u003c/strong\u003e — site/global state or unclear ownership; keep serialized.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eaggregate\u003c/strong\u003e — reads or mutates a collection and therefore forms a barrier.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eper-post candidate\u003c/strong\u003e — plausible one-task-per-post boundary after an API refactor.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eper-feed candidate\u003c/strong\u003e — plausible one-task-per-feed boundary after an API refactor.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eper-output candidate\u003c/strong\u003e — plausible one-task-per-owned-output-path boundary after an API refactor.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eexternal/network\u003c/strong\u003e — external state, subprocesses, or network access requires a separate isolation/rate-limit policy even if item-local work exists.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAll current \u003ccode\u003eLegacyTasks\u003c/code\u003e remain \u003ccode\u003eScopeSite\u003c/code\u003e, \u003ccode\u003eExclusive=true\u003c/code\u003e, and \u003ccode\u003eParallelSafe=false\u003c/code\u003e. The classifications below describe possible future decomposition only.\u003c/p\u003e\n\u003ch2 id=\"configure-discovery-load\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfigure / discovery / load\u003c/span\u003e \u003ca href=\"#configure-discovery-load\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePlugin\u003c/th\u003e\n\u003cth\u003eClassification\u003c/th\u003e\n\u003cth\u003eConservative resources / side effects\u003c/th\u003e\n\u003cth\u003eRefactor required before fan-out\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebuild_cache\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eexclusive\u003c/td\u003e\n\u003ctd\u003ewrite \u003ccode\u003ecache:*\u003c/code\u003e, plugin state, lifecycle persistence\u003c/td\u003e\n\u003ctd\u003eKeep barrier; expose namespace-safe cache operations before any overlap.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etheme_calendar\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eexclusive\u003c/td\u003e\n\u003ctd\u003eread/write \u003ccode\u003esite:config\u003c/code\u003e, plugin state\u003c/td\u003e\n\u003ctd\u003eConfiguration mutation must finish before downstream tasks.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eglob\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eexclusive\u003c/td\u003e\n\u003ctd\u003ewrite \u003ccode\u003efiles:*\u003c/code\u003e, read \u003ccode\u003esite:config\u003c/code\u003e, filesystem walk\u003c/td\u003e\n\u003ctd\u003eDiscovery is a barrier that establishes the file set.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebackground\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eexclusive\u003c/td\u003e\n\u003ctd\u003eread/write \u003ccode\u003esite:config\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConfiguration mutation must remain ordered.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecdn_assets\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eexternal/network + per-output candidate\u003c/td\u003e\n\u003ctd\u003enetwork, cache, write \u003ccode\u003eoutput:static/*\u003c/code\u003e, config/plugin state\u003c/td\u003e\n\u003ctd\u003eSeparate fetch/cache planning from deterministic per-asset writes; add rate limits.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eicon_vendor\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eexternal/network + per-output candidate\u003c/td\u003e\n\u003ctd\u003enetwork/cache, vendor asset outputs, plugin index\u003c/td\u003e\n\u003ctd\u003eSplit vendor fetch/index from per-pack output ownership.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etailwind\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eexternal/network/exclusive\u003c/td\u003e\n\u003ctd\u003esubprocess/toolchain, templates/includes, CSS output, config\u003c/td\u003e\n\u003ctd\u003eIsolate subprocess inputs/outputs and eliminate shared include mutation.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eload\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate/barrier\u003c/td\u003e\n\u003ctd\u003eread \u003ccode\u003efiles:*\u003c/code\u003e, write \u003ccode\u003epost:*\u003c/code\u003e, post index, cache\u003c/td\u003e\n\u003ctd\u003eLoad establishes the post collection; per-file parse tasks require deterministic merge/index phase.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epython_docs\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eexternal + aggregate\u003c/td\u003e\n\u003ctd\u003esource filesystem/import inspection, creates posts\u003c/td\u003e\n\u003ctd\u003eSplit source discovery/parse from deterministic post insertion.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etag_aggregator\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate\u003c/td\u003e\n\u003ctd\u003ereads/writes all posts/tags and tag-derived state\u003c/td\u003e\n\u003ctd\u003eRequires item-local normalization plus deterministic aggregate merge.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"transform\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTransform\u003c/span\u003e \u003ca href=\"#transform\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePlugin\u003c/th\u003e\n\u003cth\u003eClassification\u003c/th\u003e\n\u003cth\u003eConservative resources / side effects\u003c/th\u003e\n\u003cth\u003eRefactor required before fan-out\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eauto_title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003ewrite one \u003ccode\u003epost:\u0026lt;id\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eExtract a post-local transform that does not iterate/mutate Manager collections.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einline_titles\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread/write one post title representation\u003c/td\u003e\n\u003ctd\u003eExpose post-local transform.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eauthors\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread author config, write one post\u003c/td\u003e\n\u003ctd\u003eFreeze author registry/config then expose post-local resolution.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edescription\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread/write one post\u003c/td\u003e\n\u003ctd\u003eExpose post-local transform.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estructured_data\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread/write one post metadata\u003c/td\u003e\n\u003ctd\u003eExpose post-local transform with immutable site metadata input.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ereading_time\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread content, write one post\u003c/td\u003e\n\u003ctd\u003eExpose post-local calculation.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estats\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate\u003c/td\u003e\n\u003ctd\u003escans posts and writes shared statistics\u003c/td\u003e\n\u003ctd\u003eKeep barrier or split item facts from aggregate reduction.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebreadcrumbs\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread site/post routing state, write one post\u003c/td\u003e\n\u003ctd\u003eFreeze route/index view then expose post-local generation.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eembeds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate + external/network\u003c/td\u003e\n\u003ctd\u003epost mutation, cache/network for remote embeds\u003c/td\u003e\n\u003ctd\u003eSplit cached/local expansion from network resolution; explicit cache/external claims and rate limits.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewikilinks\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate/barrier\u003c/td\u003e\n\u003ctd\u003ereads post index, writes post content/dependency edges\u003c/td\u003e\n\u003ctd\u003eFreeze lookup index and collect dependency-edge deltas for deterministic merge.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ementions\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread blogroll/config, write one post\u003c/td\u003e\n\u003ctd\u003eFreeze mention lookup state then expose post-local transform.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehashtag_tags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread/write one post tags/content\u003c/td\u003e\n\u003ctd\u003eExpose post-local transform after tag normalization barrier.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewebmentions_fetch\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eexternal/network + per-post candidate\u003c/td\u003e\n\u003ctd\u003ecache/network, attaches webmentions to posts\u003c/td\u003e\n\u003ctd\u003eSeparate fetch/cache refresh from post-local attachment.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewebmentions_leaderboard\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate\u003c/td\u003e\n\u003ctd\u003escans webmention counts across posts\u003c/td\u003e\n\u003ctd\u003eKeep barrier/reduction.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etoc\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread/write one post\u003c/td\u003e\n\u003ctd\u003eExpose post-local transform.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ejinja_md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread \u003ccode\u003etemplate:*\u003c/code\u003e, write one post\u003c/td\u003e\n\u003ctd\u003eMake template environment read-only/thread-safe and expose post-local render.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eicons\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread icon index/plugin state, write one post\u003c/td\u003e\n\u003ctd\u003eFreeze icon index then expose post-local expansion.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"render\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRender\u003c/span\u003e \u003ca href=\"#render\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePlugin\u003c/th\u003e\n\u003cth\u003eClassification\u003c/th\u003e\n\u003cth\u003eConservative resources / side effects\u003c/th\u003e\n\u003cth\u003eRefactor required before fan-out\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erender_markdown\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003ewrite one post rendered HTML, read renderer/plugin config\u003c/td\u003e\n\u003ctd\u003eExpose a pure/post-local render operation with immutable renderer state.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eheading_anchors\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread/write one post HTML\u003c/td\u003e\n\u003ctd\u003eExpose post-local transform.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eimage_zoom\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread/write one post HTML\u003c/td\u003e\n\u003ctd\u003eExpose post-local transform.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewebawesome\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread/write one post HTML\u003c/td\u003e\n\u003ctd\u003eExpose post-local transform.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econtribution_graph\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread/write one post HTML\u003c/td\u003e\n\u003ctd\u003eExpose post-local transform; isolate any shared renderer cache.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd_video\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread/write one post HTML\u003c/td\u003e\n\u003ctd\u003eExpose post-local transform.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eyoutube\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread/write one post HTML\u003c/td\u003e\n\u003ctd\u003eExpose post-local transform; keep network discovery out of task if introduced later.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003echartjs\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread/write one post HTML\u003c/td\u003e\n\u003ctd\u003eExpose post-local transform.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecsv_fence\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread/write one post HTML\u003c/td\u003e\n\u003ctd\u003eExpose post-local transform.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emermaid\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate + external\u003c/td\u003e\n\u003ctd\u003epost HTML plus renderer/browser/cache depending on mode\u003c/td\u003e\n\u003ctd\u003eSeparate deterministic cache lookup from external rendering; explicit cache/external claims.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eglossary\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate + per-post candidate\u003c/td\u003e\n\u003ctd\u003eshared glossary/index plus post mutation; also writes glossary output\u003c/td\u003e\n\u003ctd\u003eFreeze glossary dictionary before post-local linking; keep output generation separate.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewikilink_hover\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate + per-post candidate\u003c/td\u003e\n\u003ctd\u003ereads post index/metadata, mutates one post\u003c/td\u003e\n\u003ctd\u003eFreeze hover lookup snapshot then fan out post-local application.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexternal_link_hover\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eexternal/network + per-post candidate\u003c/td\u003e\n\u003ctd\u003enetwork/cache and post HTML\u003c/td\u003e\n\u003ctd\u003eSeparate fetch/cache from deterministic application and rate-limit external tasks.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elink_collector\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003ereads one rendered post, writes one post link metadata\u003c/td\u003e\n\u003ctd\u003eExpose post-local collection; aggregate consumers wait on barrier.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eencryption\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003epost content plus key/config state\u003c/td\u003e\n\u003ctd\u003eFreeze immutable key/config inputs; ensure secrets never appear in graph diagnostics.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elink_avatars\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eexternal/network + per-post candidate\u003c/td\u003e\n\u003ctd\u003efavicon network/cache and post HTML\u003c/td\u003e\n\u003ctd\u003eSeparate fetch/cache refresh from deterministic post-local insertion.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etemplates\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate\u003c/td\u003e\n\u003ctd\u003eread \u003ccode\u003etemplate:*\u003c/code\u003e, post/site metadata, write rendered page state\u003c/td\u003e\n\u003ctd\u003eMake template environment immutable/thread-safe and expose one-post rendering API.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"collect\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCollect\u003c/span\u003e \u003ca href=\"#collect\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePlugin\u003c/th\u003e\n\u003cth\u003eClassification\u003c/th\u003e\n\u003cth\u003eConservative resources / side effects\u003c/th\u003e\n\u003cth\u003eRefactor required before fan-out\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eslug_conflicts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate/barrier\u003c/td\u003e\n\u003ctd\u003ereads all post output routes\u003c/td\u003e\n\u003ctd\u003eKeep validation barrier; could reduce per-post route facts first.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eseries\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate\u003c/td\u003e\n\u003ctd\u003ereads posts, creates/mutates feeds/series metadata\u003c/td\u003e\n\u003ctd\u003eKeep aggregate or split series-key grouping from deterministic feed creation.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esubscription_feeds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate\u003c/td\u003e\n\u003ctd\u003emutates shared feed collection\u003c/td\u003e\n\u003ctd\u003eKeep feed-collection barrier.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeeds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate\u003c/td\u003e\n\u003ctd\u003escans posts and constructs feeds\u003c/td\u003e\n\u003ctd\u003eKeep aggregate until filtering/sorting can produce immutable feed plans.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eauto_feeds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate\u003c/td\u003e\n\u003ctd\u003escans tags/posts and creates feeds\u003c/td\u003e\n\u003ctd\u003eKeep aggregate; deterministic feed-plan generation could precede per-feed work.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eblogroll\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eexternal/network + aggregate\u003c/td\u003e\n\u003ctd\u003enetwork/cache and shared blogroll/feed state\u003c/td\u003e\n\u003ctd\u003eSeparate external fetch plan/cache from deterministic aggregate merge.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eprevnext\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-feed candidate\u003c/td\u003e\n\u003ctd\u003ereads ordered feed posts, writes post navigation metadata\u003c/td\u003e\n\u003ctd\u003eBuild immutable feed ordering first; resolve conflicts for posts present in multiple feeds before fan-out.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eoverwrite_check\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate/barrier\u003c/td\u003e\n\u003ctd\u003ereads all planned output paths\u003c/td\u003e\n\u003ctd\u003eKeep validation barrier after output planning.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estatic_file_conflicts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate/barrier\u003c/td\u003e\n\u003ctd\u003efilesystem/static inventory + planned outputs\u003c/td\u003e\n\u003ctd\u003eKeep validation barrier.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"write\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWrite\u003c/span\u003e \u003ca href=\"#write\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePlugin\u003c/th\u003e\n\u003cth\u003eClassification\u003c/th\u003e\n\u003cth\u003eConservative resources / side effects\u003c/th\u003e\n\u003cth\u003eRefactor required before fan-out\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estatic_assets\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-output candidate\u003c/td\u003e\n\u003ctd\u003efilesystem walk, writes \u003ccode\u003eoutput:static/*\u003c/code\u003e, asset hashes\u003c/td\u003e\n\u003ctd\u003eProduce immutable copy plan then one task per destination namespace/path; serialize shared hash ledger merge.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efontpack\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-output candidate\u003c/td\u003e\n\u003ctd\u003ereads config/assets, writes font/CSS namespace\u003c/td\u003e\n\u003ctd\u003eBuild immutable manifest then own disjoint output paths.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epalette_css\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-output candidate\u003c/td\u003e\n\u003ctd\u003econfig -\u0026gt; known CSS output\u003c/td\u003e\n\u003ctd\u003eMake generation pure and claim exact output path.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eaesthetic_css\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-output candidate\u003c/td\u003e\n\u003ctd\u003econfig -\u0026gt; known CSS output\u003c/td\u003e\n\u003ctd\u003eMake generation pure and claim exact output path.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003echroma_css\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-output candidate\u003c/td\u003e\n\u003ctd\u003econfig -\u0026gt; known CSS output\u003c/td\u003e\n\u003ctd\u003eMake generation pure and claim exact output path.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecss_bundle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate/per-output\u003c/td\u003e\n\u003ctd\u003ereads multiple CSS outputs and writes bundle\u003c/td\u003e\n\u003ctd\u003eBarrier on CSS producers; then own bundle path.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epublish_feeds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-feed candidate\u003c/td\u003e\n\u003ctd\u003ereads one feed, writes feed-format paths\u003c/td\u003e\n\u003ctd\u003eGenerate immutable feed plan and one task per feed/format output.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewell_known\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-output candidate\u003c/td\u003e\n\u003ctd\u003esite metadata -\u0026gt; \u003ccode\u003e.well-known/*\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eClaim exact output namespace and remove shared writer state.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epublish_html\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-post candidate + per-output candidate\u003c/td\u003e\n\u003ctd\u003ereads one rendered post/template state, writes post output paths\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003eTop candidate:\u003c/strong\u003e expose one-post publish function and exact output claims; template state must be immutable.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eimages\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate\u003c/td\u003e\n\u003ctd\u003escans posts/assets and writes image inventory/pages\u003c/td\u003e\n\u003ctd\u003eKeep aggregate until image records are planned; individual thumbnails/assets may fan out later.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erandom_post\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate/per-output\u003c/td\u003e\n\u003ctd\u003escans eligible posts, writes random endpoint/data\u003c/td\u003e\n\u003ctd\u003eKeep eligibility reduction; output write itself can own fixed path.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eredirects\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-output candidate\u003c/td\u003e\n\u003ctd\u003ereads redirect declarations, writes redirect paths\u003c/td\u003e\n\u003ctd\u003eBuild/validate unique redirect plan, then one task per destination path.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eerror_pages\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-output candidate\u003c/td\u003e\n\u003ctd\u003etemplates/site config -\u0026gt; fixed error-page outputs\u003c/td\u003e\n\u003ctd\u003eFreeze template state and claim exact paths.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etags_listing\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate/per-output\u003c/td\u003e\n\u003ctd\u003escans tag/feed state, writes tags page\u003c/td\u003e\n\u003ctd\u003eAggregate barrier, then fixed output task.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeeds_listing\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate/per-output\u003c/td\u003e\n\u003ctd\u003escans feed state, writes feeds page\u003c/td\u003e\n\u003ctd\u003eAggregate barrier, then fixed output task.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egarden_view\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate\u003c/td\u003e\n\u003ctd\u003escans post graph, writes graph/page assets\u003c/td\u003e\n\u003ctd\u003eKeep aggregate; later split graph reduction from fixed output writes.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esitemap\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate/per-output\u003c/td\u003e\n\u003ctd\u003escans published routes, writes sitemap outputs\u003c/td\u003e\n\u003ctd\u003eKeep route reduction; fixed output task after plan.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econtent_index\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate/per-output\u003c/td\u003e\n\u003ctd\u003escans posts/feeds/source state, writes content index\u003c/td\u003e\n\u003ctd\u003eKeep aggregate due cross-content contract.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"cleanup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCleanup\u003c/span\u003e \u003ca href=\"#cleanup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePlugin\u003c/th\u003e\n\u003cth\u003eClassification\u003c/th\u003e\n\u003cth\u003eConservative resources / side effects\u003c/th\u003e\n\u003cth\u003eRefactor required before fan-out\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecss_minify\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-output candidate\u003c/td\u003e\n\u003ctd\u003efilesystem walk/read/write CSS outputs\u003c/td\u003e\n\u003ctd\u003eBuild immutable file list first, then one task per CSS path; no shared mutable minifier state.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ejs_minify\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eper-output candidate\u003c/td\u003e\n\u003ctd\u003efilesystem walk/read/write JS outputs\u003c/td\u003e\n\u003ctd\u003eBuild immutable file list first, then one task per JS path.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecss_purge\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eaggregate/external\u003c/td\u003e\n\u003ctd\u003escans generated HTML/CSS and rewrites CSS\u003c/td\u003e\n\u003ctd\u003eKeep barrier until usage analysis can be separated from per-file rewrite.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epagefind\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eexternal/exclusive\u003c/td\u003e\n\u003ctd\u003esubprocess scans final output and writes search index\u003c/td\u003e\n\u003ctd\u003eKeep serialized external barrier with explicit output namespace.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ediagnostics_artifact\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eexclusive\u003c/td\u003e\n\u003ctd\u003ereads final lifecycle diagnostics/executor state, writes \u003ccode\u003e.markata/diagnostics.json\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMust remain final publication barrier; never overlap unfinished build work.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"first-fan-out-candidates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFirst fan-out candidates\u003c/span\u003e \u003ca href=\"#first-fan-out-candidates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe first fan-out PRs should stay \u003cstrong\u003eserial\u003c/strong\u003e even after the graph contains item-level nodes. Resource claims should be added before any task is marked parallel-safe.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003epublish_html\u003c/code\u003e — one task per post/output path.\u003c/strong\u003e High payoff and naturally disjoint output ownership. Refactor the plugin to produce an immutable publish plan, then expose a one-post writer. Claims: read \u003ccode\u003epost:\u0026lt;id\u0026gt;\u003c/code\u003e and \u003ccode\u003etemplate:*\u003c/code\u003e; write \u003ccode\u003eoutput:\u0026lt;post-path\u0026gt;\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003epublish_feeds\u003c/code\u003e — one task per feed/format.\u003c/strong\u003e Feed objects already form natural units and outputs are usually disjoint. Claims: read \u003ccode\u003efeed:\u0026lt;slug\u0026gt;\u003c/code\u003e; write exact \u003ccode\u003eoutput:\u0026lt;feed-path\u0026gt;\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003erender_markdown\u003c/code\u003e — one task per post.\u003c/strong\u003e CPU-heavy and item-local in intent. First make renderer/config state immutable and extract a post-local API. Claims: write \u003ccode\u003epost:\u0026lt;id\u0026gt;\u003c/code\u003e plus read-only plugin/config resources.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003ereading_time\u003c/code\u003e — one task per post.\u003c/strong\u003e Small, low-risk proving ground for the per-post task API and graph fan-out mechanics. Claims: write \u003ccode\u003epost:\u0026lt;id\u0026gt;\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003ecss_minify\u003c/code\u003e / \u003ccode\u003ejs_minify\u003c/code\u003e — one task per planned output file.\u003c/strong\u003e Straightforward filesystem ownership once directory walking is separated into a deterministic planning barrier. Claims: write exact \u003ccode\u003eoutput:\u0026lt;path\u0026gt;\u003c/code\u003e.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003ccode\u003eauto_title\u003c/code\u003e, \u003ccode\u003edescription\u003c/code\u003e, \u003ccode\u003etoc\u003c/code\u003e, \u003ccode\u003eheading_anchors\u003c/code\u003e, \u003ccode\u003eimage_zoom\u003c/code\u003e, and several HTML transforms are also strong per-post candidates, but they should follow the first shared per-post adapter rather than each inventing a scheduler integration.\u003c/p\u003e\n\u003ch2 id=\"required-safety-rules-before-concurrency\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRequired safety rules before concurrency\u003c/span\u003e \u003ca href=\"#required-safety-rules-before-concurrency\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eA fan-out task must name every mutable/shared resource it reads or writes.\u003c/li\u003e\n\u003cli\u003eUnknown ownership remains exclusive.\u003c/li\u003e\n\u003cli\u003eA write claim owns reads performed as part of mutating the same resource; a task must not declare duplicate read+write claims for one resource.\u003c/li\u003e\n\u003cli\u003eCollection planning/validation remains a barrier before item-level tasks consume the plan.\u003c/li\u003e\n\u003cli\u003eExternal/network work needs explicit cache ownership, cancellation, and a bounded rate/concurrency policy separate from CPU/file task concurrency.\u003c/li\u003e\n\u003cli\u003eOutput tasks claim normalized destination paths/namespaces; overlap checks happen before scheduling.\u003c/li\u003e\n\u003cli\u003ePackage/global template/browser/plugin caches must be proven read-only or made task-safe before post-level concurrency.\u003c/li\u003e\n\u003cli\u003eBuild Lab differential/incremental/determinism checks and race tests remain mandatory gates for each fan-out slice.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"next-implementation-sequence\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext implementation sequence\u003c/span\u003e \u003ca href=\"#next-implementation-sequence\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eLand deterministic resource claims (#1452).\u003c/li\u003e\n\u003cli\u003eAdd compiled graph/resource diagnostics (#1454) so ownership is inspectable.\u003c/li\u003e\n\u003cli\u003eIntroduce a serial item-task adapter and use \u003ccode\u003ereading_time\u003c/code\u003e as the smallest per-post proof.\u003c/li\u003e\n\u003cli\u003eMove \u003ccode\u003erender_markdown\u003c/code\u003e to serial per-post tasks and verify Build Lab equivalence.\u003c/li\u003e\n\u003cli\u003eAdd immutable publish planning, then split \u003ccode\u003epublish_html\u003c/code\u003e and \u003ccode\u003epublish_feeds\u003c/code\u003e into serial per-output tasks.\u003c/li\u003e\n\u003cli\u003eOnly after the graph and diagnostics prove disjoint ownership should any task become \u003ccode\u003eParallelSafe=true\u003c/code\u003e or the executor accept \u003ccode\u003eMaxParallel \u0026gt; 1\u003c/code\u003e.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"compiled-graph-core-contract\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCompiled graph core contract\u003c/span\u003e \u003ca href=\"#compiled-graph-core-contract\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ca href=\"../../spec/spec/BUILD_DAG.md\"\u003ecore specification\u003c/a\u003e defines the snapshot and\ndiagnostic guarantees supporting this inventory (#1451, #1454):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eCompile\u003c/code\u003e snapshots artifact/resource slices and external inputs.\nAfter compilation, callers may reuse or mutate declaration arrays without\nchanging the compiled graph. \u003ccode\u003eGraph.Task\u003c/code\u003e returns independent metadata slices,\nretaining the distinction between nil and empty slices. Task functions still\nown the mutable state captured by their closures; snapshotting declarations\ndoes not make plugin state immutable or parallel-safe.\u003c/li\u003e\n\u003cli\u003eArtifact identity and canonical ordering use \u003ccode\u003e(Kind, Key)\u003c/code\u003e, not \u003ccode\u003eString()\u003c/code\u003e.\nFor example, \u003ccode\u003epost\u003c/code\u003e / \u003ccode\u003erendered:example\u003c/code\u003e and \u003ccode\u003epost:rendered\u003c/code\u003e / \u003ccode\u003eexample\u003c/code\u003e are\ndistinct artifacts even though their display strings match. Resource reports\nsort by \u003ccode\u003e(Resource.Kind, Resource.Key, Access)\u003c/code\u003e. Keep keys opaque; do not parse\ndisplay strings to recover ownership.\u003c/li\u003e\n\u003cli\u003eThe compiler chooses the lexicographically smallest currently ready task,\nusing reverse adjacency and a min-heap rather than rescanning every task.\nFan-out/fan-in does not change this serial order or stable cycle diagnostics.\u003c/li\u003e\n\u003cli\u003eEmpty ownership remains valid for conservative compatibility tasks. Reports\nexplicitly show empty claims as \u003ccode\u003e[]\u003c/code\u003e; serialization omits empty optional\nfields. Scope is descriptive and does not infer dependencies or claims.\u003c/li\u003e\n\u003cli\u003eStructural digests identify declarations only. They do not prove that content\nor external state is unchanged and must not be used to skip execution.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThese guarantees harden graph inspection and compilation, not concurrency:\n\u003ccode\u003eMaxParallel\u003c/code\u003e remains one, existing scheduling defaults remain unchanged, and\ntask failures and cancellation continue to surface as errors.\u003c/p\u003e\n",
      "content_text": "\n\nThis document is the conservative ownership audit for the feature-flagged DAG executor. It follows the resource vocabulary in `pkg/builddag`: `site`, `files`, `post`, `feed`, `cache`, `output`, `template`, `external`, and `plugin`.\n\nThe inventory is intentionally stricter than an implementation-level code review. A plugin is **not** parallel-safe merely because its loop body looks independent. Unknown ownership, manager mutation, package/global caches, filesystem walks, external processes, and network access all keep work serialized until an explicit task boundary owns those resources.\n\n## Classification\n\n- **exclusive** — site/global state or unclear ownership; keep serialized.\n- **aggregate** — reads or mutates a collection and therefore forms a barrier.\n- **per-post candidate** — plausible one-task-per-post boundary after an API refactor.\n- **per-feed candidate** — plausible one-task-per-feed boundary after an API refactor.\n- **per-output candidate** — plausible one-task-per-owned-output-path boundary after an API refactor.\n- **external/network** — external state, subprocesses, or network access requires a separate isolation/rate-limit policy even if item-local work exists.\n\nAll current `LegacyTasks` remain `ScopeSite`, `Exclusive=true`, and `ParallelSafe=false`. The classifications below describe possible future decomposition only.\n\n## Configure / discovery / load\n\n| Plugin | Classification | Conservative resources / side effects | Refactor required before fan-out |\n| --- | --- | --- | --- |\n| `build_cache` | exclusive | write `cache:*`, plugin state, lifecycle persistence | Keep barrier; expose namespace-safe cache operations before any overlap. |\n| `theme_calendar` | exclusive | read/write `site:config`, plugin state | Configuration mutation must finish before downstream tasks. |\n| `glob` | exclusive | write `files:*`, read `site:config`, filesystem walk | Discovery is a barrier that establishes the file set. |\n| `background` | exclusive | read/write `site:config` | Configuration mutation must remain ordered. |\n| `cdn_assets` | external/network + per-output candidate | network, cache, write `output:static/*`, config/plugin state | Separate fetch/cache planning from deterministic per-asset writes; add rate limits. |\n| `icon_vendor` | external/network + per-output candidate | network/cache, vendor asset outputs, plugin index | Split vendor fetch/index from per-pack output ownership. |\n| `tailwind` | external/network/exclusive | subprocess/toolchain, templates/includes, CSS output, config | Isolate subprocess inputs/outputs and eliminate shared include mutation. |\n| `load` | aggregate/barrier | read `files:*`, write `post:*`, post index, cache | Load establishes the post collection; per-file parse tasks require deterministic merge/index phase. |\n| `python_docs` | external + aggregate | source filesystem/import inspection, creates posts | Split source discovery/parse from deterministic post insertion. |\n| `tag_aggregator` | aggregate | reads/writes all posts/tags and tag-derived state | Requires item-local normalization plus deterministic aggregate merge. |\n\n## Transform\n\n| Plugin | Classification | Conservative resources / side effects | Refactor required before fan-out |\n| --- | --- | --- | --- |\n| `auto_title` | per-post candidate | write one `post:\u003cid\u003e` | Extract a post-local transform that does not iterate/mutate Manager collections. |\n| `inline_titles` | per-post candidate | read/write one post title representation | Expose post-local transform. |\n| `authors` | per-post candidate | read author config, write one post | Freeze author registry/config then expose post-local resolution. |\n| `description` | per-post candidate | read/write one post | Expose post-local transform. |\n| `structured_data` | per-post candidate | read/write one post metadata | Expose post-local transform with immutable site metadata input. |\n| `reading_time` | per-post candidate | read content, write one post | Expose post-local calculation. |\n| `stats` | aggregate | scans posts and writes shared statistics | Keep barrier or split item facts from aggregate reduction. |\n| `breadcrumbs` | per-post candidate | read site/post routing state, write one post | Freeze route/index view then expose post-local generation. |\n| `embeds` | per-post candidate + external/network | post mutation, cache/network for remote embeds | Split cached/local expansion from network resolution; explicit cache/external claims and rate limits. |\n| `wikilinks` | aggregate/barrier | reads post index, writes post content/dependency edges | Freeze lookup index and collect dependency-edge deltas for deterministic merge. |\n| `mentions` | per-post candidate | read blogroll/config, write one post | Freeze mention lookup state then expose post-local transform. |\n| `hashtag_tags` | per-post candidate | read/write one post tags/content | Expose post-local transform after tag normalization barrier. |\n| `webmentions_fetch` | external/network + per-post candidate | cache/network, attaches webmentions to posts | Separate fetch/cache refresh from post-local attachment. |\n| `webmentions_leaderboard` | aggregate | scans webmention counts across posts | Keep barrier/reduction. |\n| `toc` | per-post candidate | read/write one post | Expose post-local transform. |\n| `jinja_md` | per-post candidate | read `template:*`, write one post | Make template environment read-only/thread-safe and expose post-local render. |\n| `icons` | per-post candidate | read icon index/plugin state, write one post | Freeze icon index then expose post-local expansion. |\n\n## Render\n\n| Plugin | Classification | Conservative resources / side effects | Refactor required before fan-out |\n| --- | --- | --- | --- |\n| `render_markdown` | per-post candidate | write one post rendered HTML, read renderer/plugin config | Expose a pure/post-local render operation with immutable renderer state. |\n| `heading_anchors` | per-post candidate | read/write one post HTML | Expose post-local transform. |\n| `image_zoom` | per-post candidate | read/write one post HTML | Expose post-local transform. |\n| `webawesome` | per-post candidate | read/write one post HTML | Expose post-local transform. |\n| `contribution_graph` | per-post candidate | read/write one post HTML | Expose post-local transform; isolate any shared renderer cache. |\n| `md_video` | per-post candidate | read/write one post HTML | Expose post-local transform. |\n| `youtube` | per-post candidate | read/write one post HTML | Expose post-local transform; keep network discovery out of task if introduced later. |\n| `chartjs` | per-post candidate | read/write one post HTML | Expose post-local transform. |\n| `csv_fence` | per-post candidate | read/write one post HTML | Expose post-local transform. |\n| `mermaid` | per-post candidate + external | post HTML plus renderer/browser/cache depending on mode | Separate deterministic cache lookup from external rendering; explicit cache/external claims. |\n| `glossary` | aggregate + per-post candidate | shared glossary/index plus post mutation; also writes glossary output | Freeze glossary dictionary before post-local linking; keep output generation separate. |\n| `wikilink_hover` | aggregate + per-post candidate | reads post index/metadata, mutates one post | Freeze hover lookup snapshot then fan out post-local application. |\n| `external_link_hover` | external/network + per-post candidate | network/cache and post HTML | Separate fetch/cache from deterministic application and rate-limit external tasks. |\n| `link_collector` | per-post candidate | reads one rendered post, writes one post link metadata | Expose post-local collection; aggregate consumers wait on barrier. |\n| `encryption` | per-post candidate | post content plus key/config state | Freeze immutable key/config inputs; ensure secrets never appear in graph diagnostics. |\n| `link_avatars` | external/network + per-post candidate | favicon network/cache and post HTML | Separate fetch/cache refresh from deterministic post-local insertion. |\n| `templates` | per-post candidate | read `template:*`, post/site metadata, write rendered page state | Make template environment immutable/thread-safe and expose one-post rendering API. |\n\n## Collect\n\n| Plugin | Classification | Conservative resources / side effects | Refactor required before fan-out |\n| --- | --- | --- | --- |\n| `slug_conflicts` | aggregate/barrier | reads all post output routes | Keep validation barrier; could reduce per-post route facts first. |\n| `series` | aggregate | reads posts, creates/mutates feeds/series metadata | Keep aggregate or split series-key grouping from deterministic feed creation. |\n| `subscription_feeds` | aggregate | mutates shared feed collection | Keep feed-collection barrier. |\n| `feeds` | aggregate | scans posts and constructs feeds | Keep aggregate until filtering/sorting can produce immutable feed plans. |\n| `auto_feeds` | aggregate | scans tags/posts and creates feeds | Keep aggregate; deterministic feed-plan generation could precede per-feed work. |\n| `blogroll` | external/network + aggregate | network/cache and shared blogroll/feed state | Separate external fetch plan/cache from deterministic aggregate merge. |\n| `prevnext` | per-feed candidate | reads ordered feed posts, writes post navigation metadata | Build immutable feed ordering first; resolve conflicts for posts present in multiple feeds before fan-out. |\n| `overwrite_check` | aggregate/barrier | reads all planned output paths | Keep validation barrier after output planning. |\n| `static_file_conflicts` | aggregate/barrier | filesystem/static inventory + planned outputs | Keep validation barrier. |\n\n## Write\n\n| Plugin | Classification | Conservative resources / side effects | Refactor required before fan-out |\n| --- | --- | --- | --- |\n| `static_assets` | per-output candidate | filesystem walk, writes `output:static/*`, asset hashes | Produce immutable copy plan then one task per destination namespace/path; serialize shared hash ledger merge. |\n| `fontpack` | per-output candidate | reads config/assets, writes font/CSS namespace | Build immutable manifest then own disjoint output paths. |\n| `palette_css` | per-output candidate | config -\u003e known CSS output | Make generation pure and claim exact output path. |\n| `aesthetic_css` | per-output candidate | config -\u003e known CSS output | Make generation pure and claim exact output path. |\n| `chroma_css` | per-output candidate | config -\u003e known CSS output | Make generation pure and claim exact output path. |\n| `css_bundle` | aggregate/per-output | reads multiple CSS outputs and writes bundle | Barrier on CSS producers; then own bundle path. |\n| `publish_feeds` | per-feed candidate | reads one feed, writes feed-format paths | Generate immutable feed plan and one task per feed/format output. |\n| `well_known` | per-output candidate | site metadata -\u003e `.well-known/*` | Claim exact output namespace and remove shared writer state. |\n| `publish_html` | per-post candidate + per-output candidate | reads one rendered post/template state, writes post output paths | **Top candidate:** expose one-post publish function and exact output claims; template state must be immutable. |\n| `images` | aggregate | scans posts/assets and writes image inventory/pages | Keep aggregate until image records are planned; individual thumbnails/assets may fan out later. |\n| `random_post` | aggregate/per-output | scans eligible posts, writes random endpoint/data | Keep eligibility reduction; output write itself can own fixed path. |\n| `redirects` | per-output candidate | reads redirect declarations, writes redirect paths | Build/validate unique redirect plan, then one task per destination path. |\n| `error_pages` | per-output candidate | templates/site config -\u003e fixed error-page outputs | Freeze template state and claim exact paths. |\n| `tags_listing` | aggregate/per-output | scans tag/feed state, writes tags page | Aggregate barrier, then fixed output task. |\n| `feeds_listing` | aggregate/per-output | scans feed state, writes feeds page | Aggregate barrier, then fixed output task. |\n| `garden_view` | aggregate | scans post graph, writes graph/page assets | Keep aggregate; later split graph reduction from fixed output writes. |\n| `sitemap` | aggregate/per-output | scans published routes, writes sitemap outputs | Keep route reduction; fixed output task after plan. |\n| `content_index` | aggregate/per-output | scans posts/feeds/source state, writes content index | Keep aggregate due cross-content contract. |\n\n## Cleanup\n\n| Plugin | Classification | Conservative resources / side effects | Refactor required before fan-out |\n| --- | --- | --- | --- |\n| `css_minify` | per-output candidate | filesystem walk/read/write CSS outputs | Build immutable file list first, then one task per CSS path; no shared mutable minifier state. |\n| `js_minify` | per-output candidate | filesystem walk/read/write JS outputs | Build immutable file list first, then one task per JS path. |\n| `css_purge` | aggregate/external | scans generated HTML/CSS and rewrites CSS | Keep barrier until usage analysis can be separated from per-file rewrite. |\n| `pagefind` | external/exclusive | subprocess scans final output and writes search index | Keep serialized external barrier with explicit output namespace. |\n| `diagnostics_artifact` | exclusive | reads final lifecycle diagnostics/executor state, writes `.markata/diagnostics.json` | Must remain final publication barrier; never overlap unfinished build work. |\n\n## First fan-out candidates\n\nThe first fan-out PRs should stay **serial** even after the graph contains item-level nodes. Resource claims should be added before any task is marked parallel-safe.\n\n1. **`publish_html` — one task per post/output path.** High payoff and naturally disjoint output ownership. Refactor the plugin to produce an immutable publish plan, then expose a one-post writer. Claims: read `post:\u003cid\u003e` and `template:*`; write `output:\u003cpost-path\u003e`.\n2. **`publish_feeds` — one task per feed/format.** Feed objects already form natural units and outputs are usually disjoint. Claims: read `feed:\u003cslug\u003e`; write exact `output:\u003cfeed-path\u003e`.\n3. **`render_markdown` — one task per post.** CPU-heavy and item-local in intent. First make renderer/config state immutable and extract a post-local API. Claims: write `post:\u003cid\u003e` plus read-only plugin/config resources.\n4. **`reading_time` — one task per post.** Small, low-risk proving ground for the per-post task API and graph fan-out mechanics. Claims: write `post:\u003cid\u003e`.\n5. **`css_minify` / `js_minify` — one task per planned output file.** Straightforward filesystem ownership once directory walking is separated into a deterministic planning barrier. Claims: write exact `output:\u003cpath\u003e`.\n\n`auto_title`, `description`, `toc`, `heading_anchors`, `image_zoom`, and several HTML transforms are also strong per-post candidates, but they should follow the first shared per-post adapter rather than each inventing a scheduler integration.\n\n## Required safety rules before concurrency\n\n1. A fan-out task must name every mutable/shared resource it reads or writes.\n2. Unknown ownership remains exclusive.\n3. A write claim owns reads performed as part of mutating the same resource; a task must not declare duplicate read+write claims for one resource.\n4. Collection planning/validation remains a barrier before item-level tasks consume the plan.\n5. External/network work needs explicit cache ownership, cancellation, and a bounded rate/concurrency policy separate from CPU/file task concurrency.\n6. Output tasks claim normalized destination paths/namespaces; overlap checks happen before scheduling.\n7. Package/global template/browser/plugin caches must be proven read-only or made task-safe before post-level concurrency.\n8. Build Lab differential/incremental/determinism checks and race tests remain mandatory gates for each fan-out slice.\n\n## Next implementation sequence\n\n1. Land deterministic resource claims (#1452).\n2. Add compiled graph/resource diagnostics (#1454) so ownership is inspectable.\n3. Introduce a serial item-task adapter and use `reading_time` as the smallest per-post proof.\n4. Move `render_markdown` to serial per-post tasks and verify Build Lab equivalence.\n5. Add immutable publish planning, then split `publish_html` and `publish_feeds` into serial per-output tasks.\n6. Only after the graph and diagnostics prove disjoint ownership should any task become `ParallelSafe=true` or the executor accept `MaxParallel \u003e 1`.\n\n## Compiled graph core contract\n\nThe [core specification](../../spec/spec/BUILD_DAG.md) defines the snapshot and\ndiagnostic guarantees supporting this inventory (#1451, #1454):\n\n- `Compile` snapshots artifact/resource slices and external inputs.\n  After compilation, callers may reuse or mutate declaration arrays without\n  changing the compiled graph. `Graph.Task` returns independent metadata slices,\n  retaining the distinction between nil and empty slices. Task functions still\n  own the mutable state captured by their closures; snapshotting declarations\n  does not make plugin state immutable or parallel-safe.\n- Artifact identity and canonical ordering use `(Kind, Key)`, not `String()`.\n  For example, `post` / `rendered:example` and `post:rendered` / `example` are\n  distinct artifacts even though their display strings match. Resource reports\n  sort by `(Resource.Kind, Resource.Key, Access)`. Keep keys opaque; do not parse\n  display strings to recover ownership.\n- The compiler chooses the lexicographically smallest currently ready task,\n  using reverse adjacency and a min-heap rather than rescanning every task.\n  Fan-out/fan-in does not change this serial order or stable cycle diagnostics.\n- Empty ownership remains valid for conservative compatibility tasks. Reports\n  explicitly show empty claims as `[]`; serialization omits empty optional\n  fields. Scope is descriptive and does not infer dependencies or claims.\n- Structural digests identify declarations only. They do not prove that content\n  or external state is unchanged and must not be used to skip execution.\n\nThese guarantees harden graph inspection and compilation, not concurrency:\n`MaxParallel` remains one, existing scheduling defaults remain unchanged, and\ntask failures and cancellation continue to surface as errors.\n",
      "summary": "This document is the conservative ownership audit for the feature-flagged DAG executor. It follows the resource vocabulary in pkg/builddag: site, files,...",
      "date_published": "2026-09-30T00:00:00Z",
      "date_modified": "2026-09-30T00:00:00Z",
      "tags": [
        "documentation"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/dag-builds/",
      "url": "https://markata.dev/docs/guides/dag-builds/",
      "title": "Experimental DAG builds",
      "content_html": "\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --dag --benchmark-json\u003cspan class=\"o\"\u003e=\u003c/span\u003edag.json\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --dag\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003efalse\u003c/span\u003e --benchmark-json\u003cspan class=\"o\"\u003e=\u003c/span\u003elegacy.json\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003e--dag\u003c/code\u003e selects an experimental task-graph executor. The normal lifecycle\nexecutor remains the default. Both retain the same plugin order, lifecycle\nstages, output formats, and cache behavior. The DAG executor runs one graph\ntask at a time; existing plugins may still use their own internal worker pools.\nIt is not a switch for additional parallelism or a guarantee of faster builds.\u003c/p\u003e\n\u003cp\u003eThe DAG executor takes one snapshot of the plugins scheduled for each stage.\nIt builds each plugin\u0026rsquo;s graph when that plugin is reached, after earlier plugins\nhave finished. A plugin added during a stage can run in a later stage, but does\nnot join the stage already in progress. This preserves the normal lifecycle\u0026rsquo;s\nplugin ordering while allowing later graphs to use the current post and feed\nstate.\u003c/p\u003e\n\u003cp\u003eThe flag is also available on \u003ccode\u003eserve\u003c/code\u003e and \u003ccode\u003ebuilder-admin\u003c/code\u003e. Builder Admin passes\nthe choice to queued build processes. Use \u003ccode\u003eMARKATA_GO_DAG=true\u003c/code\u003e for an\nenvironment-wide opt-in, and \u003ccode\u003e--dag=false\u003c/code\u003e to override it for one command.\nAn invalid environment boolean produces a clear error unless an explicit flag\noverrides it.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ebuild --dry-run\u003c/code\u003e keeps its existing partial lifecycle through Collect. It does\nnot execute the DAG scheduler or publish the full-build diagnostics artifact.\nFull-build benchmark JSON and \u003ccode\u003e\u0026lt;output\u0026gt;/.markata/diagnostics.json\u003c/code\u003e identify the\nexecutor that actually ran.\u003c/p\u003e\n\u003ch2 id=\"compare-builds-fairly\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCompare builds fairly\u003c/span\u003e \u003ca href=\"#compare-builds-fairly\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRun a cold build, one warm-up build, and at least three warm samples per\nexecutor. Alternate the order of the warm samples. Use the same source,\nconfiguration, worker count, output-processing flags, and external cache\nsnapshot. Report cold and warm measurements separately.\u003c/p\u003e\n\u003cp\u003eKeep encryption settings identical for both executors. If local measurements\ndisable encryption because keys are unavailable, do so only in isolated local\ncopies, state that limitation, and do not deploy those outputs. Disable external\nindex ingestion or other publication side effects for local benchmarks.\u003c/p\u003e\n\u003cp\u003eLive network responses can change embeds, favicons, and feed content between\nbuilds. Reuse a populated external cache for scheduler comparisons rather than\ninterpreting remote variability as a DAG difference. Compare generated output\nbytes as well as timings; diagnostics timestamps, executor identity, and\n\u003ccode\u003e.well-known/time\u003c/code\u003e intentionally differ.\u003c/p\u003e\n\u003cp\u003eThe verbose \u003ccode\u003eplan=\u003c/code\u003e digest describes the graph\u0026rsquo;s declarations. It is not a\ncontent fingerprint, proof that inputs are unchanged, or permission to skip\ntasks. Graph compilation snapshots metadata and uses canonical ordering,\nbut task functions still own their runtime inputs and mutations.\u003c/p\u003e\n\u003cp\u003eFor development iteration, use [[cli-reference|CLI Reference]] and the existing\n\u003ccode\u003e--fast\u003c/code\u003e or \u003ccode\u003eserve --incremental\u003c/code\u003e options rather than assuming \u003ccode\u003e--dag\u003c/code\u003e skips\noutput work.\u003c/p\u003e\n",
      "content_text": "\n\n```bash\nmarkata-go build --dag --benchmark-json=dag.json\nmarkata-go build --dag=false --benchmark-json=legacy.json\n```\n\n`--dag` selects an experimental task-graph executor. The normal lifecycle\nexecutor remains the default. Both retain the same plugin order, lifecycle\nstages, output formats, and cache behavior. The DAG executor runs one graph\ntask at a time; existing plugins may still use their own internal worker pools.\nIt is not a switch for additional parallelism or a guarantee of faster builds.\n\nThe DAG executor takes one snapshot of the plugins scheduled for each stage.\nIt builds each plugin's graph when that plugin is reached, after earlier plugins\nhave finished. A plugin added during a stage can run in a later stage, but does\nnot join the stage already in progress. This preserves the normal lifecycle's\nplugin ordering while allowing later graphs to use the current post and feed\nstate.\n\nThe flag is also available on `serve` and `builder-admin`. Builder Admin passes\nthe choice to queued build processes. Use `MARKATA_GO_DAG=true` for an\nenvironment-wide opt-in, and `--dag=false` to override it for one command.\nAn invalid environment boolean produces a clear error unless an explicit flag\noverrides it.\n\n`build --dry-run` keeps its existing partial lifecycle through Collect. It does\nnot execute the DAG scheduler or publish the full-build diagnostics artifact.\nFull-build benchmark JSON and `\u003coutput\u003e/.markata/diagnostics.json` identify the\nexecutor that actually ran.\n\n## Compare builds fairly\n\nRun a cold build, one warm-up build, and at least three warm samples per\nexecutor. Alternate the order of the warm samples. Use the same source,\nconfiguration, worker count, output-processing flags, and external cache\nsnapshot. Report cold and warm measurements separately.\n\nKeep encryption settings identical for both executors. If local measurements\ndisable encryption because keys are unavailable, do so only in isolated local\ncopies, state that limitation, and do not deploy those outputs. Disable external\nindex ingestion or other publication side effects for local benchmarks.\n\nLive network responses can change embeds, favicons, and feed content between\nbuilds. Reuse a populated external cache for scheduler comparisons rather than\ninterpreting remote variability as a DAG difference. Compare generated output\nbytes as well as timings; diagnostics timestamps, executor identity, and\n`.well-known/time` intentionally differ.\n\nThe verbose `plan=` digest describes the graph's declarations. It is not a\ncontent fingerprint, proof that inputs are unchanged, or permission to skip\ntasks. Graph compilation snapshots metadata and uses canonical ordering,\nbut task functions still own their runtime inputs and mutations.\n\nFor development iteration, use [[cli-reference|CLI Reference]] and the existing\n`--fast` or `serve --incremental` options rather than assuming `--dag` skips\noutput work.\n",
      "summary": "Compare the serial DAG executor with normal builds without changing your site's configuration.",
      "date_published": "2026-09-29T00:00:00Z",
      "date_modified": "2026-09-29T00:00:00Z",
      "tags": [
        "documentation",
        "builds",
        "performance"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/calendar-feeds/",
      "url": "https://markata.dev/docs/guides/calendar-feeds/",
      "title": "Calendar Feed Views",
      "content_html": "\u003cp\u003eEvery normal Markata-Go HTML feed includes a \u003cstrong\u003eCalendar\u003c/strong\u003e view by default. You do not need a second feed, a template override, or special calendar configuration.\u003c/p\u003e\n\u003cp\u003eThe interaction is inspired by \u003ca href=\"https://blog.jim-nielsen.com/2026/blog-calendar-view/\"\u003eJim Nielsen\u0026rsquo;s calendar archive\u003c/a\u003e: the normal archive and its calendar are peer views of the same collection, and dates with posts are visibly marked. Select a marked date to reveal the title or titles published that day.\u003c/p\u003e\n\u003ch2 id=\"open-calendar\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOpen Calendar\u003c/span\u003e \u003ca href=\"#open-calendar\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOpen any feed normally and choose \u003cstrong\u003eCalendar\u003c/strong\u003e from its view control. For a feed at \u003ccode\u003e/blog/\u003c/code\u003e, the same state can be linked directly as:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/blog/?view=calendar\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor the root feed, use:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/?view=calendar\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe \u003cstrong\u003eSimple\u003c/strong\u003e view also links to Calendar. When feed sidebars are enabled on posts, the sidebar includes a \u003ccode\u003ecalendar\u003c/code\u003e link for the currently selected feed.\u003c/p\u003e\n\u003ch2 id=\"what-the-view-shows\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat the view shows\u003c/span\u003e \u003ca href=\"#what-the-view-shows\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCalendar uses the feed\u0026rsquo;s complete \u003ccode\u003efeed.posts\u003c/code\u003e collection, so it represents the full feed even when the normal HTML presentation is paginated.\u003c/p\u003e\n\u003cp\u003eFor each represented year it renders all twelve months. Every day appears in the correct weekday column. Dates containing posts get an activity marker and an expandable list of titles. If multiple posts share a date, they all appear beneath that day.\u003c/p\u003e\n\u003cp\u003ePosts without a valid date cannot be placed in a month grid. They remain available through the normal feed presentation.\u003c/p\u003e\n\u003ch2 id=\"three-human-facing-views\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThree human-facing views\u003c/span\u003e \u003ca href=\"#three-human-facing-views\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA default feed now has three presentations:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ePosts\u003c/strong\u003e — the feed\u0026rsquo;s normal card/list/template presentation\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSimple\u003c/strong\u003e — the existing compact HTML list at \u003ccode\u003e/simple/\u003c/code\u003e, when enabled\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCalendar\u003c/strong\u003e — the publishing-rhythm view, opened in place and deep-linkable with \u003ccode\u003e?view=calendar\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eRSS, Atom, JSON, Markdown, and text remain feed export/subscription formats rather than presentation modes.\u003c/p\u003e\n\u003cp\u003eBuilt-in alternate HTML layouts such as \u003ccode\u003efeed-photo-grid.html\u003c/code\u003e keep their existing primary presentation and gain Calendar as a peer view too.\u003c/p\u003e\n\u003ch2 id=\"accessibility-and-progressive-enhancement\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAccessibility and progressive enhancement\u003c/span\u003e \u003ca href=\"#accessibility-and-progressive-enhancement\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe normal feed remains the server-rendered default. Calendar controls stay hidden until JavaScript successfully initializes, so visitors without JavaScript keep the existing feed experience.\u003c/p\u003e\n\u003cp\u003eThe page embeds a hidden dated source built from the complete feed collection. Calendar day disclosures use native \u003ccode\u003e\u0026lt;details\u0026gt;\u003c/code\u003e and \u003ccode\u003e\u0026lt;summary\u0026gt;\u003c/code\u003e controls, so marked dates are keyboard-operable without a custom keybinding layer. Weekday labels and day summaries expose useful accessible names while decorative activity marks stay hidden from assistive technology.\u003c/p\u003e\n\u003ch2 id=\"pagination\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePagination\u003c/span\u003e \u003ca href=\"#pagination\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou do not need to disable pagination. The visible Posts view may render \u003ccode\u003epage.posts\u003c/code\u003e, while Calendar intentionally reads the complete \u003ccode\u003efeed.posts\u003c/code\u003e collection.\u003c/p\u003e\n\u003ch2 id=\"customizing-calendar\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustomizing Calendar\u003c/span\u003e \u003ca href=\"#customizing-calendar\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCalendar styling and behavior live in the default theme assets:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecss/calendar-feed.css\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ejs/calendar-feed.js\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe CSS uses theme variables and \u003ccode\u003ecurrentColor\u003c/code\u003e-derived borders/backgrounds so it follows custom palettes without calendar-specific color configuration.\u003c/p\u003e\n\u003cp\u003eThe previously shipped \u003ccode\u003ecalendar-feed.html\u003c/code\u003e remains available for sites that intentionally want a dedicated calendar-first custom template. It is no longer required to enable Calendar on ordinary feeds.\u003c/p\u003e\n",
      "content_text": "\n\nEvery normal Markata-Go HTML feed includes a **Calendar** view by default. You do not need a second feed, a template override, or special calendar configuration.\n\nThe interaction is inspired by [Jim Nielsen's calendar archive](https://blog.jim-nielsen.com/2026/blog-calendar-view/): the normal archive and its calendar are peer views of the same collection, and dates with posts are visibly marked. Select a marked date to reveal the title or titles published that day.\n\n## Open Calendar\n\nOpen any feed normally and choose **Calendar** from its view control. For a feed at `/blog/`, the same state can be linked directly as:\n\n```text\n/blog/?view=calendar\n```\n\nFor the root feed, use:\n\n```text\n/?view=calendar\n```\n\nThe **Simple** view also links to Calendar. When feed sidebars are enabled on posts, the sidebar includes a `calendar` link for the currently selected feed.\n\n## What the view shows\n\nCalendar uses the feed's complete `feed.posts` collection, so it represents the full feed even when the normal HTML presentation is paginated.\n\nFor each represented year it renders all twelve months. Every day appears in the correct weekday column. Dates containing posts get an activity marker and an expandable list of titles. If multiple posts share a date, they all appear beneath that day.\n\nPosts without a valid date cannot be placed in a month grid. They remain available through the normal feed presentation.\n\n## Three human-facing views\n\nA default feed now has three presentations:\n\n- **Posts** — the feed's normal card/list/template presentation\n- **Simple** — the existing compact HTML list at `/simple/`, when enabled\n- **Calendar** — the publishing-rhythm view, opened in place and deep-linkable with `?view=calendar`\n\nRSS, Atom, JSON, Markdown, and text remain feed export/subscription formats rather than presentation modes.\n\nBuilt-in alternate HTML layouts such as `feed-photo-grid.html` keep their existing primary presentation and gain Calendar as a peer view too.\n\n## Accessibility and progressive enhancement\n\nThe normal feed remains the server-rendered default. Calendar controls stay hidden until JavaScript successfully initializes, so visitors without JavaScript keep the existing feed experience.\n\nThe page embeds a hidden dated source built from the complete feed collection. Calendar day disclosures use native `\u003cdetails\u003e` and `\u003csummary\u003e` controls, so marked dates are keyboard-operable without a custom keybinding layer. Weekday labels and day summaries expose useful accessible names while decorative activity marks stay hidden from assistive technology.\n\n## Pagination\n\nYou do not need to disable pagination. The visible Posts view may render `page.posts`, while Calendar intentionally reads the complete `feed.posts` collection.\n\n## Customizing Calendar\n\nCalendar styling and behavior live in the default theme assets:\n\n- `css/calendar-feed.css`\n- `js/calendar-feed.js`\n\nThe CSS uses theme variables and `currentColor`-derived borders/backgrounds so it follows custom palettes without calendar-specific color configuration.\n\nThe previously shipped `calendar-feed.html` remains available for sites that intentionally want a dedicated calendar-first custom template. It is no longer required to enable Calendar on ordinary feeds.\n",
      "summary": "Use the built-in calendar view available on every Markata-Go HTML feed.",
      "date_published": "2026-09-28T00:00:00Z",
      "date_modified": "2026-09-28T00:00:00Z",
      "tags": [
        "documentation",
        "feeds",
        "templates"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/pins/",
      "url": "https://markata.dev/docs/guides/pins/",
      "title": "Pins",
      "content_html": "\u003cp\u003eMarkata includes a built-in \u003ccode\u003e/pins/\u003c/code\u003e page for saved links. Published posts appear\nthere when they have a non-empty \u003ccode\u003elink\u003c/code\u003e or \u003ccode\u003eurl\u003c/code\u003e field. Items appear newest first.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;A field guide to useful maps\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/field-guide\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;A thoughtful guide to reading a landscape.\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/images/maps.webp\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2026-09-27\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003eA note about why this is worth saving.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eLink posts can also use \u003ccode\u003eurl\u003c/code\u003e for their destination.\u003c/p\u003e\n\u003cp\u003eThe pinboard keeps the title linked to your local post and provides a separate source link to the external URL. Images, descriptions, dates, tags, and authored notes remain ordinary post data.\u003c/p\u003e\n\u003cp\u003eThe default board uses the available viewport width, with responsive masonry\ncolumns and 100 pins per page. The header has extra breathing room; card footers\nshare the card background. Hovering subtly emphasizes cover art without moving\ncards or opening floating notes.\u003c/p\u003e\n\u003ch2 id=\"cover-art-and-notes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCover art and notes\u003c/span\u003e \u003ca href=\"#cover-art-and-notes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePins uses \u003ccode\u003eimage\u003c/code\u003e, \u003ccode\u003ecover\u003c/code\u003e, \u003ccode\u003ecover_image\u003c/code\u003e, or \u003ccode\u003eog_image\u003c/code\u003e, in that order. When those\nfields are empty, it reuses image previews from already-rendered embeds, YouTube\nembed thumbnails, or images in the post body. The pins page itself does\nnot fetch metadata for arbitrary posts. Link-style posts automatically generate\na preview from their \u003ccode\u003elink\u003c/code\u003e or \u003ccode\u003eurl\u003c/code\u003e frontmatter destination. For other posts,\nuse the normal embed syntax to supply an external preview:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![[https://example.com/field-guide]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eI saved this for its clear examples and detailed maps.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYour commentary appears below the title as a short note. Click or tap \u003cstrong\u003eNote\u003c/strong\u003e,\nor activate it with the keyboard, to expand the text inside the card. Embedded\ndestination descriptions and standalone source URLs are excluded from the note.\nIf there are no authored paragraphs or list items, a non-URL \u003ccode\u003edescription\u003c/code\u003e is used\ninstead. Both cover art and notes work without JavaScript.\u003c/p\u003e\n\u003ch2 id=\"customize-pagination\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustomize pagination\u003c/span\u003e \u003ca href=\"#customize-pagination\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDefine a Pins feed to use a different page size or pagination mode:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pins\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Pins\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == true and (link or url)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epagination_type\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;manual\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pins.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSee \u003ca href=\"./feeds.md\"\u003efeeds\u003c/a\u003e for pagination and format options, and\n\u003ca href=\"./templates.md\"\u003etemplates\u003c/a\u003e for overriding the board design.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003elink\u003c/code\u003e field is intentionally render-neutral outside the pinboard. Adding \u003ccode\u003elink:\u003c/code\u003e does not inject an external preview into the individual post and does not cause an external metadata request by itself. Existing sites can therefore keep using \u003ccode\u003elink\u003c/code\u003e as ordinary frontmatter without changing post rendering.\u003c/p\u003e\n\u003ch2 id=\"route-ownership\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRoute ownership\u003c/span\u003e \u003ca href=\"#route-ownership\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe built-in Pins feed is a convenience route, not a reservation. If your site already has a publishable post with the slug \u003ccode\u003epins\u003c/code\u003e, that post keeps \u003ccode\u003e/pins/\u003c/code\u003e and Markata does not inject the implicit feed. A draft, skipped, or unpublished \u003ccode\u003epins\u003c/code\u003e post does not reserve the route.\u003c/p\u003e\n\u003cp\u003eAn explicitly configured feed with the slug \u003ccode\u003epins\u003c/code\u003e also takes precedence over the built-in definition.\u003c/p\u003e\n\u003ch2 id=\"default-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDefault behavior\u003c/span\u003e \u003ca href=\"#default-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe implicit Pins feed uses:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efilter: published == true and (link or url)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esort: date\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ereverse: true\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eitems_per_page: 100\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epagination_type: manual\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eformat: HTML\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epath: /pins/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etemplate: pins.html\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDisabling built-in subscription feeds disables the implicit Pins feed along with the implicit root and archive feeds. You can still define your own \u003ccode\u003epins\u003c/code\u003e feed when you want different selection, sorting, pagination, templates, or output formats.\u003c/p\u003e\n",
      "content_text": "\n\nMarkata includes a built-in `/pins/` page for saved links. Published posts appear\nthere when they have a non-empty `link` or `url` field. Items appear newest first.\n\n```yaml\n---\ntitle: \"A field guide to useful maps\"\nlink: \"https://example.com/field-guide\"\ndescription: \"A thoughtful guide to reading a landscape.\"\nimage: \"/images/maps.webp\"\ndate: 2026-09-27\npublished: true\n---\n\nA note about why this is worth saving.\n```\n\nLink posts can also use `url` for their destination.\n\nThe pinboard keeps the title linked to your local post and provides a separate source link to the external URL. Images, descriptions, dates, tags, and authored notes remain ordinary post data.\n\nThe default board uses the available viewport width, with responsive masonry\ncolumns and 100 pins per page. The header has extra breathing room; card footers\nshare the card background. Hovering subtly emphasizes cover art without moving\ncards or opening floating notes.\n\n## Cover art and notes\n\nPins uses `image`, `cover`, `cover_image`, or `og_image`, in that order. When those\nfields are empty, it reuses image previews from already-rendered embeds, YouTube\nembed thumbnails, or images in the post body. The pins page itself does\nnot fetch metadata for arbitrary posts. Link-style posts automatically generate\na preview from their `link` or `url` frontmatter destination. For other posts,\nuse the normal embed syntax to supply an external preview:\n\n```markdown\n![[https://example.com/field-guide]]\n\nI saved this for its clear examples and detailed maps.\n```\n\nYour commentary appears below the title as a short note. Click or tap **Note**,\nor activate it with the keyboard, to expand the text inside the card. Embedded\ndestination descriptions and standalone source URLs are excluded from the note.\nIf there are no authored paragraphs or list items, a non-URL `description` is used\ninstead. Both cover art and notes work without JavaScript.\n\n## Customize pagination\n\nDefine a Pins feed to use a different page size or pagination mode:\n\n```toml\n[[markata-go.feeds]]\nslug = \"pins\"\ntitle = \"Pins\"\nfilter = \"published == true and (link or url)\"\nsort = \"date\"\nreverse = true\nitems_per_page = 50\npagination_type = \"manual\"\n\n[markata-go.feeds.templates]\nhtml = \"pins.html\"\n\n[markata-go.feeds.formats]\nhtml = true\n```\n\nSee [feeds](./feeds.md) for pagination and format options, and\n[templates](./templates.md) for overriding the board design.\n\nThe `link` field is intentionally render-neutral outside the pinboard. Adding `link:` does not inject an external preview into the individual post and does not cause an external metadata request by itself. Existing sites can therefore keep using `link` as ordinary frontmatter without changing post rendering.\n\n## Route ownership\n\nThe built-in Pins feed is a convenience route, not a reservation. If your site already has a publishable post with the slug `pins`, that post keeps `/pins/` and Markata does not inject the implicit feed. A draft, skipped, or unpublished `pins` post does not reserve the route.\n\nAn explicitly configured feed with the slug `pins` also takes precedence over the built-in definition.\n\n## Default behavior\n\nThe implicit Pins feed uses:\n\n```text\nfilter: published == true and (link or url)\nsort: date\nreverse: true\nitems_per_page: 100\npagination_type: manual\nformat: HTML\npath: /pins/\ntemplate: pins.html\n```\n\nDisabling built-in subscription feeds disables the implicit Pins feed along with the implicit root and archive feeds. You can still define your own `pins` feed when you want different selection, sorting, pagination, templates, or output formats.\n",
      "summary": "Build a theme-aware link board from ordinary post metadata.",
      "date_published": "2026-09-27T00:00:00Z",
      "date_modified": "2026-09-27T00:00:00Z",
      "tags": [
        "documentation",
        "feeds",
        "pins"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/nginx-redirects/",
      "url": "https://markata.dev/docs/guides/nginx-redirects/",
      "title": "Nginx-native redirects",
      "content_html": "\u003cp\u003eThe built-in redirects plugin generates nginx-native redirect rules from the same \u003ccode\u003estatic/_redirects\u003c/code\u003e file used for static HTML fallbacks.\u003c/p\u003e\n\u003ch2 id=\"default-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDefault behavior\u003c/span\u003e \u003ca href=\"#default-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGiven:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/old-post /new-post\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/go/docs https://docs.example.com/start\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eA normal build writes under the configured \u003ccode\u003eoutput_dir\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;output_dir\u0026gt;/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── redirects.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── old-post/index.html\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e└── go/docs/index.html\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003eredirects.conf\u003c/code\u003e contains exact-match nginx rules:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003elocation\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;/old-post\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003ereturn\u003c/span\u003e \u003cspan class=\"mi\"\u003e301\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;/new-post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003elocation\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;/go/docs\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003ereturn\u003c/span\u003e \u003cspan class=\"mi\"\u003e301\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;https://docs.example.com/start\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eHTML fallback pages remain enabled by default so the same build artifact continues to work on static hosts that do not consume nginx configuration.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eredirects\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eredirects_file\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;static/_redirects\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eredirect_template\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;templates/redirect.html\u0026#34;\u003c/span\u003e \u003cspan class=\"c\"\u003e# optional\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml_fallback\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSet \u003ccode\u003ehtml_fallback = false\u003c/code\u003e when the deployment is guaranteed to use the generated nginx rules and you do not want new per-path HTML redirect pages:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eredirects\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml_fallback\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen changing this setting on an existing incremental output directory, use a clean build if you also want old HTML fallback files removed. Markata-go deliberately does not delete arbitrary \u003ccode\u003eindex.html\u003c/code\u003e files because redirect paths can overlap normal site content and custom templates do not provide a safe ownership marker.\u003c/p\u003e\n\u003ch2 id=\"keeping-redirects-conf-current\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKeeping \u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003eredirects.conf\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e current\u003c/span\u003e \u003ca href=\"#keeping-redirects-conf-current\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOn normal builds, nginx output is refreshed whenever the configured \u003ccode\u003e_redirects\u003c/code\u003e file exists. If that file is empty, markata-go writes a valid header-only \u003ccode\u003eredirects.conf\u003c/code\u003e, so previously generated native rules cannot remain active.\u003c/p\u003e\n\u003cp\u003eIf the \u003ccode\u003e_redirects\u003c/code\u003e source is deleted, markata-go removes an existing \u003ccode\u003eredirects.conf\u003c/code\u003e only when it recognizes the file as its own generated artifact. A user-managed \u003ccode\u003eredirects.conf\u003c/code\u003e is left untouched.\u003c/p\u003e\n\u003cp\u003eWhen \u003ccode\u003e_redirects\u003c/code\u003e exists, \u003ccode\u003eredirects.conf\u003c/code\u003e is the plugin\u0026rsquo;s generated output path. If the output directory already contains a file at that path that is not marked as Markata-generated—for example \u003ccode\u003estatic/redirects.conf\u003c/code\u003e copied by the static-assets plugin—the build fails with a clear conflict instead of overwriting it. Rename or remove the manually managed file before enabling generated nginx redirects.\u003c/p\u003e\n\u003ch2 id=\"include-from-nginx\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInclude from nginx\u003c/span\u003e \u003ca href=\"#include-from-nginx\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eInclude the generated file from inside the nginx \u003ccode\u003eserver\u003c/code\u003e block that serves the built site:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eserver\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elisten\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eserver_name\u003c/span\u003e \u003cspan class=\"s\"\u003eexample.com\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eroot\u003c/span\u003e \u003cspan class=\"s\"\u003e/usr/share/nginx/html\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003einclude\u003c/span\u003e \u003cspan class=\"s\"\u003e/usr/share/nginx/html/redirects.conf\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"s\"\u003e/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003etry_files\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri/\u003c/span\u003e \u003cspan class=\"s\"\u003e/index.html\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e404\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe include path must match the deployed \u003ccode\u003eoutput_dir\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"release-directories-and-current-symlinks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRelease directories and \u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003ecurrent\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e symlinks\u003c/span\u003e \u003ca href=\"#release-directories-and-current-symlinks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf a deployment serves releases through a \u003ccode\u003ecurrent\u003c/code\u003e symlink, point the include at the active release only when the nginx process will be reloaded as part of the release switch. Nginx reads included configuration when it loads or reloads its configuration; changing the symlink alone does not make an already-running nginx process reread \u003ccode\u003eredirects.conf\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eFor builder-admin or other in-place release switching, either:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ereload nginx after activating a release whose redirect config changed, or\u003c/li\u003e\n\u003cli\u003ekeep nginx-native redirects out of that live-switch path until a reload hook is part of the deployment.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eHTML fallbacks continue to work without an nginx reload because they are served as ordinary files from the active release.\u003c/p\u003e\n\u003ch2 id=\"supported-rules\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSupported rules\u003c/span\u003e \u003ca href=\"#supported-rules\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe native output intentionally follows the redirects plugin\u0026rsquo;s existing parser:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003esource paths must start with \u003ccode\u003e/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003edestinations must be \u003ccode\u003e/absolute-path\u003c/code\u003e, \u003ccode\u003ehttp://...\u003c/code\u003e, or \u003ccode\u003ehttps://...\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ecomments and blank lines are ignored\u003c/li\u003e\n\u003cli\u003emalformed rules are ignored\u003c/li\u003e\n\u003cli\u003ewildcard rules containing \u003ccode\u003e*\u003c/code\u003e are skipped\u003c/li\u003e\n\u003cli\u003eextra fields such as platform-specific status codes are currently ignored\u003c/li\u003e\n\u003cli\u003egenerated nginx redirects use HTTP \u003ccode\u003e301\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThis keeps nginx output and HTML fallback behavior aligned. Use hand-written nginx configuration or the hosting provider\u0026rsquo;s native redirect system for wildcard, conditional, or status-code-specific rules.\u003c/p\u003e\n\u003ch2 id=\"fast-builds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFast builds\u003c/span\u003e \u003ca href=\"#fast-builds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe redirects plugin is skipped in \u003ccode\u003e--fast\u003c/code\u003e mode. Run a normal build before publishing, validating, or reloading nginx with \u003ccode\u003eredirects.conf\u003c/code\u003e.\u003c/p\u003e\n",
      "content_text": "\n\nThe built-in redirects plugin generates nginx-native redirect rules from the same `static/_redirects` file used for static HTML fallbacks.\n\n## Default behavior\n\nGiven:\n\n```text\n/old-post /new-post\n/go/docs https://docs.example.com/start\n```\n\nA normal build writes under the configured `output_dir`:\n\n```text\n\u003coutput_dir\u003e/\n├── redirects.conf\n├── old-post/index.html\n└── go/docs/index.html\n```\n\n`redirects.conf` contains exact-match nginx rules:\n\n```nginx\nlocation = \"/old-post\" {\n    return 301 \"/new-post\";\n}\n\nlocation = \"/go/docs\" {\n    return 301 \"https://docs.example.com/start\";\n}\n```\n\nHTML fallback pages remain enabled by default so the same build artifact continues to work on static hosts that do not consume nginx configuration.\n\n## Configuration\n\n```toml\n[markata-go.redirects]\nredirects_file = \"static/_redirects\"\nredirect_template = \"templates/redirect.html\" # optional\nhtml_fallback = true\n```\n\nSet `html_fallback = false` when the deployment is guaranteed to use the generated nginx rules and you do not want new per-path HTML redirect pages:\n\n```toml\n[markata-go.redirects]\nhtml_fallback = false\n```\n\nWhen changing this setting on an existing incremental output directory, use a clean build if you also want old HTML fallback files removed. Markata-go deliberately does not delete arbitrary `index.html` files because redirect paths can overlap normal site content and custom templates do not provide a safe ownership marker.\n\n## Keeping `redirects.conf` current\n\nOn normal builds, nginx output is refreshed whenever the configured `_redirects` file exists. If that file is empty, markata-go writes a valid header-only `redirects.conf`, so previously generated native rules cannot remain active.\n\nIf the `_redirects` source is deleted, markata-go removes an existing `redirects.conf` only when it recognizes the file as its own generated artifact. A user-managed `redirects.conf` is left untouched.\n\nWhen `_redirects` exists, `redirects.conf` is the plugin's generated output path. If the output directory already contains a file at that path that is not marked as Markata-generated—for example `static/redirects.conf` copied by the static-assets plugin—the build fails with a clear conflict instead of overwriting it. Rename or remove the manually managed file before enabling generated nginx redirects.\n\n## Include from nginx\n\nInclude the generated file from inside the nginx `server` block that serves the built site:\n\n```nginx\nserver {\n    listen 80;\n    server_name example.com;\n    root /usr/share/nginx/html;\n\n    include /usr/share/nginx/html/redirects.conf;\n\n    location / {\n        try_files $uri $uri/ /index.html =404;\n    }\n}\n```\n\nThe include path must match the deployed `output_dir`.\n\n### Release directories and `current` symlinks\n\nIf a deployment serves releases through a `current` symlink, point the include at the active release only when the nginx process will be reloaded as part of the release switch. Nginx reads included configuration when it loads or reloads its configuration; changing the symlink alone does not make an already-running nginx process reread `redirects.conf`.\n\nFor builder-admin or other in-place release switching, either:\n\n- reload nginx after activating a release whose redirect config changed, or\n- keep nginx-native redirects out of that live-switch path until a reload hook is part of the deployment.\n\nHTML fallbacks continue to work without an nginx reload because they are served as ordinary files from the active release.\n\n## Supported rules\n\nThe native output intentionally follows the redirects plugin's existing parser:\n\n- source paths must start with `/`\n- destinations must be `/absolute-path`, `http://...`, or `https://...`\n- comments and blank lines are ignored\n- malformed rules are ignored\n- wildcard rules containing `*` are skipped\n- extra fields such as platform-specific status codes are currently ignored\n- generated nginx redirects use HTTP `301`\n\nThis keeps nginx output and HTML fallback behavior aligned. Use hand-written nginx configuration or the hosting provider's native redirect system for wildcard, conditional, or status-code-specific rules.\n\n## Fast builds\n\nThe redirects plugin is skipped in `--fast` mode. Run a normal build before publishing, validating, or reloading nginx with `redirects.conf`.\n",
      "summary": "The built-in redirects plugin generates nginx-native redirect rules from the same static/redirects file used for static HTML fallbacks.",
      "date_published": "2026-09-27T00:00:00Z",
      "date_modified": "2026-09-27T00:00:00Z",
      "tags": [
        "documentation"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/markdown-containers/",
      "url": "https://markata.dev/docs/guides/markdown-containers/",
      "title": "Markdown Containers",
      "content_html": "\u003cp\u003emarkata-go supports fenced Markdown containers for grouping content in a \u003ccode\u003e\u0026lt;div\u0026gt;\u003c/code\u003e with classes, an optional ID, and custom attributes.\u003c/p\u003e\n\u003ch2 id=\"basic-container\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic container\u003c/span\u003e \u003ca href=\"#basic-container\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse three or more colons followed by a class name or attributes to open a container. Close it with a bare line containing only the same number of colons.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: card {\u003cspan class=\"ni\"\u003e#intro\u003c/span\u003e .featured data-kind=\u0026#34;note\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis Markdown is inside the card.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe closing line must be \u003cstrong\u003ecolon-only\u003c/strong\u003e. A line such as \u003ccode\u003e::: card\u003c/code\u003e, \u003ccode\u003e::: {.card}\u003c/code\u003e, or a decorated/indented marker should not be used as a closer.\u003c/p\u003e\n\u003ch2 id=\"nested-containers\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNested containers\u003c/span\u003e \u003ca href=\"#nested-containers\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse a longer fence for each nested level and close each level with its matching bare fence. This makes the structure predictable and keeps content after an inner close inside its parent container.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: cards\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOuter content before the card.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: card\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eInner card content.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOuter content after the card.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe example above renders the \u003ccode\u003ecard\u003c/code\u003e inside \u003ccode\u003ecards\u003c/code\u003e, then continues rendering the final paragraph inside the outer \u003ccode\u003ecards\u003c/code\u003e container.\u003c/p\u003e\n\u003cp\u003eA useful rule is:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePurpose\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eOpen outer container\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e::: cards\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eOpen nested container\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e:::: card\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eClose nested container\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e::::\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eClose outer container\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e:::\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eDo not rely on a shorter outer closing fence to implicitly close deeper nested containers. Close the innermost container first with the same number of colons it used to open, then close the parent.\u003c/p\u003e\n\u003ch2 id=\"classes-and-attributes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eClasses and attributes\u003c/span\u003e \u003ca href=\"#classes-and-attributes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe opening line can include multiple classes and an attribute block:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: panel wide {\u003cspan class=\"ni\"\u003e#example\u003c/span\u003e .accent data-state=\u0026#34;ready\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis produces a container with the classes \u003ccode\u003epanel\u003c/code\u003e, \u003ccode\u003ewide\u003c/code\u003e, and \u003ccode\u003eaccent\u003c/code\u003e, the ID \u003ccode\u003eexample\u003c/code\u003e, and the custom \u003ccode\u003edata-state\u003c/code\u003e attribute.\u003c/p\u003e\n\u003ch2 id=\"native-tabs-no-web-awesome-required\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNative tabs (no Web Awesome required)\u003c/span\u003e \u003ca href=\"#native-tabs-no-web-awesome-required\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNative tabs use the same fenced-container syntax as \u003ccode\u003emd-card\u003c/code\u003e. Every\npanel is rendered to HTML on the server. Without JavaScript, all panels remain\nvisible with headings; when JavaScript loads, a small keyboard-accessible tab\nstrip replaces the headings. Printing expands all panels.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: md-tabs {data-label=\u0026#34;Installation methods\u0026#34; style=\u0026#34;boxed\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-tab {label=\u0026#34;curl\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -fsSL https://example.com/install.sh \u003cspan class=\"p\"\u003e|\u003c/span\u003e bash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-tab {label=\u0026#34;mise\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emise use -g github:WaylonWalker/markata\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe outer \u003ccode\u003emd-tabs\u003c/code\u003e uses three colons, with direct child \u003ccode\u003emd-tab\u003c/code\u003e\ncontainers using four. Tabs may contain ordinary Markdown, code fences, cards,\nand nested blocks. Use \u003ccode\u003estyle=\u0026quot;boxed\u0026quot;\u003c/code\u003e (default), \u003ccode\u003estyle=\u0026quot;underline\u0026quot;\u003c/code\u003e,\nor \u003ccode\u003estyle=\u0026quot;pills\u0026quot;\u003c/code\u003e; \u003ccode\u003edata-style\u003c/code\u003e is also accepted. Use \u003ccode\u003edata-label\u003c/code\u003e\nto give the tab group an accessible name. Tab labels are plain text.\nOn narrow screens the tab strip scrolls horizontally. Native tabs have no\nWeb Awesome dependency and the enhancement script only loads on pages using\nthem. Existing \u003ccode\u003ewa-tabs\u003c/code\u003e continue to work separately.\u003c/p\u003e\n\u003ch2 id=\"web-awesome-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWeb Awesome example\u003c/span\u003e \u003ca href=\"#web-awesome-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe same nesting rule is useful for components that transform Markdown containers after rendering:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: wa-tabs\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: wa-tab {label=\u0026#34;macOS\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew install markata-go\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: wa-tab {label=\u0026#34;Linux\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -fsSL https://example.com/install.sh \u003cspan class=\"p\"\u003e|\u003c/span\u003e sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe outer \u003ccode\u003ewa-tabs\u003c/code\u003e container uses three colons and each nested \u003ccode\u003ewa-tab\u003c/code\u003e uses four, so the structure is unambiguous.\u003c/p\u003e\n\u003ch2 id=\"roads\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRoads\u003c/span\u003e \u003ca href=\"#roads\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe default theme turns a \u003ccode\u003eroad\u003c/code\u003e container into a scroll-drawn path of linked\nmilestones:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: road timeline\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eKickoff\u003c/span\u003e](\u003cspan class=\"na\"\u003e/notes/kickoff/\u003c/span\u003e) Jan 2026\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eLaunch\u003c/span\u003e](\u003cspan class=\"na\"\u003e/notes/launch/\u003c/span\u003e) Jun 2026\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSee \u003ca href=\"/docs/guides/roads/\"\u003eRoads\u003c/a\u003e for all styles and options.\u003c/p\u003e\n\u003cp\u003eFor prose-led histories, use \u003ccode\u003e::: road editorial story\u003c/code\u003e with a heading per\nentry. A leading \u003ccode\u003e:lucide-name:\u003c/code\u003e becomes a rail badge; an emphasis-only\nparagraph directly after the heading becomes its eyebrow label. Add \u003ccode\u003ereveal\u003c/code\u003e\n(\u003ccode\u003e::: road editorial story reveal\u003c/code\u003e) for optional, reduced-motion-safe scroll\nentrances. \u003ccode\u003estory\u003c/code\u003e alone opts into larger type and diamond-bullet highlights;\nplain editorial roads keep their existing typography.\u003c/p\u003e\n\u003ch2 id=\"responsive-article-layouts-static-html-and-css\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eResponsive article layouts (static HTML and CSS)\u003c/span\u003e \u003ca href=\"#responsive-article-layouts-static-html-and-css\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMarkata also provides \u003cstrong\u003eopt-in, article-scoped\u003c/strong\u003e layout classes built from the\nsame fenced containers. They generate plain HTML at build time: no JavaScript,\nexternal assets, or custom component framework. These classes intentionally use\n\u003ccode\u003emd-\u003c/code\u003e prefixes to avoid changing existing \u003ccode\u003e::: card\u003c/code\u003e, \u003ccode\u003e::: columns\u003c/code\u003e,\n\u003ccode\u003e!!! vsplit\u003c/code\u003e, and feed cards.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eContainer\u003c/th\u003e\n\u003cth\u003eResult\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-layout\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBordered grouping for an architecture diagram\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-box\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSimple bounded box\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-card\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSoft-surface card (scrollable if it contains a wide table)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-columns\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAuto-fitting equal-width columns, stacking when narrow\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-grid\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eResponsive grid, with optional fixed column count\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-stack\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eVertical grouping\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-divider\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSubtle rule\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-connector\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDecorative arrow between rows\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd-section\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSection with automatic heading/intro column, sticky on wide screens\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eUse \u003ccode\u003e{data-gap=\u0026quot;sm\u0026quot;}\u003c/code\u003e or \u003ccode\u003e{data-gap=\u0026quot;lg\u0026quot;}\u003c/code\u003e on grid/stack/layout containers,\n\u003ccode\u003e{data-columns=\u0026quot;2\u0026quot;}\u003c/code\u003e (also 3 or 4) for explicit desktop columns, and\n\u003ccode\u003e{data-align=\u0026quot;center\u0026quot;}\u003c/code\u003e on a card or box. Explicit columns stack at narrow\nviewports. Unknown values retain the defaults; arbitrary CSS is not accepted.\nUse descriptive text to convey relationships, rather than relying on arrow\ndirection alone for accessibility.\u003c/p\u003e\n\u003cp\u003eHeading permalink links stay inline inside \u003ccode\u003emd-card\u003c/code\u003e, including nested headings,\nso ordinary titles do not add a horizontal scrollbar. The links remain available\non hover and keyboard focus. Wide code blocks still scroll independently; a wide\ncomparison table can scroll within its card without widening the page.\u003c/p\u003e\n\u003ch3 id=\"markdown-story-pages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMarkdown story pages\u003c/span\u003e \u003ca href=\"#markdown-story-pages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSet \u003ccode\u003econtent_width: wide\u003c/code\u003e in a post\u0026rsquo;s frontmatter to opt into a wider frame,\nlarger balanced title, and a larger opening paragraph. Other pages keep their\nexisting appearance. This option applies to the default \u003ccode\u003epost.html\u003c/code\u003e template\n(custom templates must opt in themselves).\u003c/p\u003e\n\u003cp\u003eStart each \u003ccode\u003emd-section\u003c/code\u003e with an H2. The heading and the paragraph immediately\nafter it become the section head; everything else becomes the body. At 1100px\nand wider the head sticks beside the body while scrolling. Smaller screens\nstack them; print uses static headings. Without a leading H2, all content stays\nin the body.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;From foundations to agent workflows\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003econtent_width\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewide\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eA short opening paragraph introduces the story.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: md-section\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## 2026 · Agent workflows and access\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAgents became first-class platform users.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Identity and access\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLonger narrative, lists, tables, and cards go here.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eA short token (up to 16 characters, no spaces) followed by the exact separator\n\u003ccode\u003e·\u003c/code\u003e becomes a large primary-color kicker. The full heading\u0026rsquo;s ID is unchanged:\nthe example still links to \u003ccode\u003e#2026-agent-workflows-and-access\u003c/code\u003e. No JavaScript\nor separate \u003ccode\u003estory-head\u003c/code\u003e container is needed.\u003c/p\u003e\n\u003cp\u003eFor a timeline overview, add the \u003ccode\u003erail\u003c/code\u003e modifier to an \u003ccode\u003emd-grid\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: md-grid rail {data-columns=\u0026#34;2\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-card\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::: md-icon\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:lucide-bot:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ge\"\u003e_2026_\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### [Agent workflows](#2026-agent-workflows-and-access)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAgents inspect runs and read logs.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-card\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ge\"\u003e_2025_\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### [Platform visibility](#2025-platform-visibility)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTelemetry reaches more teams.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAt 1000px and wider, a rail joins card tops with ring ticks that fill on\nhover or keyboard focus. The default is four columns; \u003ccode\u003edata-columns=\u0026quot;2\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;3\u0026quot;\u003c/code\u003e\nor \u003ccode\u003e\u0026quot;4\u0026quot;\u003c/code\u003e overrides it. Below 1000px cards stack along a vertical rail with ring ticks. The ticks\nremain visible and fill on hover or keyboard focus. A card\u0026rsquo;s heading\nlink stretches over the card; keyboard focus outlines the card. Use one heading\nlink per card and avoid other interactive controls in these overview cards.\nAn emphasis-only paragraph supplies the small uppercase monospace kicker.\nRail cards allow visible overflow so the ring ticks remain visible above their tops.\nAn \u003ccode\u003emd-section\u003c/code\u003e immediately after the rail gets responsive spacing from 4.5rem to 7.5rem.\nThese defaults need no page-local CSS.\u003c/p\u003e\n\u003cp\u003eFor unresolved items, use \u003ccode\u003e::: md-grid pending\u003c/code\u003e with nested \u003ccode\u003emd-card\u003c/code\u003e\ncontainers. Cards get dashed borders, transparent backgrounds and muted icons.\nBoth variants use ordinary Markdown, work without JavaScript, and retain theme\ncolors. See \u003ccode\u003erendering-fixtures/story-layout.md\u003c/code\u003e for a full example.\u003c/p\u003e\n\u003ch3 id=\"architecture-diagram\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eArchitecture diagram\u003c/span\u003e \u003ca href=\"#architecture-diagram\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: md-layout\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-box {data-align=\u0026#34;center\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Falcon3 — Kubernetes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTwo deployments, shared published site volume.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-columns {data-gap=\u0026#34;sm\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::: md-card {data-align=\u0026#34;center\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Website\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eNginx serves current release.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::: md-card {data-align=\u0026#34;center\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Builder Admin\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBuilds and publishes releases.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-connector {data-direction=\u0026#34;both\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-box {data-align=\u0026#34;center\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Shared `/data/site` Longhorn PVC\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eReplicated storage: NVMe + HDD.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe connector arrows are only a decorative aid, not a replacement for the\ndescriptive labels. For connected arbitrary graphs, use Mermaid.\u003c/p\u003e\n\u003ch3 id=\"icons-and-feature-rows\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIcons and feature rows\u003c/span\u003e \u003ca href=\"#icons-and-feature-rows\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe built-in \u003ccode\u003eicons\u003c/code\u003e plugin already accepts Lucide shortcodes like\n\u003ccode\u003e:lucide-rocket:\u003c/code\u003e. Combine those shortcodes with \u003ccode\u003emd-icon\u003c/code\u003e (centered icon,\noptional \u003ccode\u003e{data-size=\u0026quot;lg\u0026quot;}\u003c/code\u003e), or with an \u003ccode\u003emd-feature\u003c/code\u003e row containing a\n\u003ccode\u003emd-feature-icon\u003c/code\u003e and \u003ccode\u003emd-feature-body\u003c/code\u003e. No new icon font, CDN, or\nJavaScript is necessary.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: md-feature\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-feature-icon\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:lucide-rocket:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-feature-body\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Verify production\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSmoke-test the new Markdown components at mobile widths.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe icon remains decorative, so provide readable heading text. The row stays\nwithin its article column at narrow widths. For side-by-side icon cards or\nmore icon names, see \u003ca href=\"/docs/guides/icons/\"\u003eIcon Shortcodes\u003c/a\u003e.\u003c/p\u003e\n\u003ch3 id=\"side-by-side-tables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSide-by-side tables\u003c/span\u003e \u003ca href=\"#side-by-side-tables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: md-columns\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-card\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Current storage\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Node | Capacity |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| --- | ---: |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Falcon2 | 3 TB |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Falcon3 | 4 TB |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-card\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Proposed storage\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Node | Capacity |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| --- | ---: |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Falcon2 | 3 TB |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Falcon3 | 14 TB |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEach table remains normal semantic Markdown HTML and can independently use\ntable sorting when enabled. Cards keep their own horizontal overflow instead\nof forcing the whole article to scroll. For more examples, see\n\u003ccode\u003eexamples/gallery-site/pages/layout-primitives.md\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"status-and-metric-reports\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStatus and metric reports\u003c/span\u003e \u003ca href=\"#status-and-metric-reports\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eYou can also compose native, accessible status badges, metric cards, progress bars,\nand before/after comparisons. See the \u003ca href=\"/docs/guides/markdown-metrics/\"\u003eMarkdown metrics guide\u003c/a\u003e\nfor the required values, labels, and data-tone options.\u003c/p\u003e\n",
      "content_text": "\n\nmarkata-go supports fenced Markdown containers for grouping content in a `\u003cdiv\u003e` with classes, an optional ID, and custom attributes.\n\n## Basic container\n\nUse three or more colons followed by a class name or attributes to open a container. Close it with a bare line containing only the same number of colons.\n\n````markdown\n::: card {#intro .featured data-kind=\"note\"}\nThis Markdown is inside the card.\n\n:::\n````\n\nThe closing line must be **colon-only**. A line such as `::: card`, `::: {.card}`, or a decorated/indented marker should not be used as a closer.\n\n## Nested containers\n\nUse a longer fence for each nested level and close each level with its matching bare fence. This makes the structure predictable and keeps content after an inner close inside its parent container.\n\n````markdown\n::: cards\nOuter content before the card.\n\n:::: card\nInner card content.\n\n::::\n\nOuter content after the card.\n\n:::\n````\n\nThe example above renders the `card` inside `cards`, then continues rendering the final paragraph inside the outer `cards` container.\n\nA useful rule is:\n\n| Purpose | Example |\n|---|---|\n| Open outer container | `::: cards` |\n| Open nested container | `:::: card` |\n| Close nested container | `::::` |\n| Close outer container | `:::` |\n\nDo not rely on a shorter outer closing fence to implicitly close deeper nested containers. Close the innermost container first with the same number of colons it used to open, then close the parent.\n\n## Classes and attributes\n\nThe opening line can include multiple classes and an attribute block:\n\n````markdown\n:::: panel wide {#example .accent data-state=\"ready\"}\nContent\n\n::::\n````\n\nThis produces a container with the classes `panel`, `wide`, and `accent`, the ID `example`, and the custom `data-state` attribute.\n\n## Native tabs (no Web Awesome required)\n\nNative tabs use the same fenced-container syntax as `md-card`. Every\npanel is rendered to HTML on the server. Without JavaScript, all panels remain\nvisible with headings; when JavaScript loads, a small keyboard-accessible tab\nstrip replaces the headings. Printing expands all panels.\n\n````markdown\n::: md-tabs {data-label=\"Installation methods\" style=\"boxed\"}\n\n:::: md-tab {label=\"curl\"}\n```bash\ncurl -fsSL https://example.com/install.sh | bash\n```\n::::\n\n:::: md-tab {label=\"mise\"}\n```bash\nmise use -g github:WaylonWalker/markata\n```\n::::\n\n:::\n````\n\nThe outer `md-tabs` uses three colons, with direct child `md-tab`\ncontainers using four. Tabs may contain ordinary Markdown, code fences, cards,\nand nested blocks. Use `style=\"boxed\"` (default), `style=\"underline\"`,\nor `style=\"pills\"`; `data-style` is also accepted. Use `data-label`\nto give the tab group an accessible name. Tab labels are plain text.\nOn narrow screens the tab strip scrolls horizontally. Native tabs have no\nWeb Awesome dependency and the enhancement script only loads on pages using\nthem. Existing `wa-tabs` continue to work separately.\n\n## Web Awesome example\n\nThe same nesting rule is useful for components that transform Markdown containers after rendering:\n\n````markdown\n::: wa-tabs\n\n:::: wa-tab {label=\"macOS\"}\n```bash\nbrew install markata-go\n```\n\n::::\n\n:::: wa-tab {label=\"Linux\"}\n```bash\ncurl -fsSL https://example.com/install.sh | sh\n```\n\n::::\n\n\n:::\n````\n\nThe outer `wa-tabs` container uses three colons and each nested `wa-tab` uses four, so the structure is unambiguous.\n\n## Roads\n\nThe default theme turns a `road` container into a scroll-drawn path of linked\nmilestones:\n\n````markdown\n::: road timeline\n\n- [Kickoff](/notes/kickoff/) Jan 2026\n- [Launch](/notes/launch/) Jun 2026\n\n:::\n````\n\nSee [Roads](/docs/guides/roads/) for all styles and options.\n\nFor prose-led histories, use `::: road editorial story` with a heading per\nentry. A leading `:lucide-name:` becomes a rail badge; an emphasis-only\nparagraph directly after the heading becomes its eyebrow label. Add `reveal`\n(`::: road editorial story reveal`) for optional, reduced-motion-safe scroll\nentrances. `story` alone opts into larger type and diamond-bullet highlights;\nplain editorial roads keep their existing typography.\n\n## Responsive article layouts (static HTML and CSS)\n\nMarkata also provides **opt-in, article-scoped** layout classes built from the\nsame fenced containers. They generate plain HTML at build time: no JavaScript,\nexternal assets, or custom component framework. These classes intentionally use\n`md-` prefixes to avoid changing existing `::: card`, `::: columns`,\n`!!! vsplit`, and feed cards.\n\n| Container | Result |\n|---|---|\n| `md-layout` | Bordered grouping for an architecture diagram |\n| `md-box` | Simple bounded box |\n| `md-card` | Soft-surface card (scrollable if it contains a wide table) |\n| `md-columns` | Auto-fitting equal-width columns, stacking when narrow |\n| `md-grid` | Responsive grid, with optional fixed column count |\n| `md-stack` | Vertical grouping |\n| `md-divider` | Subtle rule |\n| `md-connector` | Decorative arrow between rows |\n| `md-section` | Section with automatic heading/intro column, sticky on wide screens |\n\nUse `{data-gap=\"sm\"}` or `{data-gap=\"lg\"}` on grid/stack/layout containers,\n`{data-columns=\"2\"}` (also 3 or 4) for explicit desktop columns, and\n`{data-align=\"center\"}` on a card or box. Explicit columns stack at narrow\nviewports. Unknown values retain the defaults; arbitrary CSS is not accepted.\nUse descriptive text to convey relationships, rather than relying on arrow\ndirection alone for accessibility.\n\nHeading permalink links stay inline inside `md-card`, including nested headings,\nso ordinary titles do not add a horizontal scrollbar. The links remain available\non hover and keyboard focus. Wide code blocks still scroll independently; a wide\ncomparison table can scroll within its card without widening the page.\n\n### Markdown story pages\n\nSet `content_width: wide` in a post's frontmatter to opt into a wider frame,\nlarger balanced title, and a larger opening paragraph. Other pages keep their\nexisting appearance. This option applies to the default `post.html` template\n(custom templates must opt in themselves).\n\nStart each `md-section` with an H2. The heading and the paragraph immediately\nafter it become the section head; everything else becomes the body. At 1100px\nand wider the head sticks beside the body while scrolling. Smaller screens\nstack them; print uses static headings. Without a leading H2, all content stays\nin the body.\n\n````markdown\n---\ntitle: \"From foundations to agent workflows\"\ncontent_width: wide\n---\n\nA short opening paragraph introduces the story.\n\n::: md-section\n## 2026 · Agent workflows and access\n\nAgents became first-class platform users.\n\n### Identity and access\n\nLonger narrative, lists, tables, and cards go here.\n:::\n````\n\nA short token (up to 16 characters, no spaces) followed by the exact separator\n` · ` becomes a large primary-color kicker. The full heading's ID is unchanged:\nthe example still links to `#2026-agent-workflows-and-access`. No JavaScript\nor separate `story-head` container is needed.\n\nFor a timeline overview, add the `rail` modifier to an `md-grid`:\n\n````markdown\n::: md-grid rail {data-columns=\"2\"}\n:::: md-card\n::::: md-icon\n:lucide-bot:\n:::::\n\n_2026_\n\n### [Agent workflows](#2026-agent-workflows-and-access)\n\nAgents inspect runs and read logs.\n\n::::\n\n:::: md-card\n_2025_\n\n### [Platform visibility](#2025-platform-visibility)\n\nTelemetry reaches more teams.\n\n::::\n\n:::\n````\n\nAt 1000px and wider, a rail joins card tops with ring ticks that fill on\nhover or keyboard focus. The default is four columns; `data-columns=\"2\"`, `\"3\"`\nor `\"4\"` overrides it. Below 1000px cards stack along a vertical rail with ring ticks. The ticks\nremain visible and fill on hover or keyboard focus. A card's heading\nlink stretches over the card; keyboard focus outlines the card. Use one heading\nlink per card and avoid other interactive controls in these overview cards.\nAn emphasis-only paragraph supplies the small uppercase monospace kicker.\nRail cards allow visible overflow so the ring ticks remain visible above their tops.\nAn `md-section` immediately after the rail gets responsive spacing from 4.5rem to 7.5rem.\nThese defaults need no page-local CSS.\n\nFor unresolved items, use `::: md-grid pending` with nested `md-card`\ncontainers. Cards get dashed borders, transparent backgrounds and muted icons.\nBoth variants use ordinary Markdown, work without JavaScript, and retain theme\ncolors. See `rendering-fixtures/story-layout.md` for a full example.\n\n### Architecture diagram\n\n````markdown\n::: md-layout\n\n:::: md-box {data-align=\"center\"}\n### Falcon3 — Kubernetes\nTwo deployments, shared published site volume.\n\n\n::::\n\n:::: md-columns {data-gap=\"sm\"}\n\n::::: md-card {data-align=\"center\"}\n### Website\nNginx serves current release.\n\n\n:::::\n\n::::: md-card {data-align=\"center\"}\n### Builder Admin\nBuilds and publishes releases.\n\n\n:::::\n\n\n\n::::\n\n:::: md-connector {data-direction=\"both\"}\n\n\n::::\n\n:::: md-box {data-align=\"center\"}\n### Shared `/data/site` Longhorn PVC\nReplicated storage: NVMe + HDD.\n\n\n::::\n\n\n\n:::\n````\n\nThe connector arrows are only a decorative aid, not a replacement for the\ndescriptive labels. For connected arbitrary graphs, use Mermaid.\n\n### Icons and feature rows\n\nThe built-in `icons` plugin already accepts Lucide shortcodes like\n`:lucide-rocket:`. Combine those shortcodes with `md-icon` (centered icon,\noptional `{data-size=\"lg\"}`), or with an `md-feature` row containing a\n`md-feature-icon` and `md-feature-body`. No new icon font, CDN, or\nJavaScript is necessary.\n\n````markdown\n::: md-feature\n\n:::: md-feature-icon\n:lucide-rocket:\n\n::::\n\n:::: md-feature-body\n### Verify production\nSmoke-test the new Markdown components at mobile widths.\n\n::::\n\n:::\n````\n\nThe icon remains decorative, so provide readable heading text. The row stays\nwithin its article column at narrow widths. For side-by-side icon cards or\nmore icon names, see [Icon Shortcodes](/docs/guides/icons/).\n\n### Side-by-side tables\n\n````markdown\n::: md-columns\n\n:::: md-card\n### Current storage\n\n| Node | Capacity |\n| --- | ---: |\n| Falcon2 | 3 TB |\n| Falcon3 | 4 TB |\n\n\n::::\n\n:::: md-card\n### Proposed storage\n\n| Node | Capacity |\n| --- | ---: |\n| Falcon2 | 3 TB |\n| Falcon3 | 14 TB |\n\n\n::::\n\n\n\n:::\n````\n\nEach table remains normal semantic Markdown HTML and can independently use\ntable sorting when enabled. Cards keep their own horizontal overflow instead\nof forcing the whole article to scroll. For more examples, see\n`examples/gallery-site/pages/layout-primitives.md`.\n\n### Status and metric reports\n\nYou can also compose native, accessible status badges, metric cards, progress bars,\nand before/after comparisons. See the [Markdown metrics guide](/docs/guides/markdown-metrics/)\nfor the required values, labels, and data-tone options.\n",
      "summary": "Use ::: fenced containers safely, including predictable nested containers",
      "date_published": "2026-09-27T00:00:00Z",
      "date_modified": "2026-09-27T00:00:00Z",
      "tags": [
        "documentation",
        "markdown",
        "containers"
      ]
    },
    {
      "id": "https://markata.dev/docs/plans/2026-09-26-serve-control-center-design/",
      "url": "https://markata.dev/docs/plans/2026-09-26-serve-control-center-design/",
      "title": "Serve Control Center design",
      "content_html": "\u003ch2 id=\"existing-builder-admin\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExisting Builder Admin\u003c/span\u003e \u003ca href=\"#existing-builder-admin\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ccode\u003emarkata-go builder-admin\u003c/code\u003e command launches \u003ccode\u003epkg/builderadmin.Service\u003c/code\u003e from\nthe same executable as the normal CLI. Helm launches this command in the builder\nimage. The service has a leader-locked, serialized queue for builds, refresh\ntasks, and rollback. It keeps queued and running operations, completed build and\nrefresh records, trigger identity, timestamps, changed paths, release metadata,\nand log file paths. It persists \u003ccode\u003estate.json\u003c/code\u003e and per-job text logs under its\nhistory directory. The UI polls \u003ccode\u003e/api/state\u003c/code\u003e; users can enqueue a build or\nrefresh, inspect logs, and promote a retained release. Build jobs execute a\nchild \u003ccode\u003emarkata-go build\u003c/code\u003e process before release promotion. Proxy identity,\nHTTPS origin validation, and CSRF protect the production UI.\u003c/p\u003e\n\u003cp\u003eBuilder Admin does not currently hold page status, warnings, structured\ndiagnostics, step records, or structured log events. Its local command binds to\nloopback by default, but the protected UI cannot be used without the proxy\ncontract. The existing release and queue workflow stays in place. The local\nserve control view is mounted on the serve listener and consumes the shared\nsession runtime. This avoids weakening production authentication.\u003c/p\u003e\n\u003ch2 id=\"shared-state\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eShared state\u003c/span\u003e \u003ca href=\"#shared-state\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA session runtime stores jobs, steps, logs, diagnostics, pages, and server\nstatus. It sends immutable snapshots to subscribers. Build integration creates\nan initial job and a job for each rebuild, with one step per lifecycle stage.\nThe existing content diagnostics ledger supplies page dispositions and stable\ncodes. Errors that stop a build early create session diagnostics. Text logs are\nretained within a bounded buffer, while job and diagnostic history remains\naccessible after a successful rebuild.\u003c/p\u003e\n\u003cp\u003eThe terminal and local web clients render runtime snapshots. They keep only\ntheir own view state, such as selection, search, and scroll position. Actions\nreturn to the runtime and use one validated handler. Build state never comes\nfrom parsing displayed log text.\u003c/p\u003e\n\u003ch2 id=\"operational-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOperational behavior\u003c/span\u003e \u003ca href=\"#operational-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe serve listener reports ready only after binding. Interactive terminals use\nBubble Tea. Redirected and CI output stays line-oriented, and \u003ccode\u003e--no-tui\u003c/code\u003e\nforces it. The local web view is \u003ccode\u003e/_markata/\u003c/code\u003e on the serve listener when\n\u003ccode\u003e--admin\u003c/code\u003e is set; \u003ccode\u003emarkata-go admin\u003c/code\u003e starts the same serve runtime with that\nview enabled. Its default host is loopback. Fatal errors remain visible after\nthe TUI exits. Shutdown closes the server, watcher, and subscribers.\u003c/p\u003e\n\u003ch2 id=\"validation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eValidation\u003c/span\u003e \u003ca href=\"#validation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUnit tests cover runtime lifecycle, history, diagnostic attachment, subscriber\nbehavior, and actions. Client tests render synthetic snapshots at normal and\nnarrow widths and exercise navigation, resize, search, and log scrollback.\nCommand tests cover TTY selection and local web launch. Manual terminal and\nbrowser checks verify the integrated path.\u003c/p\u003e\n",
      "content_text": "\n\n## Existing Builder Admin\n\nThe `markata-go builder-admin` command launches `pkg/builderadmin.Service` from\nthe same executable as the normal CLI. Helm launches this command in the builder\nimage. The service has a leader-locked, serialized queue for builds, refresh\ntasks, and rollback. It keeps queued and running operations, completed build and\nrefresh records, trigger identity, timestamps, changed paths, release metadata,\nand log file paths. It persists `state.json` and per-job text logs under its\nhistory directory. The UI polls `/api/state`; users can enqueue a build or\nrefresh, inspect logs, and promote a retained release. Build jobs execute a\nchild `markata-go build` process before release promotion. Proxy identity,\nHTTPS origin validation, and CSRF protect the production UI.\n\nBuilder Admin does not currently hold page status, warnings, structured\ndiagnostics, step records, or structured log events. Its local command binds to\nloopback by default, but the protected UI cannot be used without the proxy\ncontract. The existing release and queue workflow stays in place. The local\nserve control view is mounted on the serve listener and consumes the shared\nsession runtime. This avoids weakening production authentication.\n\n## Shared state\n\nA session runtime stores jobs, steps, logs, diagnostics, pages, and server\nstatus. It sends immutable snapshots to subscribers. Build integration creates\nan initial job and a job for each rebuild, with one step per lifecycle stage.\nThe existing content diagnostics ledger supplies page dispositions and stable\ncodes. Errors that stop a build early create session diagnostics. Text logs are\nretained within a bounded buffer, while job and diagnostic history remains\naccessible after a successful rebuild.\n\nThe terminal and local web clients render runtime snapshots. They keep only\ntheir own view state, such as selection, search, and scroll position. Actions\nreturn to the runtime and use one validated handler. Build state never comes\nfrom parsing displayed log text.\n\n## Operational behavior\n\nThe serve listener reports ready only after binding. Interactive terminals use\nBubble Tea. Redirected and CI output stays line-oriented, and `--no-tui`\nforces it. The local web view is `/_markata/` on the serve listener when\n`--admin` is set; `markata-go admin` starts the same serve runtime with that\nview enabled. Its default host is loopback. Fatal errors remain visible after\nthe TUI exits. Shutdown closes the server, watcher, and subscribers.\n\n## Validation\n\nUnit tests cover runtime lifecycle, history, diagnostic attachment, subscriber\nbehavior, and actions. Client tests render synthetic snapshots at normal and\nnarrow widths and exercise navigation, resize, search, and log scrollback.\nCommand tests cover TTY selection and local web launch. Manual terminal and\nbrowser checks verify the integrated path.\n",
      "summary": "Architecture and migration plan for shared serve jobs, diagnostics, terminal, and web clients",
      "date_published": "2026-09-26T00:00:00Z",
      "date_modified": "2026-09-26T00:00:00Z",
      "tags": [
        "documentation",
        "development"
      ]
    },
    {
      "id": "https://markata.dev/docs/plans/2026-09-26-gallery-and-titles-design/",
      "url": "https://markata.dev/docs/plans/2026-09-26-gallery-and-titles-design/",
      "title": "Gallery pages and title sizing",
      "content_html": "\u003cp\u003eIssue: #1289\u003c/p\u003e\n\u003ch2 id=\"design\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDesign\u003c/span\u003e \u003ca href=\"#design\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe default theme will provide \u003ccode\u003egallery.html\u003c/code\u003e for a post whose \u003ccode\u003egallery\u003c/code\u003e frontmatter is a list of images. Each item has a required \u003ccode\u003esrc\u003c/code\u003e and \u003ccode\u003ealt\u003c/code\u003e, with optional \u003ccode\u003ecaption\u003c/code\u003e, \u003ccode\u003ewidth\u003c/code\u003e, and \u003ccode\u003eheight\u003c/code\u003e. The template renders an ordinary linked image gallery. CSS creates a responsive masonry layout; a small script upgrades links to a dialog with keyboard and touch navigation. Full image links remain useful without JavaScript. The theme asset helpers make the CSS and script available to projects without copied assets.\u003c/p\u003e\n\u003cp\u003eThe existing \u003ccode\u003efeed-photo-grid.html\u003c/code\u003e already supports shots. Its cards will gain the word count used by Rhiannon\u0026rsquo;s site for longer entries and load priority will favor only the first visible row. Site-specific colors and typography stay in site CSS.\u003c/p\u003e\n\u003cp\u003ePost titles will receive a build-time length category derived from the plain title. CSS uses it as a conservative initial size and preserves wrapping. An optional browser fit pass can refine the size against the byline after fonts load and on resize. This keeps the first paint readable and avoids assuming the build knows the final font metrics or viewport.\u003c/p\u003e\n\u003ch2 id=\"verification\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVerification\u003c/span\u003e \u003ca href=\"#verification\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRender a demo gallery and a shots feed from local fixture content, inspect the generated HTML, test the gallery viewer and long title in a browser, and run relevant Go tests. Include screenshots in the pull request when capture is available.\u003c/p\u003e\n",
      "content_text": "\n\nIssue: #1289\n\n## Design\n\nThe default theme will provide `gallery.html` for a post whose `gallery` frontmatter is a list of images. Each item has a required `src` and `alt`, with optional `caption`, `width`, and `height`. The template renders an ordinary linked image gallery. CSS creates a responsive masonry layout; a small script upgrades links to a dialog with keyboard and touch navigation. Full image links remain useful without JavaScript. The theme asset helpers make the CSS and script available to projects without copied assets.\n\nThe existing `feed-photo-grid.html` already supports shots. Its cards will gain the word count used by Rhiannon's site for longer entries and load priority will favor only the first visible row. Site-specific colors and typography stay in site CSS.\n\nPost titles will receive a build-time length category derived from the plain title. CSS uses it as a conservative initial size and preserves wrapping. An optional browser fit pass can refine the size against the byline after fonts load and on resize. This keeps the first paint readable and avoids assuming the build knows the final font metrics or viewport.\n\n## Verification\n\nRender a demo gallery and a shots feed from local fixture content, inspect the generated HTML, test the gallery viewer and long title in a browser, and run relevant Go tests. Include screenshots in the pull request when capture is available.\n",
      "summary": "Issue: #1289",
      "date_published": "2026-09-26T00:00:00Z",
      "date_modified": "2026-09-26T00:00:00Z",
      "tags": [
        "documentation"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/serve-control-center/",
      "url": "https://markata.dev/docs/guides/serve-control-center/",
      "title": "Serve Control Center",
      "content_html": "\u003cp\u003eStart a local development session:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIn a terminal, \u003ccode\u003eserve\u003c/code\u003e opens a dashboard showing server status, recent jobs,\nwarnings, errors, pages, and logs. The site remains at\n\u003ccode\u003ehttp://localhost:8000\u003c/code\u003e. File changes create rebuild jobs. Each job keeps its\nsteps and diagnostics, so a failed rebuild remains inspectable after the next\nsuccessful one.\u003c/p\u003e\n\u003cp\u003eFor line-oriented output, use \u003ccode\u003emarkata-go serve --no-tui\u003c/code\u003e. Markata also chooses\nline-oriented output when input or output is redirected, when \u003ccode\u003e--no-input\u003c/code\u003e is\nset, or when the terminal is unavailable. This mode works in scripts and CI.\nWhile the interactive dashboard is open, build and plugin messages appear in\nits Logs and Problems views. Serve keeps terminal ownership so rebuild output\ndoes not overwrite the dashboard, including while the terminal is resized.\u003c/p\u003e\n\u003ch2 id=\"local-web-dashboard\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLocal web dashboard\u003c/span\u003e \u003ca href=\"#local-web-dashboard\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve --admin\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Site:  http://localhost:8000/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Admin: http://localhost:8000/_markata/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003emarkata-go serve\u003c/code\u003e enables this dashboard by default on a loopback listener.\n\u003ccode\u003emarkata-go serve --admin\u003c/code\u003e remains supported. Use \u003ccode\u003e--no-admin\u003c/code\u003e to disable the\ndashboard. A non-loopback bind, such as \u003ccode\u003e--bind 0.0.0.0\u003c/code\u003e, leaves it disabled;\nrequesting \u003ccode\u003e--admin\u003c/code\u003e on such a bind fails. The dashboard URL appears in plain\nstartup output and as an Admin shortcut in the TUI.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003emarkata-go admin\u003c/code\u003e starts the same local serve session with the web dashboard\nand line-oriented terminal output. Both commands show the same jobs,\nwarnings, errors, and pages that the terminal dashboard sees. The local admin\ndashboard only binds to loopback. For remote, release-oriented operations use\nthe protected \u003ca href=\"/docs/guides/deployment/builder-admin/\"\u003eBuilder Admin deployment guide\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe web dashboard supports manual builds, job reruns, and rebuilding a selected\npage. Jobs keep logs and lifecycle steps. Page details show source diagnostics\nand suggested fixes when Markata has enough context. You can open a generated\npage from its page entry when it has a URL. The Feeds section uses the same\nfeed and post metadata as the build, and its post links open the matching page\ndetails.\u003c/p\u003e\n\u003ch3 id=\"browser-navigation-and-appearance\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBrowser navigation and appearance\u003c/span\u003e \u003ca href=\"#browser-navigation-and-appearance\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe browser URL records the current section, selected item, and filter in its\nfragment. You can copy a link to a job, problem, page, feed, or filtered log\nview. Browser Back and Forward restore earlier selections and sections.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eKey\u003c/th\u003e\n\u003cth\u003eAction\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ej\u003c/code\u003e / \u003ccode\u003ek\u003c/code\u003e, arrows\u003c/td\u003e\n\u003ctd\u003eMove through the current list\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eEnter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMove focus to the selected item\u0026rsquo;s details\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eEsc\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eClear the current selection or close keyboard help\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFocus the current section\u0026rsquo;s filter\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eg\u003c/code\u003e / \u003ccode\u003eG\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSelect the first or last item\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ew\u003c/code\u003e / \u003ccode\u003ee\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow warnings or errors\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ep\u003c/code\u003e / \u003ccode\u003ef\u003c/code\u003e / \u003ccode\u003el\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOpen pages, feeds, or logs\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003er\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRerun the selected completed job while Jobs is active\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e?\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow keyboard help\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eShortcuts pause while a text field or editable element has focus. At narrow\nwindow widths, the list and details use a single-column layout with a fixed\nsection bar. Focus indicators remain visible for keyboard use.\u003c/p\u003e\n\u003cp\u003eThe browser colors follow the configured Markata palette through semantic roles\nfor surfaces, text, links, focus, status, code, and buttons. The shared semantic\ntoken stylesheet is also used by Builder Admin, which keeps its separate\nproduction workflows and page structure. A shared browser shell is tracked in\n\u003ca href=\"https://github.com/WaylonWalker/markata-go/issues/1300\"\u003e#1300\u003c/a\u003e; the local fix\npreview and source mutation actions remain available only in local Serve.\u003c/p\u003e\n\u003ch2 id=\"review-and-apply-fixes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReview and apply fixes\u003c/span\u003e \u003ca href=\"#review-and-apply-fixes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe local Problems view can preview source fixes before applying them. Plans\nshow their category, safety class, source location, and before/after text.\nUse \u003cstrong\u003eReview all safe\u003c/strong\u003e to review every currently safe fix, a category button\nto review one group, or \u003cstrong\u003eSelect\u003c/strong\u003e on individual problems followed by\n\u003cstrong\u003eReview selected\u003c/strong\u003e. The review dialog lists every proposed edit before you\napprove the batch. It shows a full-file diff for each source file using bundled\nassets, so review works without internet access. If rich rendering fails, the\ndialog shows a text diff of the same previewed edits.\n\u003ccode\u003eSAFE\u003c/code\u003e fixes are deterministic edits that can be selected together; \u003ccode\u003eREVIEW\u003c/code\u003e\nfixes need closer inspection; \u003ccode\u003eMANUAL\u003c/code\u003e diagnostics provide guidance without an\nautomatic edit. Markata never applies a fix until you review a preview and\nchoose to apply it. The server authorizes only the exact files, digests, and\nselections in that preview, and consumes that authorization after one apply\nattempt. The retired single-file preview/apply endpoints are not exposed; all\nsource mutation uses the grouped batch preview/apply contract.\u003c/p\u003e\n\u003cp\u003eEach source file is checked against the digest captured by the preview. If the\nfile changes before apply, Markata skips that file and reports it. In a mixed\nbatch, still-valid files may be applied while stale files remain untouched.\nMarkata requests one rebuild after applying any fixes. The build job then\nrefreshes the current diagnostics projection. The apply response means the\nrebuild was queued; the Problems view updates when that job completes.\nAmbiguous dates and duplicate frontmatter keys do not receive automatic safe\nedits.\u003c/p\u003e\n\u003ch2 id=\"terminal-controls\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTerminal controls\u003c/span\u003e \u003ca href=\"#terminal-controls\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eKey\u003c/th\u003e\n\u003cth\u003eAction\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ej\u003c/code\u003e / \u003ccode\u003ek\u003c/code\u003e, arrows\u003c/td\u003e\n\u003ctd\u003eMove selection or scroll\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eEnter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInspect selected job, page, or diagnostic\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eEsc\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReturn to the previous view\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003et\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTrigger a build\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003er\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRerun the selected job\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ew\u003c/code\u003e / \u003ccode\u003ee\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOpen warnings or errors\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003el\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOpen logs\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ep\u003c/code\u003e / \u003ccode\u003ef\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOpen pages or feeds\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eo\u003c/code\u003e / \u003ccode\u003ev\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOpen selected source or local preview\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ea\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOpen Admin in the browser when available\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSearch or filter the current view\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eg\u003c/code\u003e / \u003ccode\u003eG\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eJump to first or last item\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ePgUp\u003c/code\u003e / \u003ccode\u003ePgDn\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eScroll by a page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e?\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow help\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eq\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eQuit\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eWhen you scroll away from the live log tail, new lines do not move your view.\nThe dashboard shows a count of new lines until you return to the bottom.\nResize the terminal at any time; narrow windows use a single-column layout.\u003c/p\u003e\n\u003ch2 id=\"reading-diagnostics\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReading diagnostics\u003c/span\u003e \u003ca href=\"#reading-diagnostics\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA diagnostic has a stable code, source path and line when known, the job that\nfound it, and a suggested fix. The warnings and errors inboxes retain entries\nfor the session history. The Problems view uses current diagnostics from the\nlatest page inventory, newest completed job, and any running job; a successful\nrebuild removes resolved findings from that view. Their original job records remain available. Selecting\na page shows its current status and diagnostics; selecting a job shows the\ndiagnostics from that run. Some plugin messages do\nnot include a source location. Those remain in the job and session inbox so\nthey cannot disappear into log scrollback.\u003c/p\u003e\n",
      "content_text": "\n\nStart a local development session:\n\n```bash\nmarkata-go serve\n```\n\nIn a terminal, `serve` opens a dashboard showing server status, recent jobs,\nwarnings, errors, pages, and logs. The site remains at\n`http://localhost:8000`. File changes create rebuild jobs. Each job keeps its\nsteps and diagnostics, so a failed rebuild remains inspectable after the next\nsuccessful one.\n\nFor line-oriented output, use `markata-go serve --no-tui`. Markata also chooses\nline-oriented output when input or output is redirected, when `--no-input` is\nset, or when the terminal is unavailable. This mode works in scripts and CI.\nWhile the interactive dashboard is open, build and plugin messages appear in\nits Logs and Problems views. Serve keeps terminal ownership so rebuild output\ndoes not overwrite the dashboard, including while the terminal is resized.\n\n## Local web dashboard\n\n```bash\nmarkata-go serve --admin\n# Site:  http://localhost:8000/\n# Admin: http://localhost:8000/_markata/\n```\n\n`markata-go serve` enables this dashboard by default on a loopback listener.\n`markata-go serve --admin` remains supported. Use `--no-admin` to disable the\ndashboard. A non-loopback bind, such as `--bind 0.0.0.0`, leaves it disabled;\nrequesting `--admin` on such a bind fails. The dashboard URL appears in plain\nstartup output and as an Admin shortcut in the TUI.\n\n`markata-go admin` starts the same local serve session with the web dashboard\nand line-oriented terminal output. Both commands show the same jobs,\nwarnings, errors, and pages that the terminal dashboard sees. The local admin\ndashboard only binds to loopback. For remote, release-oriented operations use\nthe protected [Builder Admin deployment guide](/docs/guides/deployment/builder-admin/).\n\nThe web dashboard supports manual builds, job reruns, and rebuilding a selected\npage. Jobs keep logs and lifecycle steps. Page details show source diagnostics\nand suggested fixes when Markata has enough context. You can open a generated\npage from its page entry when it has a URL. The Feeds section uses the same\nfeed and post metadata as the build, and its post links open the matching page\ndetails.\n\n### Browser navigation and appearance\n\nThe browser URL records the current section, selected item, and filter in its\nfragment. You can copy a link to a job, problem, page, feed, or filtered log\nview. Browser Back and Forward restore earlier selections and sections.\n\n| Key | Action |\n| --- | --- |\n| `j` / `k`, arrows | Move through the current list |\n| `Enter` | Move focus to the selected item's details |\n| `Esc` | Clear the current selection or close keyboard help |\n| `/` | Focus the current section's filter |\n| `g` / `G` | Select the first or last item |\n| `w` / `e` | Show warnings or errors |\n| `p` / `f` / `l` | Open pages, feeds, or logs |\n| `r` | Rerun the selected completed job while Jobs is active |\n| `?` | Show keyboard help |\n\nShortcuts pause while a text field or editable element has focus. At narrow\nwindow widths, the list and details use a single-column layout with a fixed\nsection bar. Focus indicators remain visible for keyboard use.\n\nThe browser colors follow the configured Markata palette through semantic roles\nfor surfaces, text, links, focus, status, code, and buttons. The shared semantic\ntoken stylesheet is also used by Builder Admin, which keeps its separate\nproduction workflows and page structure. A shared browser shell is tracked in\n[#1300](https://github.com/WaylonWalker/markata-go/issues/1300); the local fix\npreview and source mutation actions remain available only in local Serve.\n\n## Review and apply fixes\n\nThe local Problems view can preview source fixes before applying them. Plans\nshow their category, safety class, source location, and before/after text.\nUse **Review all safe** to review every currently safe fix, a category button\nto review one group, or **Select** on individual problems followed by\n**Review selected**. The review dialog lists every proposed edit before you\napprove the batch. It shows a full-file diff for each source file using bundled\nassets, so review works without internet access. If rich rendering fails, the\ndialog shows a text diff of the same previewed edits.\n`SAFE` fixes are deterministic edits that can be selected together; `REVIEW`\nfixes need closer inspection; `MANUAL` diagnostics provide guidance without an\nautomatic edit. Markata never applies a fix until you review a preview and\nchoose to apply it. The server authorizes only the exact files, digests, and\nselections in that preview, and consumes that authorization after one apply\nattempt. The retired single-file preview/apply endpoints are not exposed; all\nsource mutation uses the grouped batch preview/apply contract.\n\nEach source file is checked against the digest captured by the preview. If the\nfile changes before apply, Markata skips that file and reports it. In a mixed\nbatch, still-valid files may be applied while stale files remain untouched.\nMarkata requests one rebuild after applying any fixes. The build job then\nrefreshes the current diagnostics projection. The apply response means the\nrebuild was queued; the Problems view updates when that job completes.\nAmbiguous dates and duplicate frontmatter keys do not receive automatic safe\nedits.\n\n## Terminal controls\n\n| Key | Action |\n| --- | --- |\n| `j` / `k`, arrows | Move selection or scroll |\n| `Enter` | Inspect selected job, page, or diagnostic |\n| `Esc` | Return to the previous view |\n| `t` | Trigger a build |\n| `r` | Rerun the selected job |\n| `w` / `e` | Open warnings or errors |\n| `l` | Open logs |\n| `p` / `f` | Open pages or feeds |\n| `o` / `v` | Open selected source or local preview |\n| `a` | Open Admin in the browser when available |\n| `/` | Search or filter the current view |\n| `g` / `G` | Jump to first or last item |\n| `PgUp` / `PgDn` | Scroll by a page |\n| `?` | Show help |\n| `q` | Quit |\n\nWhen you scroll away from the live log tail, new lines do not move your view.\nThe dashboard shows a count of new lines until you return to the bottom.\nResize the terminal at any time; narrow windows use a single-column layout.\n\n## Reading diagnostics\n\nA diagnostic has a stable code, source path and line when known, the job that\nfound it, and a suggested fix. The warnings and errors inboxes retain entries\nfor the session history. The Problems view uses current diagnostics from the\nlatest page inventory, newest completed job, and any running job; a successful\nrebuild removes resolved findings from that view. Their original job records remain available. Selecting\na page shows its current status and diagnostics; selecting a job shows the\ndiagnostics from that run. Some plugin messages do\nnot include a source location. Those remain in the job and session inbox so\nthey cannot disappear into log scrollback.\n",
      "summary": "Inspect live builds, warnings, pages, and logs in the terminal or local web dashboard",
      "date_published": "2026-09-26T00:00:00Z",
      "date_modified": "2026-09-26T00:00:00Z",
      "tags": [
        "documentation",
        "development",
        "cli"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/galleries/",
      "url": "https://markata.dev/docs/guides/galleries/",
      "title": "Photo Galleries",
      "content_html": "\u003cp\u003eCreate a gallery page with \u003ccode\u003etemplate: gallery.html\u003c/code\u003e and a list of images:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Field Notes\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Photographs from the garden.\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2026-09-26\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egallery\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egallery.html\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003egallery\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003esrc\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/images/flowers.webp\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ealt\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ePink flowers in afternoon light\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecaption\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eLate summer in the garden\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ewidth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1600\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eheight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1067\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003esrc\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/images/leaves.webp\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ealt\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eRain on broad green leaves\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ewidth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1200\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eheight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1800\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003eAn optional introduction can follow the frontmatter.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEach image needs \u003ccode\u003esrc\u003c/code\u003e and meaningful \u003ccode\u003ealt\u003c/code\u003e text. \u003ccode\u003ecaption\u003c/code\u003e is optional; when present, it appears below the thumbnail and in the full-screen viewer. Add the original image\u0026rsquo;s \u003ccode\u003ewidth\u003c/code\u003e and \u003ccode\u003eheight\u003c/code\u003e when you know them so the page reserves space while loading. Images without both fields still render. The page uses two columns on small screens, three on medium screens, and four on wide screens. Readers can open an image, use the centered icon buttons or arrow keys to move through the gallery, swipe horizontally on touch screens, and press Escape to close it. Image changes slide into view; the motion respects the device\u0026rsquo;s reduced-motion preference. The original image links work without JavaScript.\u003c/p\u003e\n\u003cp\u003eRelative image paths and trusted media hosts receive an 800-pixel-wide preview. Other image URLs are used as supplied. See \u003ca href=\"/docs/guides/templates/\"\u003etemplate media settings\u003c/a\u003e if your images live on another CDN.\u003c/p\u003e\n\u003ch2 id=\"photo-first-feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePhoto-first feeds\u003c/span\u003e \u003ca href=\"#photo-first-feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse the existing photo grid template for a feed of individual photo posts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;shots\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Shots\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == true and \u0026#39;shots\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eviews\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;simple\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;calendar\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;shorts\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshorts_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/shorts/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;feed-photo-grid.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSet each post\u0026rsquo;s \u003ccode\u003eimage\u003c/code\u003e or \u003ccode\u003ecover_image\u003c/code\u003e, plus a title and description. Add \u003ccode\u003ecard_classes: \u0026quot;col-span-2\u0026quot;\u003c/code\u003e to let a selected card span two columns. The grid shows a date and, for longer posts, a word count when those values are available. With the opt-in Shorts view, \u003ccode\u003e/shorts/\u003c/code\u003e presents every item in the same filtered and sorted feed as a full-screen image/video viewer. Swipe vertically, scroll, or use keyboard arrows; the URL hash tracks the stable post ID and can be shared. See \u003ca href=\"/docs/guides/feeds/\"\u003efeeds\u003c/a\u003e for filtering and pagination.\u003c/p\u003e\n\u003ch2 id=\"long-post-titles\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLong post titles\u003c/span\u003e \u003ca href=\"#long-post-titles\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePost pages now get a conservative starting size based on title length. The browser refines the fit after the active font loads and when the viewport changes. Titles remain visible and may wrap when the space beside the byline is narrow. This works with custom font packs and does not require site JavaScript.\u003c/p\u003e\n",
      "content_text": "\n\nCreate a gallery page with `template: gallery.html` and a list of images:\n\n```yaml\n---\ntitle: \"Field Notes\"\ndescription: \"Photographs from the garden.\"\ndate: 2026-09-26\npublished: true\nslug: gallery\ntemplate: gallery.html\ngallery:\n  - src: /images/flowers.webp\n    alt: Pink flowers in afternoon light\n    caption: Late summer in the garden\n    width: 1600\n    height: 1067\n  - src: /images/leaves.webp\n    alt: Rain on broad green leaves\n    width: 1200\n    height: 1800\n---\n\nAn optional introduction can follow the frontmatter.\n```\n\nEach image needs `src` and meaningful `alt` text. `caption` is optional; when present, it appears below the thumbnail and in the full-screen viewer. Add the original image's `width` and `height` when you know them so the page reserves space while loading. Images without both fields still render. The page uses two columns on small screens, three on medium screens, and four on wide screens. Readers can open an image, use the centered icon buttons or arrow keys to move through the gallery, swipe horizontally on touch screens, and press Escape to close it. Image changes slide into view; the motion respects the device's reduced-motion preference. The original image links work without JavaScript.\n\nRelative image paths and trusted media hosts receive an 800-pixel-wide preview. Other image URLs are used as supplied. See [template media settings](/docs/guides/templates/) if your images live on another CDN.\n\n## Photo-first feeds\n\nUse the existing photo grid template for a feed of individual photo posts:\n\n```toml\n[[markata-go.feeds]]\nslug = \"shots\"\ntitle = \"Shots\"\nfilter = \"published == true and 'shots' in tags\"\nsort = \"date\"\nreverse = true\nviews = [\"default\", \"simple\", \"calendar\", \"shorts\"]\nshorts_path = \"/shorts/\"\n\n[markata-go.feeds.templates]\nhtml = \"feed-photo-grid.html\"\n```\n\nSet each post's `image` or `cover_image`, plus a title and description. Add `card_classes: \"col-span-2\"` to let a selected card span two columns. The grid shows a date and, for longer posts, a word count when those values are available. With the opt-in Shorts view, `/shorts/` presents every item in the same filtered and sorted feed as a full-screen image/video viewer. Swipe vertically, scroll, or use keyboard arrows; the URL hash tracks the stable post ID and can be shared. See [feeds](/docs/guides/feeds/) for filtering and pagination.\n\n## Long post titles\n\nPost pages now get a conservative starting size based on title length. The browser refines the fit after the active font loads and when the viewport changes. Titles remain visible and may wrap when the space beside the byline is narrow. This works with custom font packs and does not require site JavaScript.\n",
      "summary": "Create a gallery page and a photo-first feed with the default theme.",
      "date_published": "2026-09-26T00:00:00Z",
      "date_modified": "2026-09-26T00:00:00Z",
      "tags": [
        "documentation",
        "galleries"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/image-library/",
      "url": "https://markata.dev/docs/guides/image-library/",
      "title": "Image Library",
      "content_html": "\u003cp\u003emarkata-go can generate an image inventory and a page for finding images used\nby your site. The default output is:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/images/\u003c/code\u003e — a responsive, searchable image library\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/images/index.json\u003c/code\u003e — a versioned machine-readable inventory\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/images.json\u003c/code\u003e — the same inventory at the site root for other tools\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe plugin runs by default. It reads public posts and, when\n\u003ccode\u003einclude_unreferenced\u003c/code\u003e is enabled, the configured static asset directory. It\ndoes not fetch remote images or videos.\u003c/p\u003e\n\u003ch2 id=\"configure-the-output\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfigure the output\u003c/span\u003e \u003ca href=\"#configure-the-output\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd an \u003ccode\u003eimages\u003c/code\u003e table under \u003ccode\u003e[markata-go]\u003c/code\u003e when you need to change the\ndefaults:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eimages\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epath\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;images\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;images.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexport_json\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_unreferenced\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate the image library page and inventory.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epath\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;images\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRelative output directory below \u003ccode\u003eoutput_dir\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etemplate\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;images.html\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTemplate used for the HTML page.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexport_json\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWrite \u003ccode\u003epath/index.json\u003c/code\u003e and \u003ccode\u003e/images.json\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einclude_unreferenced\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInclude image and video files found in \u003ccode\u003eassets_dir\u003c/code\u003e even when no public post uses them. Set \u003ccode\u003etrue\u003c/code\u003e explicitly for a local authoring inventory because it makes all supported asset files enumerable.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe output path must stay inside \u003ccode\u003eoutput_dir\u003c/code\u003e. The same options work in YAML\nand JSON configuration files. Environment overrides use these names:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMARKATA_GO_IMAGES_ENABLED\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMARKATA_GO_IMAGES_PATH\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMARKATA_GO_IMAGES_TEMPLATE\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMARKATA_GO_IMAGES_EXPORT_JSON\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMARKATA_GO_IMAGES_INCLUDE_UNREFERENCED\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"find-and-copy-an-image\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFind and copy an image\u003c/span\u003e \u003ca href=\"#find-and-copy-an-image\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe library searches image filenames, paths, alt text, figure captions, and\npublic post titles. Use the \u003ccode\u003eAll\u003c/code\u003e, \u003ccode\u003eUsed\u003c/code\u003e, \u003ccode\u003eUnused\u003c/code\u003e, \u003ccode\u003eCover\u003c/code\u003e, and \u003ccode\u003eRecently added\u003c/code\u003e views, or choose a sort order from the toolbar.\u003c/p\u003e\n\u003cp\u003eEach card includes \u003cstrong\u003eCopy Markdown\u003c/strong\u003e and \u003cstrong\u003eCopy URL\u003c/strong\u003e actions. Both actions use\nthe canonical \u003ccode\u003esrc\u003c/code\u003e value from the inventory. For example:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eWorkshop\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://dropper.wayl.one/file/workshop.webp\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTrusted Dropper URLs may use resized URLs for previews. Those presentation URLs\nnever replace the canonical URL in the JSON artifact or copied Markdown.\u003c/p\u003e\n\u003ch2 id=\"image-discovery\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eImage discovery\u003c/span\u003e \u003ca href=\"#image-discovery\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe inventory includes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMarkdown image syntax, supported raw HTML \u003ccode\u003e\u0026lt;img\u0026gt;\u003c/code\u003e elements, and referenced\n\u003ccode\u003e\u0026lt;video\u0026gt;\u003c/code\u003e/\u003ccode\u003e\u0026lt;source\u0026gt;\u003c/code\u003e elements\u003c/li\u003e\n\u003cli\u003enormalized visible text from associated Markdown or HTML \u003ccode\u003e\u0026lt;figcaption\u0026gt;\u003c/code\u003e\nelements, including captions shared by multiple media elements in one figure\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eimage\u003c/code\u003e, \u003ccode\u003evideo\u003c/code\u003e, \u003ccode\u003ecover\u003c/code\u003e, \u003ccode\u003ecover_image\u003c/code\u003e, \u003ccode\u003eog_image\u003c/code\u003e, \u003ccode\u003esocial_image\u003c/code\u003e, \u003ccode\u003ethumbnail\u003c/code\u003e,\n\u003ccode\u003efeatured_image\u003c/code\u003e, \u003ccode\u003ehero_image\u003c/code\u003e, \u003ccode\u003eavatar\u003c/code\u003e, and \u003ccode\u003eauthor_image\u003c/code\u003e frontmatter\u003c/li\u003e\n\u003cli\u003eImage and video files below \u003ccode\u003eassets_dir\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe \u003ccode\u003eimage\u003c/code\u003e frontmatter field is a cover fallback. If \u003ccode\u003ecover\u003c/code\u003e or \u003ccode\u003ecover_image\u003c/code\u003e\nhas a non-empty value, that field remains the first cover choice. Video URLs\nare kept as video media with their video MIME type. The library renders them\nwith a \u003ccode\u003e\u0026lt;video\u0026gt;\u003c/code\u003e element and uses an explicit poster field or the same derived\nposter convention used by feed and video cards.\u003c/p\u003e\n\u003cp\u003eImages supplied by an external \u003ccode\u003e![embed](...)\u003c/code\u003e card are still inventoried, but\nthey are marked with an \u003cstrong\u003eEmbed\u003c/strong\u003e label. This distinguishes a remote OG image\nfrom an image authored directly in a post.\u003c/p\u003e\n\u003cp\u003eSkipped, draft, private, and unpublished posts do not create public usage\nrelationships. Local files are mapped from the asset root to site-root URLs;\nfor example, \u003ccode\u003estatic/images/logo.png\u003c/code\u003e becomes \u003ccode\u003e/images/logo.png\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003ePrivate body isolation is strict: the image library never scans private\nMarkdown, rendered HTML, captions, alt text, or remote URLs. Changing only a\nprivate body produces identical public image-library output. A private post may\nopt its public-safe \u003ccode\u003ecover\u003c/code\u003e frontmatter into the inventory, with \u003ccode\u003ecover_alt\u003c/code\u003e as\nits only allowed alt field. This creates metadata only: it never creates a\n\u003ccode\u003euses[]\u003c/code\u003e relationship or contributes \u003ccode\u003eadded_at\u003c/code\u003e/\u003ccode\u003elast_used_at\u003c/code\u003e. Other private\nimage fields are ignored. Private frontmatter is not presumed public; consumers\nmay use only explicitly documented public-safe fields. Keep private media\noutside \u003ccode\u003eassets_dir\u003c/code\u003e when it must not be published by the static asset writer.\u003c/p\u003e\n\u003cp\u003eLocal canonical URLs escape path components while preserving \u003ccode\u003e/\u003c/code\u003e. For example,\n\u003ccode\u003emy photo#1%.png\u003c/code\u003e becomes \u003ccode\u003e/my%20photo%231%25.png\u003c/code\u003e; authored percent-encoded\nreferences deduplicate to that same record. Remote query strings are preserved\nfor signed URLs, but URLs with \u003ccode\u003euser:password@host\u003c/code\u003e credentials are rejected.\nReferenced local media is resolved and hashed when it is below \u003ccode\u003eassets_dir\u003c/code\u003e,\nincluding an absolute \u003ccode\u003eassets_dir\u003c/code\u003e outside \u003ccode\u003econtent_dir\u003c/code\u003e. Other local files are\neligible when they are below \u003ccode\u003econtent_dir\u003c/code\u003e; files outside both roots are ignored.\nPlatform-native filesystem paths are supported, including Windows drive-letter\npaths.\u003c/p\u003e\n\u003cp\u003eThe public \u003ccode\u003euses[]\u003c/code\u003e entries contain the public \u003ccode\u003ehref\u003c/code\u003e, title, caption, and\nflags. They do not contain repository-relative source paths.\u003c/p\u003e\n\u003cp\u003eThe versioned v1 reader requires the documented top-level fields and the stable\nper-image fields (\u003ccode\u003esrc\u003c/code\u003e, \u003ccode\u003ewidth\u003c/code\u003e, \u003ccode\u003eheight\u003c/code\u003e, \u003ccode\u003ealt\u003c/code\u003e, \u003ccode\u003emime_type\u003c/code\u003e, \u003ccode\u003ecover\u003c/code\u003e, and\n\u003ccode\u003euses\u003c/code\u003e). Each usage requires \u003ccode\u003ehref\u003c/code\u003e and \u003ccode\u003ecover\u003c/code\u003e. Unknown fields are ignored so\nnewer producers can add metadata without breaking readers.\u003c/p\u003e\n\u003cp\u003eThe JSON artifact is deterministic. Images are sorted by source URL and usage\nlinks are sorted by public href. Repository-relative source paths are not\nincluded in public usage records. A missing local dimension is\nreported as \u003ccode\u003e0\u003c/code\u003e. Local PNG, JPEG, GIF, WebP, BMP, and TIFF files report their\ndimensions when the file metadata is valid. SVG files use positive \u003ccode\u003ewidth\u003c/code\u003e and\n\u003ccode\u003eheight\u003c/code\u003e values or a positive \u003ccode\u003eviewBox\u003c/code\u003e; ICO files use their largest directory\nentry. AVIF and HEIC/HEIF records are supported, but their dimensions remain\n\u003ccode\u003e0\u003c/code\u003e until a decoder is available. Malformed or unsupported media does not fail\nthe build.\u003c/p\u003e\n\u003cp\u003eEach used image includes \u003ccode\u003eadded_at\u003c/code\u003e when a public post has a valid publication\ndate; it is the earliest such date in UTC. \u003ccode\u003elast_used_at\u003c/code\u003e is the latest public\npublication date in UTC. These dates come from post frontmatter, not local file\ntimestamps, so remote media and local media use the same rules. Missing values\nsort last. The \u003ccode\u003eRecently added\u003c/code\u003e view shows sources with a positive \u003ccode\u003eadded_at\u003c/code\u003e\ntimestamp from the last 30 days according to the browser clock.\nEach usage relationship can also include its figure caption. Captions stay with\nthe usage relationship because one media source can have different captions in\ndifferent posts.\u003c/p\u003e\n\u003cp\u003eThe image library keeps a small media fingerprint cache for incremental builds.\nWhen a local file\u0026rsquo;s path, size, and modification time are unchanged, markata-go\nreuses its content fingerprint without reopening the file. On filesystems that\nexpose an operating-system change time, that signal also detects replacements\nthat preserve size and modification time. Filesystems without that signal must\nkeep modification times reliable for this optimization; a changed, added,\nremoved, or renamed media file with changed cache state invalidates the\ngenerated inventory.\u003c/p\u003e\n\u003cp\u003eThe writer checks for collisions with posts, feeds, and static files before it\nwrites. It does not overwrite an existing site file. When you disable the\nlibrary or change its path, cleanup removes only files previously recorded as\nimage-library outputs whose contents are unchanged. A modified or unowned\nstale JSON file is preserved and reported as a collision. Output paths that\ntraverse symlinks below the configured output root are rejected for safety.\nPlatform-managed ancestors above that root are allowed.\u003c/p\u003e\n\u003ch2 id=\"custom-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom templates\u003c/span\u003e \u003ca href=\"#custom-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCopy \u003ccode\u003eimages.html\u003c/code\u003e into your site\u0026rsquo;s \u003ccode\u003etemplates/\u003c/code\u003e directory to customize the\npage. The template receives:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eimage_library\u003c/code\u003e — page counts and presentation-ready image cards\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eimage_index\u003c/code\u003e — the canonical \u003ccode\u003eimageindex.Index\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eimage_library_config\u003c/code\u003e — the resolved image configuration\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eImage cards expose \u003ccode\u003eIsVideo\u003c/code\u003e, \u003ccode\u003ePosterSrc\u003c/code\u003e, \u003ccode\u003eEmbed\u003c/code\u003e, \u003ccode\u003eAddedAt\u003c/code\u003e, \u003ccode\u003eAddedAtUnix\u003c/code\u003e,\n\u003ccode\u003eLastUsedAt\u003c/code\u003e, and \u003ccode\u003eLastUsedAtUnix\u003c/code\u003e in addition to the regular image fields.\n\u003ccode\u003eAddedAt\u003c/code\u003e is the earliest valid public post date for the source. Each item in\n\u003ccode\u003eUses\u003c/code\u003e can also expose \u003ccode\u003eCaption\u003c/code\u003e when the media appears inside a figure. Custom\ntemplates should render \u003ccode\u003eIsVideo\u003c/code\u003e cards with a \u003ccode\u003e\u0026lt;video\u0026gt;\u003c/code\u003e and \u003ccode\u003e\u0026lt;source\u0026gt;\u003c/code\u003e rather\nthan an \u003ccode\u003e\u0026lt;img\u0026gt;\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThe bundled page keeps video URLs out of active \u003ccode\u003esrc\u003c/code\u003e and \u003ccode\u003e\u0026lt;source src\u0026gt;\u003c/code\u003e\nattributes in the initial HTML while keeping the poster active as the card\u0026rsquo;s\nthumbnail. Its JavaScript loads each video when its card enters the viewport,\nso an image-library page with many videos does not fetch every video at once.\nWithout JavaScript, the card still links to the canonical media URL.\u003c/p\u003e\n\u003cp\u003eThe server-rendered page remains useful when JavaScript is unavailable. The\nbundled JavaScript only enhances filtering, sorting, usage expansion, copy\nfeedback, and video loading.\u003c/p\u003e\n\u003cp\u003eSee the \u003ca href=\"/docs/guides/configuration/\"\u003econfiguration reference\u003c/a\u003e and \u003ca href=\"/docs/reference/plugins/\"\u003ebuilt-in\nplugin reference\u003c/a\u003e for related settings.\u003c/p\u003e\n\u003ch2 id=\"optional-server-side-pagination\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOptional server-side pagination\u003c/span\u003e \u003ca href=\"#optional-server-side-pagination\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor large libraries, avoid sending every image card on the initial request:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eimages\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epage_size\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e48\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWith this opt-in setting, \u003ccode\u003e/images/\u003c/code\u003e renders up to 48 cards and emits native\n\u003ccode\u003e/images/page/2/\u003c/code\u003e, \u003ccode\u003e/images/page/3/\u003c/code\u003e, etc. links. The JSON inventory still\ncontains all public media; no published media relationships are lost. The\npage links work without JavaScript. Global search, filters, and sort are still\navailable with JavaScript: on the first interaction the browser retrieves the\nother \u003cem\u003estatic HTML\u003c/em\u003e pages and searches across the complete collection, instead\nof loading all their DOM nodes during first paint. Until that interaction, the\ninitial page stays light and usable. If another page fails to load, the links\nremain available for ordinary browsing.\u003c/p\u003e\n\u003cp\u003eA setting of \u003ccode\u003epage_size = 0\u003c/code\u003e (default) preserves the existing single-page\nlibrary. Sites with a custom \u003ccode\u003eimages.html\u003c/code\u003e should update their template\nto honor \u003ccode\u003eimage_library.PageLinks\u003c/code\u003e before enabling pagination.\u003c/p\u003e\n",
      "content_text": "\n\nmarkata-go can generate an image inventory and a page for finding images used\nby your site. The default output is:\n\n- `/images/` — a responsive, searchable image library\n- `/images/index.json` — a versioned machine-readable inventory\n- `/images.json` — the same inventory at the site root for other tools\n\nThe plugin runs by default. It reads public posts and, when\n`include_unreferenced` is enabled, the configured static asset directory. It\ndoes not fetch remote images or videos.\n\n## Configure the output\n\nAdd an `images` table under `[markata-go]` when you need to change the\ndefaults:\n\n```toml\n[markata-go.images]\nenabled = true\npath = \"images\"\ntemplate = \"images.html\"\nexport_json = true\ninclude_unreferenced = false\n```\n\n| Option | Default | Description |\n|---|---|---|\n| `enabled` | `true` | Generate the image library page and inventory. |\n| `path` | `\"images\"` | Relative output directory below `output_dir`. |\n| `template` | `\"images.html\"` | Template used for the HTML page. |\n| `export_json` | `true` | Write `path/index.json` and `/images.json`. |\n| `include_unreferenced` | `false` | Include image and video files found in `assets_dir` even when no public post uses them. Set `true` explicitly for a local authoring inventory because it makes all supported asset files enumerable. |\n\nThe output path must stay inside `output_dir`. The same options work in YAML\nand JSON configuration files. Environment overrides use these names:\n\n```text\nMARKATA_GO_IMAGES_ENABLED\nMARKATA_GO_IMAGES_PATH\nMARKATA_GO_IMAGES_TEMPLATE\nMARKATA_GO_IMAGES_EXPORT_JSON\nMARKATA_GO_IMAGES_INCLUDE_UNREFERENCED\n```\n\n## Find and copy an image\n\nThe library searches image filenames, paths, alt text, figure captions, and\npublic post titles. Use the `All`, `Used`, `Unused`, `Cover`, and `Recently\nadded` views, or choose a sort order from the toolbar.\n\nEach card includes **Copy Markdown** and **Copy URL** actions. Both actions use\nthe canonical `src` value from the inventory. For example:\n\n```markdown\n![Workshop](https://dropper.wayl.one/file/workshop.webp)\n```\n\nTrusted Dropper URLs may use resized URLs for previews. Those presentation URLs\nnever replace the canonical URL in the JSON artifact or copied Markdown.\n\n## Image discovery\n\nThe inventory includes:\n\n- Markdown image syntax, supported raw HTML `\u003cimg\u003e` elements, and referenced\n  `\u003cvideo\u003e`/`\u003csource\u003e` elements\n- normalized visible text from associated Markdown or HTML `\u003cfigcaption\u003e`\n  elements, including captions shared by multiple media elements in one figure\n- `image`, `video`, `cover`, `cover_image`, `og_image`, `social_image`, `thumbnail`,\n  `featured_image`, `hero_image`, `avatar`, and `author_image` frontmatter\n- Image and video files below `assets_dir`\n\nThe `image` frontmatter field is a cover fallback. If `cover` or `cover_image`\nhas a non-empty value, that field remains the first cover choice. Video URLs\nare kept as video media with their video MIME type. The library renders them\nwith a `\u003cvideo\u003e` element and uses an explicit poster field or the same derived\nposter convention used by feed and video cards.\n\nImages supplied by an external `![embed](...)` card are still inventoried, but\nthey are marked with an **Embed** label. This distinguishes a remote OG image\nfrom an image authored directly in a post.\n\nSkipped, draft, private, and unpublished posts do not create public usage\nrelationships. Local files are mapped from the asset root to site-root URLs;\nfor example, `static/images/logo.png` becomes `/images/logo.png`.\n\nPrivate body isolation is strict: the image library never scans private\nMarkdown, rendered HTML, captions, alt text, or remote URLs. Changing only a\nprivate body produces identical public image-library output. A private post may\nopt its public-safe `cover` frontmatter into the inventory, with `cover_alt` as\nits only allowed alt field. This creates metadata only: it never creates a\n`uses[]` relationship or contributes `added_at`/`last_used_at`. Other private\nimage fields are ignored. Private frontmatter is not presumed public; consumers\nmay use only explicitly documented public-safe fields. Keep private media\noutside `assets_dir` when it must not be published by the static asset writer.\n\nLocal canonical URLs escape path components while preserving `/`. For example,\n`my photo#1%.png` becomes `/my%20photo%231%25.png`; authored percent-encoded\nreferences deduplicate to that same record. Remote query strings are preserved\nfor signed URLs, but URLs with `user:password@host` credentials are rejected.\nReferenced local media is resolved and hashed when it is below `assets_dir`,\nincluding an absolute `assets_dir` outside `content_dir`. Other local files are\neligible when they are below `content_dir`; files outside both roots are ignored.\nPlatform-native filesystem paths are supported, including Windows drive-letter\npaths.\n\nThe public `uses[]` entries contain the public `href`, title, caption, and\nflags. They do not contain repository-relative source paths.\n\nThe versioned v1 reader requires the documented top-level fields and the stable\nper-image fields (`src`, `width`, `height`, `alt`, `mime_type`, `cover`, and\n`uses`). Each usage requires `href` and `cover`. Unknown fields are ignored so\nnewer producers can add metadata without breaking readers.\n\nThe JSON artifact is deterministic. Images are sorted by source URL and usage\nlinks are sorted by public href. Repository-relative source paths are not\nincluded in public usage records. A missing local dimension is\nreported as `0`. Local PNG, JPEG, GIF, WebP, BMP, and TIFF files report their\ndimensions when the file metadata is valid. SVG files use positive `width` and\n`height` values or a positive `viewBox`; ICO files use their largest directory\nentry. AVIF and HEIC/HEIF records are supported, but their dimensions remain\n`0` until a decoder is available. Malformed or unsupported media does not fail\nthe build.\n\nEach used image includes `added_at` when a public post has a valid publication\ndate; it is the earliest such date in UTC. `last_used_at` is the latest public\npublication date in UTC. These dates come from post frontmatter, not local file\ntimestamps, so remote media and local media use the same rules. Missing values\nsort last. The `Recently added` view shows sources with a positive `added_at`\ntimestamp from the last 30 days according to the browser clock.\nEach usage relationship can also include its figure caption. Captions stay with\nthe usage relationship because one media source can have different captions in\ndifferent posts.\n\nThe image library keeps a small media fingerprint cache for incremental builds.\nWhen a local file's path, size, and modification time are unchanged, markata-go\nreuses its content fingerprint without reopening the file. On filesystems that\nexpose an operating-system change time, that signal also detects replacements\nthat preserve size and modification time. Filesystems without that signal must\nkeep modification times reliable for this optimization; a changed, added,\nremoved, or renamed media file with changed cache state invalidates the\ngenerated inventory.\n\nThe writer checks for collisions with posts, feeds, and static files before it\nwrites. It does not overwrite an existing site file. When you disable the\nlibrary or change its path, cleanup removes only files previously recorded as\nimage-library outputs whose contents are unchanged. A modified or unowned\nstale JSON file is preserved and reported as a collision. Output paths that\ntraverse symlinks below the configured output root are rejected for safety.\nPlatform-managed ancestors above that root are allowed.\n\n## Custom templates\n\nCopy `images.html` into your site's `templates/` directory to customize the\npage. The template receives:\n\n- `image_library` — page counts and presentation-ready image cards\n- `image_index` — the canonical `imageindex.Index`\n- `image_library_config` — the resolved image configuration\n\nImage cards expose `IsVideo`, `PosterSrc`, `Embed`, `AddedAt`, `AddedAtUnix`,\n`LastUsedAt`, and `LastUsedAtUnix` in addition to the regular image fields.\n`AddedAt` is the earliest valid public post date for the source. Each item in\n`Uses` can also expose `Caption` when the media appears inside a figure. Custom\ntemplates should render `IsVideo` cards with a `\u003cvideo\u003e` and `\u003csource\u003e` rather\nthan an `\u003cimg\u003e`.\n\nThe bundled page keeps video URLs out of active `src` and `\u003csource src\u003e`\nattributes in the initial HTML while keeping the poster active as the card's\nthumbnail. Its JavaScript loads each video when its card enters the viewport,\nso an image-library page with many videos does not fetch every video at once.\nWithout JavaScript, the card still links to the canonical media URL.\n\nThe server-rendered page remains useful when JavaScript is unavailable. The\nbundled JavaScript only enhances filtering, sorting, usage expansion, copy\nfeedback, and video loading.\n\nSee the [configuration reference](/docs/guides/configuration/) and [built-in\nplugin reference](/docs/reference/plugins/) for related settings.\n\n\n## Optional server-side pagination\n\nFor large libraries, avoid sending every image card on the initial request:\n\n```toml\n[markata-go.images]\npage_size = 48\n```\n\nWith this opt-in setting, `/images/` renders up to 48 cards and emits native\n`/images/page/2/`, `/images/page/3/`, etc. links. The JSON inventory still\ncontains all public media; no published media relationships are lost. The\npage links work without JavaScript. Global search, filters, and sort are still\navailable with JavaScript: on the first interaction the browser retrieves the\nother *static HTML* pages and searches across the complete collection, instead\nof loading all their DOM nodes during first paint. Until that interaction, the\ninitial page stays light and usable. If another page fails to load, the links\nremain available for ordinary browsing.\n\nA setting of `page_size = 0` (default) preserves the existing single-page\nlibrary. Sites with a custom `images.html` should update their template\nto honor `image_library.PageLinks` before enabling pagination.\n",
      "summary": "Build a searchable image inventory and authoring page with markata-go",
      "date_published": "2026-09-13T00:00:00Z",
      "date_modified": "2026-09-13T00:00:00Z",
      "tags": [
        "images",
        "configuration",
        "authoring"
      ]
    },
    {
      "id": "https://markata.dev/docs/plans/2026-09-10-content-diagnostics-design/",
      "url": "https://markata.dev/docs/plans/2026-09-10-content-diagnostics-design/",
      "title": "Content Diagnostics Ledger Design",
      "content_html": "\u003ch2 id=\"decision\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDecision\u003c/span\u003e \u003ca href=\"#decision\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse one manager-owned \u003ccode\u003ediagnostics.ContentLedger\u003c/code\u003e. The ledger stores per-source\nstate and derives the build summary from those entries. The manager already\nowns discovered files, posts, feeds, stage execution, and reset behavior, so it\nis the smallest place that can connect all lifecycle boundaries without a new\nparallel content inventory.\u003c/p\u003e\n\u003cp\u003eThe existing \u003ccode\u003ediagnostics.Issue\u003c/code\u003e remains the shared issue shape for source\npositions and severities. Frontmatter analysis lives beside those checks and\nis reused by the loader. The loader continues to be strict for direct parser\ncallers, but a content parse failure is recorded for that candidate and does\nnot prevent valid sibling files from reaching later stages.\u003c/p\u003e\n\u003ch2 id=\"state-model\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eState Model\u003c/span\u003e \u003ca href=\"#state-model\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEach discovered path records candidate status, source load status,\nfrontmatter presence and validity, post creation, public eligibility, render,\nemission, diagnostics, reasons, and feed-level selection. Final disposition is\nderived from those fields as \u003ccode\u003eemitted\u003c/code\u003e, \u003ccode\u003eshadow\u003c/code\u003e, \u003ccode\u003eexcluded\u003c/code\u003e, or\n\u003ccode\u003enot_candidate\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThe snapshot sorts paths, reasons, feed names, and diagnostics. Ledger mutation\nis synchronized because rendering and writing use worker pools. Duplicate\nissues are ignored by their stable source/code/message identity.\u003c/p\u003e\n\u003ch2 id=\"frontmatter-policy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFrontmatter Policy\u003c/span\u003e \u003ca href=\"#frontmatter-policy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe parser recognizes an exact first-line \u003ccode\u003e---\u003c/code\u003e, after an optional UTF-8 BOM.\nA longer hyphen run, such as \u003ccode\u003e----\u003c/code\u003e or \u003ccode\u003e-----\u003c/code\u003e, is only called suspicious when\nthe following lines look like a YAML metadata block and an exact closing\ndelimiter exists. This avoids warnings for ordinary Markdown horizontal rules.\nLeading whitespace before a frontmatter-like opening is diagnosed but is not\nsilently normalized. Missing and malformed closing delimiters are diagnosed.\nNo-frontmatter Markdown remains valid and quiet.\u003c/p\u003e\n\u003ch2 id=\"reporting-and-testing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReporting and Testing\u003c/span\u003e \u003ca href=\"#reporting-and-testing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBuild summaries show counts for discovery, candidates, loading, valid\nfrontmatter, posts, eligibility, rendering, emission, exclusion, warnings, and\nerrors. Normal warnings include a relative path and line. \u003ccode\u003ebuild -v\u003c/code\u003e explains\neach excluded or shadow source and its reasons. The existing benchmark JSON\nsurface carries the sanitized ledger snapshot for later consumers.\u003c/p\u003e\n\u003cp\u003eThe regression suite uses temporary real sites and runs the actual glob, load,\nrender, feed, and write plugins. It covers valid frontmatter, no frontmatter,\nthe production \u003ccode\u003e----\u003c/code\u003e case, \u003ccode\u003e-----\u003c/code\u003e, malformed and missing closing delimiters,\nleading whitespace, BOM, invalid YAML, duplicate keys, invalid metadata types,\ninvalid dates, empty frontmatter, and ordinary Markdown controls.\u003c/p\u003e\n",
      "content_text": "\n\n## Decision\n\nUse one manager-owned `diagnostics.ContentLedger`. The ledger stores per-source\nstate and derives the build summary from those entries. The manager already\nowns discovered files, posts, feeds, stage execution, and reset behavior, so it\nis the smallest place that can connect all lifecycle boundaries without a new\nparallel content inventory.\n\nThe existing `diagnostics.Issue` remains the shared issue shape for source\npositions and severities. Frontmatter analysis lives beside those checks and\nis reused by the loader. The loader continues to be strict for direct parser\ncallers, but a content parse failure is recorded for that candidate and does\nnot prevent valid sibling files from reaching later stages.\n\n## State Model\n\nEach discovered path records candidate status, source load status,\nfrontmatter presence and validity, post creation, public eligibility, render,\nemission, diagnostics, reasons, and feed-level selection. Final disposition is\nderived from those fields as `emitted`, `shadow`, `excluded`, or\n`not_candidate`.\n\nThe snapshot sorts paths, reasons, feed names, and diagnostics. Ledger mutation\nis synchronized because rendering and writing use worker pools. Duplicate\nissues are ignored by their stable source/code/message identity.\n\n## Frontmatter Policy\n\nThe parser recognizes an exact first-line `---`, after an optional UTF-8 BOM.\nA longer hyphen run, such as `----` or `-----`, is only called suspicious when\nthe following lines look like a YAML metadata block and an exact closing\ndelimiter exists. This avoids warnings for ordinary Markdown horizontal rules.\nLeading whitespace before a frontmatter-like opening is diagnosed but is not\nsilently normalized. Missing and malformed closing delimiters are diagnosed.\nNo-frontmatter Markdown remains valid and quiet.\n\n## Reporting and Testing\n\nBuild summaries show counts for discovery, candidates, loading, valid\nfrontmatter, posts, eligibility, rendering, emission, exclusion, warnings, and\nerrors. Normal warnings include a relative path and line. `build -v` explains\neach excluded or shadow source and its reasons. The existing benchmark JSON\nsurface carries the sanitized ledger snapshot for later consumers.\n\nThe regression suite uses temporary real sites and runs the actual glob, load,\nrender, feed, and write plugins. It covers valid frontmatter, no frontmatter,\nthe production `----` case, `-----`, malformed and missing closing delimiters,\nleading whitespace, BOM, invalid YAML, duplicate keys, invalid metadata types,\ninvalid dates, empty frontmatter, and ordinary Markdown controls.\n",
      "summary": "Design for deterministic content dispositions and frontmatter diagnostics",
      "date_published": "2026-09-10T00:00:00Z",
      "date_modified": "2026-09-10T00:00:00Z",
      "tags": [
        "development",
        "diagnostics",
        "content"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/content-diagnostics/",
      "url": "https://markata.dev/docs/guides/content-diagnostics/",
      "title": "Content Diagnostics",
      "content_html": "\u003cp\u003eAfter a successful full build completes, markata-go writes a\nsanitized diagnostics artifact below the configured output directory:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;output_dir\u0026gt;/.markata/diagnostics.json\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor example, a build with \u003ccode\u003e-o dist\u003c/code\u003e writes \u003ccode\u003edist/.markata/diagnostics.json\u003c/code\u003e.\nThe artifact is enabled by default. It is part of the generated output, so a\nBuilder Admin release from such a build carries it with the rest of the site.\u003c/p\u003e\n\u003ch2 id=\"inspect-the-artifact\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInspect the artifact\u003c/span\u003e \u003ca href=\"#inspect-the-artifact\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse a JSON viewer such as \u003ccode\u003ejq\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejq . public/.markata/diagnostics.json\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejq \u003cspan class=\"s1\"\u003e\u0026#39;.executor\u0026#39;\u003c/span\u003e public/.markata/diagnostics.json\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejq \u003cspan class=\"s1\"\u003e\u0026#39;.summary\u0026#39;\u003c/span\u003e public/.markata/diagnostics.json\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejq \u003cspan class=\"s1\"\u003e\u0026#39;.entries[] | select(.disposition == \u0026#34;excluded\u0026#34;)\u0026#39;\u003c/span\u003e public/.markata/diagnostics.json\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eReplace \u003ccode\u003epublic\u003c/code\u003e with the output directory used by the build. There is no\nseparate diagnostics command or generated public HTML page.\u003c/p\u003e\n\u003ch2 id=\"stable-fields-and-reason-codes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStable fields and reason codes\u003c/span\u003e \u003ca href=\"#stable-fields-and-reason-codes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe top-level \u003ccode\u003eschema\u003c/code\u003e, \u003ccode\u003eschema_version\u003c/code\u003e, \u003ccode\u003egenerator\u003c/code\u003e, \u003ccode\u003ebuilt_at\u003c/code\u003e, \u003ccode\u003eexecutor\u003c/code\u003e,\n\u003ccode\u003esummary\u003c/code\u003e, and \u003ccode\u003eentries\u003c/code\u003e fields are stable parts of the versioned format.\nConsumers must check both \u003ccode\u003eschema\u003c/code\u003e and \u003ccode\u003eschema_version\u003c/code\u003e before interpreting the\ndocument.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eexecutor\u003c/code\u003e records the build engine that produced the artifact. Normal builds\nreport \u003ccode\u003elegacy\u003c/code\u003e; builds explicitly using the feature-flagged DAG executor report\n\u003ccode\u003edag\u003c/code\u003e. The same identity is included in \u003ccode\u003emarkata-go build --benchmark-json\u003c/code\u003e\noutput, which makes local benchmark reports and Builder Admin release artifacts\nunambiguous without parsing human-readable logs.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003esummary\u003c/code\u003e contains counts for discovered files, candidates, loaded sources,\nvalid frontmatter, posts, eligible posts, rendered posts, emitted outputs,\nexcluded candidates, warnings, and errors. Each entry includes a relative\nsource \u003ccode\u003epath\u003c/code\u003e, lifecycle state booleans, a final \u003ccode\u003edisposition\u003c/code\u003e, sorted \u003ccode\u003ereasons\u003c/code\u003e,\ndiagnostics, and feed-level dispositions.\u003c/p\u003e\n\u003cp\u003eFeed dispositions are complete: feeds that did not include a source remain in\nthe artifact with their exclusion reasons. On large sites this can make the\nJSON file substantial. Full builds stream one sanitized entry at a time instead\nof constructing full-artifact serializer buffers, reducing temporary memory\nwithout dropping observations or changing the indented JSON format. The\nimmutable ledger snapshot and final file still contain the complete diagnostics;\nthere is no additional configuration to enable this behavior.\nSnapshot construction copies feed reasons into one owned arena per entry, with\neach feed\u0026rsquo;s slice capacity clamped even after deduplication. Appending or mutating\none feed cannot change sibling feeds, the ledger, or another snapshot. Every\nsnapshot remains a fresh copy; counts, ordering and empty-value semantics are\nunchanged. Fewer small allocations do not imply a reduction in whole-build RSS.\u003c/p\u003e\n\u003cp\u003eReason codes are stable identifiers. Messages can change without changing a\ncode. The current codes cover:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003efrontmatter: \u003ccode\u003efrontmatter.suspicious_delimiter\u003c/code\u003e,\n\u003ccode\u003efrontmatter.leading_whitespace\u003c/code\u003e, \u003ccode\u003efrontmatter.malformed_closing_delimiter\u003c/code\u003e,\n\u003ccode\u003efrontmatter.missing_closing_delimiter\u003c/code\u003e, \u003ccode\u003efrontmatter.parse_error\u003c/code\u003e,\n\u003ccode\u003efrontmatter.duplicate_key\u003c/code\u003e, \u003ccode\u003efrontmatter.invalid_type\u003c/code\u003e, and\n\u003ccode\u003efrontmatter.invalid_date\u003c/code\u003e;\u003c/li\u003e\n\u003cli\u003econtent and output: \u003ccode\u003econtent.published_false\u003c/code\u003e, \u003ccode\u003econtent.draft\u003c/code\u003e,\n\u003ccode\u003econtent.skip\u003c/code\u003e, \u003ccode\u003econtent.private\u003c/code\u003e, \u003ccode\u003econtent.filtered\u003c/code\u003e,\n\u003ccode\u003econtent.duplicate_slug\u003c/code\u003e, \u003ccode\u003econtent.no_output\u003c/code\u003e, \u003ccode\u003econtent.load_error\u003c/code\u003e,\n\u003ccode\u003econtent.render_error\u003c/code\u003e, and \u003ccode\u003econtent.write_error\u003c/code\u003e;\u003c/li\u003e\n\u003cli\u003efeed windowing: \u003ccode\u003efeed.offset\u003c/code\u003e and \u003ccode\u003efeed.limit\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe artifact uses schema \u003ccode\u003emarkata.content-diagnostics\u003c/code\u003e and schema version \u003ccode\u003e1\u003c/code\u003e.\nOlder version-1 artifacts created before executor reporting may omit the\n\u003ccode\u003eexecutor\u003c/code\u003e field; readers should treat that as unknown rather than infer it from\nother fields.\u003c/p\u003e\n\u003ch2 id=\"template-cache-decisions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate cache decisions\u003c/span\u003e \u003ca href=\"#template-cache-decisions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCompleted template rendering adds an optional \u003ccode\u003etemplate_cache\u003c/code\u003e object to the\nversion-1 artifact, and to \u003ccode\u003econtent\u003c/code\u003e in benchmark JSON:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejq \u003cspan class=\"s1\"\u003e\u0026#39;.template_cache\u0026#39;\u003c/span\u003e public/.markata/diagnostics.json\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejq \u003cspan class=\"s1\"\u003e\u0026#39;.content.template_cache\u0026#39;\u003c/span\u003e benchmark.json\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOlder version-1 artifacts without this object remain valid. It is independent\nof the profiler and contains bounded counts, not per-page cache diagnostics.\n\u003ccode\u003eclassified\u003c/code\u003e counts non-skipped posts (including empty bodies); \u003ccode\u003eskipped\u003c/code\u003e is\nseparate. \u003ccode\u003ecacheable\u003c/code\u003e counts metadata hits, \u003ccode\u003erestored\u003c/code\u003e counts usable full-page\nhits, and \u003ccode\u003erender_required\u003c/code\u003e includes misses later deferred by incremental serve.\n\u003ccode\u003erender_succeeded\u003c/code\u003e and \u003ccode\u003erender_failed\u003c/code\u003e count selected render results;\n\u003ccode\u003eserve_deferred\u003c/code\u003e counts pages excluded by the canonical incremental selection.\nA best-effort cache write failure does not turn a successful render into failure.\u003c/p\u003e\n\u003cp\u003eBounded parallel restoration does not change these counts or the artifact\nschema. All reads finish before fresh templates run; restored peer pages remain\nvisible through Core. Unavailable pages retain their deterministic input order\nafter classification misses, and an existing in-memory full-page hit remains\nusable even if its disk file is gone. Template phase logs measure classification,\nrestoration, and fresh rendering separately, including zero-render builds;\naggregate counts alone are not disk-read measurements.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003emiss_reasons\u003c/code\u003e reports only the \u003cstrong\u003efirst failing gate\u003c/strong\u003e, in this order:\n\u003ccode\u003eaffected_path\u003c/code\u003e, \u003ccode\u003ecache_unavailable\u003c/code\u003e, \u003ccode\u003einput_hash_missing\u003c/code\u003e, \u003ccode\u003eentry_missing\u003c/code\u003e,\n\u003ccode\u003einput_hash_mismatch\u003c/code\u003e, \u003ccode\u003etemplate_mismatch\u003c/code\u003e, \u003ccode\u003edependency_changed\u003c/code\u003e, \u003ccode\u003eslug_changed\u003c/code\u003e,\n\u003ccode\u003efeed_membership_changed\u003c/code\u003e, \u003ccode\u003elocal_preview_changed\u003c/code\u003e. A metadata hit can instead\nfall back to rendering with \u003ccode\u003efull_html_unavailable\u003c/code\u003e when the full-page getter\nreturns empty. Empty cached input hashes are partial entries compared normally,\nnot evidence of corruption. Empty or unavailable full HTML is not a corruption\nclaim either.\u003c/p\u003e\n\u003cp\u003eEarlier reasons mask later ones; the histogram does not enumerate every\npossible reason. \u003ccode\u003enav_preview_reset\u003c/code\u003e reports whether shared navigation metadata\nreset the page cache in this invocation, not proof that each miss was caused\nby navigation. Repeated invocations replace the observations rather than\naccumulating them.\u003c/p\u003e\n\u003cp\u003eTo reconcile counts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eclassified - cacheable = sum(first ten reasons)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecacheable = restored + full_html_unavailable\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erender_required = sum(all eleven reasons)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eclassified = restored + render_required\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erender_required = render_succeeded + render_failed + serve_deferred\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eExpect cold-build misses and some recurring misses. Persistent misses are not\nautomatically bugs: compare equivalent warm builds and their aggregate reasons\nbefore investigating invalidation. Timing varies with host activity and I/O.\nThese counts contain no paths, template names, hashes, secrets, or per-page\nlabels, and add no telemetry I/O. This is the template-cache portion of #1339;\npublish-I/O diagnostics are not implemented by this phase.\u003c/p\u003e\n\u003ch2 id=\"unchanged-private-posts-and-encryption-changes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUnchanged private posts and encryption changes\u003c/span\u003e \u003ca href=\"#unchanged-private-posts-and-encryption-changes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSource-encrypted posts are parsed on every build to avoid caching decrypted\nMarkdown or article HTML. Their inferred titles are compared using canonical\npost-transform hashes from the previous build, not the temporary untitled\nvalues produced during Load. Losing a plain post\u0026rsquo;s parsed cache follows the\nsame rule. The handoff is transient and hash-only; diagnostics gain no titles,\ndecrypted bodies, passwords, or per-private-post debug paths.\u003c/p\u003e\n\u003cp\u003eChanging a password, key name, hint, or encrypted-wrapper format, or losing the\nencrypted wrapper cache, legitimately regenerates a wrapper. Encryption marks\nthe source path and dependent pages for fresh templates and publication,\nincluding an empty-slug homepage. These misses use \u003ccode\u003eaffected_path\u003c/code\u003e, not a new\ndiagnostic reason. An unchanged valid wrapper hit does not add affected paths.\nAn existing page can have missing semantic metadata immediately after a cold\nnavigation reset. Those missing hashes are treated as an unavailable baseline,\nnot evidence that the post is new. A subsequent edit therefore keeps unrelated\npages cacheable while repairing canonical hashes, without requiring an extra\nwarm-up build.\nRegeneration also clears the old full-page cache reference. If fresh page-cache\nstorage fails, the next persisted reload re-renders using the current wrapper\nand reports \u003ccode\u003efull_html_unavailable\u003c/code\u003e; it cannot restore the old-password page.\nLoad may still conservatively dirty feeds, tag indexes, or garden metadata;\nthis fix does not clear those signals or address deletion drift (#1465).\u003c/p\u003e\n\u003ch2 id=\"privacy-and-publication-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrivacy and publication behavior\u003c/span\u003e \u003ca href=\"#privacy-and-publication-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFeed collection retains every considered source occurrence and exclusion,\nincluding feeds whose publishing work is skipped. Ordered per-feed recording is\natomic with respect to ledger snapshots: the last observation controls inclusion,\nwhile reasons are unioned and excluded observations also contribute entry reasons.\nDuplicate raw paths and normalized aliases are not discarded during selection.\nCollection scratch is invocation-local, and later builds refresh flags and\nmembership. The bounded \u003ccode\u003eauto_feeds\u003c/code\u003e / \u003ccode\u003ecollect\u003c/code\u003e debug record separates generation,\nfiltering/sorting, selection recording, and pagination/preparation durations and\ncounts without paths, feed names, or new artifact fields.\u003c/p\u003e\n\u003cp\u003eNew batch feed relationships use owned slabs capped at 10 dispositions or 32\ninitial-reason string slots, with smaller tails bounded by remaining observations.\nRaw lists above 32 strings use ordinary standalone append/deduplication, not\nreservation by raw length or a counting pass. Retained storage grows with unique\nnonempty values. Reasons are copied and deduplicated in occurrence order; slab\nsegments are disjoint and capacity-clamped, so later updates cannot append into a\nneighbor. Published storage is never cleared or reused. Only missing candidate\nrelationships allocate slabs. Existing updates and ordinary single-record\nproducers do not use this allocator; there is no registry or cross-build pool.\nSnapshots remain independently owned even after ledger reset or rediscovery.\u003c/p\u003e\n\u003cp\u003eStreaming reuses owned sanitation scratch sized by the largest entry. Within\none publication it also reuses standard-encoded feed fragments, capped at 1024\nfragments and 1 MiB of combined keys and JSON bytes. Overlarge or high-cardinality\nvalues are still encoded completely, without retention. Nothing is cached across\nbuilds; the snapshot and final file still grow with all recorded observations.\nThe schema, ordering, escaping and indented bytes are unchanged.\nPublication uses a fixed 64 KiB file buffer, checked on flush before sync, close\nand replacement. Large individual writes can bypass buffering, so raw-write\ncounts must be measured rather than inferred from artifact size divided by the\nbuffer size. These improvements concern temporary serialization storage, not\nwhole-build RSS: live templates and rendered HTML still retain their own memory.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003ediagnostics_artifact\u003c/code\u003e cleanup debug record separates \u003ccode\u003esnapshot\u003c/code\u003e,\n\u003ccode\u003esource_metadata\u003c/code\u003e, \u003ccode\u003eserialization_buffering_exclusive\u003c/code\u003e, \u003ccode\u003efile_write\u003c/code\u003e,\n\u003ccode\u003eflush_exclusive\u003c/code\u003e, \u003ccode\u003esync\u003c/code\u003e, \u003ccode\u003eclose\u003c/code\u003e, and \u003ccode\u003ereplace\u003c/code\u003e. \u003ccode\u003efile_write_bytes\u003c/code\u003e and\n\u003ccode\u003efile_write_calls\u003c/code\u003e count actual underlying file writes, not buffered calls.\nSerialization/buffering and flush \u003cstrong\u003eexclusive\u003c/strong\u003e durations exclude those file\nwrites. Their separately labeled \u003cstrong\u003einclusive\u003c/strong\u003e wall totals overlap file-write\ntime: do not add them to the exclusive components. Source metadata includes the\noptional Git lookup; missing Git metadata is still harmless. These elapsed\nmeasurements contain no paths or messages and are not tracing spans or fields in\nthe artifact. Directory/temp setup and temp removal are outside these phases;\n\u003ccode\u003epublished=0\u003c/code\u003e means replacement did not complete.\u003c/p\u003e\n\u003cp\u003eThe artifact contains sanitized ledger data only. It does not contain raw\nconfiguration, environment values, secrets, absolute paths, raw logs,\nfrontmatter, Markdown bodies, rendered HTML, decrypted private content, or\nencryption key names.\u003c/p\u003e\n\u003cp\u003eThe file is published only after the normal full lifecycle completes. A failed\nbuild leaves an existing artifact unchanged and does not leave a partial new\nfile. Streaming output is flushed, synced, and closed in a temporary sibling\nfile before replacing the artifact; serialization or write failures leave the\nprevious artifact intact and fail the build. \u003ccode\u003emarkata-go build --dry-run\u003c/code\u003e,\n\u003ccode\u003emarkata-go build --fast\u003c/code\u003e, partial lifecycle calls, and fast or incremental\ndevelopment server requests do not publish a new artifact. A normal \u003ccode\u003eserve\u003c/code\u003e\nbuild may publish one when its full build completes successfully.\u003c/p\u003e\n",
      "content_text": "\n\nAfter a successful full build completes, markata-go writes a\nsanitized diagnostics artifact below the configured output directory:\n\n```text\n\u003coutput_dir\u003e/.markata/diagnostics.json\n```\n\nFor example, a build with `-o dist` writes `dist/.markata/diagnostics.json`.\nThe artifact is enabled by default. It is part of the generated output, so a\nBuilder Admin release from such a build carries it with the rest of the site.\n\n## Inspect the artifact\n\nUse a JSON viewer such as `jq`:\n\n```bash\njq . public/.markata/diagnostics.json\njq '.executor' public/.markata/diagnostics.json\njq '.summary' public/.markata/diagnostics.json\njq '.entries[] | select(.disposition == \"excluded\")' public/.markata/diagnostics.json\n```\n\nReplace `public` with the output directory used by the build. There is no\nseparate diagnostics command or generated public HTML page.\n\n## Stable fields and reason codes\n\nThe top-level `schema`, `schema_version`, `generator`, `built_at`, `executor`,\n`summary`, and `entries` fields are stable parts of the versioned format.\nConsumers must check both `schema` and `schema_version` before interpreting the\ndocument.\n\n`executor` records the build engine that produced the artifact. Normal builds\nreport `legacy`; builds explicitly using the feature-flagged DAG executor report\n`dag`. The same identity is included in `markata-go build --benchmark-json`\noutput, which makes local benchmark reports and Builder Admin release artifacts\nunambiguous without parsing human-readable logs.\n\n`summary` contains counts for discovered files, candidates, loaded sources,\nvalid frontmatter, posts, eligible posts, rendered posts, emitted outputs,\nexcluded candidates, warnings, and errors. Each entry includes a relative\nsource `path`, lifecycle state booleans, a final `disposition`, sorted `reasons`,\ndiagnostics, and feed-level dispositions.\n\nFeed dispositions are complete: feeds that did not include a source remain in\nthe artifact with their exclusion reasons. On large sites this can make the\nJSON file substantial. Full builds stream one sanitized entry at a time instead\nof constructing full-artifact serializer buffers, reducing temporary memory\nwithout dropping observations or changing the indented JSON format. The\nimmutable ledger snapshot and final file still contain the complete diagnostics;\nthere is no additional configuration to enable this behavior.\nSnapshot construction copies feed reasons into one owned arena per entry, with\neach feed's slice capacity clamped even after deduplication. Appending or mutating\none feed cannot change sibling feeds, the ledger, or another snapshot. Every\nsnapshot remains a fresh copy; counts, ordering and empty-value semantics are\nunchanged. Fewer small allocations do not imply a reduction in whole-build RSS.\n\nReason codes are stable identifiers. Messages can change without changing a\ncode. The current codes cover:\n\n- frontmatter: `frontmatter.suspicious_delimiter`,\n  `frontmatter.leading_whitespace`, `frontmatter.malformed_closing_delimiter`,\n  `frontmatter.missing_closing_delimiter`, `frontmatter.parse_error`,\n  `frontmatter.duplicate_key`, `frontmatter.invalid_type`, and\n  `frontmatter.invalid_date`;\n- content and output: `content.published_false`, `content.draft`,\n  `content.skip`, `content.private`, `content.filtered`,\n  `content.duplicate_slug`, `content.no_output`, `content.load_error`,\n  `content.render_error`, and `content.write_error`;\n- feed windowing: `feed.offset` and `feed.limit`.\n\nThe artifact uses schema `markata.content-diagnostics` and schema version `1`.\nOlder version-1 artifacts created before executor reporting may omit the\n`executor` field; readers should treat that as unknown rather than infer it from\nother fields.\n\n## Template cache decisions\n\nCompleted template rendering adds an optional `template_cache` object to the\nversion-1 artifact, and to `content` in benchmark JSON:\n\n```bash\njq '.template_cache' public/.markata/diagnostics.json\njq '.content.template_cache' benchmark.json\n```\n\nOlder version-1 artifacts without this object remain valid. It is independent\nof the profiler and contains bounded counts, not per-page cache diagnostics.\n`classified` counts non-skipped posts (including empty bodies); `skipped` is\nseparate. `cacheable` counts metadata hits, `restored` counts usable full-page\nhits, and `render_required` includes misses later deferred by incremental serve.\n`render_succeeded` and `render_failed` count selected render results;\n`serve_deferred` counts pages excluded by the canonical incremental selection.\nA best-effort cache write failure does not turn a successful render into failure.\n\nBounded parallel restoration does not change these counts or the artifact\nschema. All reads finish before fresh templates run; restored peer pages remain\nvisible through Core. Unavailable pages retain their deterministic input order\nafter classification misses, and an existing in-memory full-page hit remains\nusable even if its disk file is gone. Template phase logs measure classification,\nrestoration, and fresh rendering separately, including zero-render builds;\naggregate counts alone are not disk-read measurements.\n\n`miss_reasons` reports only the **first failing gate**, in this order:\n`affected_path`, `cache_unavailable`, `input_hash_missing`, `entry_missing`,\n`input_hash_mismatch`, `template_mismatch`, `dependency_changed`, `slug_changed`,\n`feed_membership_changed`, `local_preview_changed`. A metadata hit can instead\nfall back to rendering with `full_html_unavailable` when the full-page getter\nreturns empty. Empty cached input hashes are partial entries compared normally,\nnot evidence of corruption. Empty or unavailable full HTML is not a corruption\nclaim either.\n\nEarlier reasons mask later ones; the histogram does not enumerate every\npossible reason. `nav_preview_reset` reports whether shared navigation metadata\nreset the page cache in this invocation, not proof that each miss was caused\nby navigation. Repeated invocations replace the observations rather than\naccumulating them.\n\nTo reconcile counts:\n\n```text\nclassified - cacheable = sum(first ten reasons)\ncacheable = restored + full_html_unavailable\nrender_required = sum(all eleven reasons)\nclassified = restored + render_required\nrender_required = render_succeeded + render_failed + serve_deferred\n```\n\nExpect cold-build misses and some recurring misses. Persistent misses are not\nautomatically bugs: compare equivalent warm builds and their aggregate reasons\nbefore investigating invalidation. Timing varies with host activity and I/O.\nThese counts contain no paths, template names, hashes, secrets, or per-page\nlabels, and add no telemetry I/O. This is the template-cache portion of #1339;\npublish-I/O diagnostics are not implemented by this phase.\n\n## Unchanged private posts and encryption changes\n\nSource-encrypted posts are parsed on every build to avoid caching decrypted\nMarkdown or article HTML. Their inferred titles are compared using canonical\npost-transform hashes from the previous build, not the temporary untitled\nvalues produced during Load. Losing a plain post's parsed cache follows the\nsame rule. The handoff is transient and hash-only; diagnostics gain no titles,\ndecrypted bodies, passwords, or per-private-post debug paths.\n\nChanging a password, key name, hint, or encrypted-wrapper format, or losing the\nencrypted wrapper cache, legitimately regenerates a wrapper. Encryption marks\nthe source path and dependent pages for fresh templates and publication,\nincluding an empty-slug homepage. These misses use `affected_path`, not a new\ndiagnostic reason. An unchanged valid wrapper hit does not add affected paths.\nAn existing page can have missing semantic metadata immediately after a cold\nnavigation reset. Those missing hashes are treated as an unavailable baseline,\nnot evidence that the post is new. A subsequent edit therefore keeps unrelated\npages cacheable while repairing canonical hashes, without requiring an extra\nwarm-up build.\nRegeneration also clears the old full-page cache reference. If fresh page-cache\nstorage fails, the next persisted reload re-renders using the current wrapper\nand reports `full_html_unavailable`; it cannot restore the old-password page.\nLoad may still conservatively dirty feeds, tag indexes, or garden metadata;\nthis fix does not clear those signals or address deletion drift (#1465).\n\n## Privacy and publication behavior\n\nFeed collection retains every considered source occurrence and exclusion,\nincluding feeds whose publishing work is skipped. Ordered per-feed recording is\natomic with respect to ledger snapshots: the last observation controls inclusion,\nwhile reasons are unioned and excluded observations also contribute entry reasons.\nDuplicate raw paths and normalized aliases are not discarded during selection.\nCollection scratch is invocation-local, and later builds refresh flags and\nmembership. The bounded `auto_feeds` / `collect` debug record separates generation,\nfiltering/sorting, selection recording, and pagination/preparation durations and\ncounts without paths, feed names, or new artifact fields.\n\nNew batch feed relationships use owned slabs capped at 10 dispositions or 32\ninitial-reason string slots, with smaller tails bounded by remaining observations.\nRaw lists above 32 strings use ordinary standalone append/deduplication, not\nreservation by raw length or a counting pass. Retained storage grows with unique\nnonempty values. Reasons are copied and deduplicated in occurrence order; slab\nsegments are disjoint and capacity-clamped, so later updates cannot append into a\nneighbor. Published storage is never cleared or reused. Only missing candidate\nrelationships allocate slabs. Existing updates and ordinary single-record\nproducers do not use this allocator; there is no registry or cross-build pool.\nSnapshots remain independently owned even after ledger reset or rediscovery.\n\nStreaming reuses owned sanitation scratch sized by the largest entry. Within\none publication it also reuses standard-encoded feed fragments, capped at 1024\nfragments and 1 MiB of combined keys and JSON bytes. Overlarge or high-cardinality\nvalues are still encoded completely, without retention. Nothing is cached across\nbuilds; the snapshot and final file still grow with all recorded observations.\nThe schema, ordering, escaping and indented bytes are unchanged.\nPublication uses a fixed 64 KiB file buffer, checked on flush before sync, close\nand replacement. Large individual writes can bypass buffering, so raw-write\ncounts must be measured rather than inferred from artifact size divided by the\nbuffer size. These improvements concern temporary serialization storage, not\nwhole-build RSS: live templates and rendered HTML still retain their own memory.\n\nThe `diagnostics_artifact` cleanup debug record separates `snapshot`,\n`source_metadata`, `serialization_buffering_exclusive`, `file_write`,\n`flush_exclusive`, `sync`, `close`, and `replace`. `file_write_bytes` and\n`file_write_calls` count actual underlying file writes, not buffered calls.\nSerialization/buffering and flush **exclusive** durations exclude those file\nwrites. Their separately labeled **inclusive** wall totals overlap file-write\ntime: do not add them to the exclusive components. Source metadata includes the\noptional Git lookup; missing Git metadata is still harmless. These elapsed\nmeasurements contain no paths or messages and are not tracing spans or fields in\nthe artifact. Directory/temp setup and temp removal are outside these phases;\n`published=0` means replacement did not complete.\n\nThe artifact contains sanitized ledger data only. It does not contain raw\nconfiguration, environment values, secrets, absolute paths, raw logs,\nfrontmatter, Markdown bodies, rendered HTML, decrypted private content, or\nencryption key names.\n\nThe file is published only after the normal full lifecycle completes. A failed\nbuild leaves an existing artifact unchanged and does not leave a partial new\nfile. Streaming output is flushed, synced, and closed in a temporary sibling\nfile before replacing the artifact; serialization or write failures leave the\nprevious artifact intact and fail the build. `markata-go build --dry-run`,\n`markata-go build --fast`, partial lifecycle calls, and fast or incremental\ndevelopment server requests do not publish a new artifact. A normal `serve`\nbuild may publish one when its full build completes successfully.",
      "summary": "Inspect the content diagnostics artifact produced by a markata-go build",
      "date_published": "2026-09-10T00:00:00Z",
      "date_modified": "2026-09-10T00:00:00Z",
      "tags": [
        "documentation",
        "content",
        "diagnostics"
      ]
    },
    {
      "id": "https://markata.dev/docs/plans/2026-09-03-post-index-correctness-design/",
      "url": "https://markata.dev/docs/plans/2026-09-03-post-index-correctness-design/",
      "title": "PostIndex Correctness and Consolidation",
      "content_html": "\u003ch2 id=\"goal\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGoal\u003c/span\u003e \u003ca href=\"#goal\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eKeep \u003ccode\u003elifecycle.Manager.PostIndex()\u003c/code\u003e correct across manager resets and use it\nwhere an existing production lookup has the same source, key semantics, and\nlifecycle. Do not replace filtered collections, cache snapshots, validation\nindexes, or aggregation maps.\u003c/p\u003e\n\u003ch2 id=\"postindex-contract\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePostIndex contract\u003c/span\u003e \u003ca href=\"#postindex-contract\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003ePostIndex()\u003c/code\u003e builds lazily from the manager\u0026rsquo;s current post slice. It is not\nrestricted to the end of \u003ccode\u003eLoad\u003c/code\u003e; any plugin can request it at any stage. The\nmanager invalidates the cached index after \u003ccode\u003eSetPosts\u003c/code\u003e, \u003ccode\u003eAddPost\u003c/code\u003e, and \u003ccode\u003eReset\u003c/code\u003e.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eKey\u003c/th\u003e\n\u003cth\u003eBehavior\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eSlug\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eBySlug\u003c/code\u003e uses lowercase \u003ccode\u003ePost.Slug\u003c/code\u003e; \u003ccode\u003eLookupBySlug\u003c/code\u003e tries this first\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSlugified\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eBySlugified\u003c/code\u003e uses \u003ccode\u003emodels.Slugify\u003c/code\u003e; lookup tries it second, then the slugified key in \u003ccode\u003eBySlug\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHref\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eByHref\u003c/code\u003e uses the exact non-empty \u003ccode\u003ePost.Href\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePath\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eByPath\u003c/code\u003e uses the exact non-empty \u003ccode\u003ePost.Path\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAliases\u003c/td\u003e\n\u003ctd\u003eString aliases use lowercase and slugified keys; existing alias entries are not overwritten\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDuplicates\u003c/td\u003e\n\u003ctd\u003eMain slug, slugified slug, href, and path entries are last-post-wins\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eNil\u003c/td\u003e\n\u003ctd\u003eNil index receivers and misses return nil from \u003ccode\u003eLookupBySlug\u003c/code\u003e; nil posts are not valid index input\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe maps are shared pointers to the posts, not copies of post values. A direct\nmutation of \u003ccode\u003eSlug\u003c/code\u003e, \u003ccode\u003eHref\u003c/code\u003e, \u003ccode\u003ePath\u003c/code\u003e, or alias data on an existing post does not\ninvalidate the index. Such a mutation requires \u003ccode\u003ePostIndex().Refresh(m)\u003c/code\u003e before\nthe next lookup. \u003ccode\u003eRefresh\u003c/code\u003e is used once by the wikilinks transform because\nother plugins may have changed post fields before that consumer runs.\u003c/p\u003e\n\u003ch2 id=\"lookup-inventory\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLookup inventory\u003c/span\u003e \u003ca href=\"#lookup-inventory\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eComponent\u003c/th\u003e\n\u003cth\u003eLookup key\u003c/th\u003e\n\u003cth\u003eCurrent implementation\u003c/th\u003e\n\u003cth\u003eLifetime\u003c/th\u003e\n\u003cth\u003eSource of truth\u003c/th\u003e\n\u003cth\u003eEquivalent to PostIndex?\u003c/th\u003e\n\u003cth\u003eCan replace safely?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eEmbeds\u003c/td\u003e\n\u003ctd\u003eslug\u003c/td\u003e\n\u003ctd\u003eShared \u003ccode\u003ePostIndex.LookupBySlug\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTransform\u003c/td\u003e\n\u003ctd\u003eManager posts\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eAlready uses it\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWikilinks\u003c/td\u003e\n\u003ctd\u003eslug\u003c/td\u003e\n\u003ctd\u003eShared \u003ccode\u003ePostIndex.LookupBySlug\u003c/code\u003e plus one refresh\u003c/td\u003e\n\u003ctd\u003eTransform\u003c/td\u003e\n\u003ctd\u003eManager posts\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eAlready uses it\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWikilink hover\u003c/td\u003e\n\u003ctd\u003ehref with slash variants\u003c/td\u003e\n\u003ctd\u003eShared \u003ccode\u003ePostIndex.ByHref\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRender\u003c/td\u003e\n\u003ctd\u003eManager posts\u003c/td\u003e\n\u003ctd\u003eYes, with consumer normalization\u003c/td\u003e\n\u003ctd\u003eAlready uses it\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLink collector\u003c/td\u003e\n\u003ctd\u003eslug/href with slash normalization\u003c/td\u003e\n\u003ctd\u003eShared \u003ccode\u003ePostIndex\u003c/code\u003e maps\u003c/td\u003e\n\u003ctd\u003eRender\u003c/td\u003e\n\u003ctd\u003eManager posts\u003c/td\u003e\n\u003ctd\u003eYes, with consumer normalization\u003c/td\u003e\n\u003ctd\u003eAlready uses it\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einclude_post\u003c/code\u003e template function\u003c/td\u003e\n\u003ctd\u003eexact trimmed slug\u003c/td\u003e\n\u003ctd\u003eLinear \u003ccode\u003eManager.Posts()\u003c/code\u003e scan\u003c/td\u003e\n\u003ctd\u003eRender/template call\u003c/td\u003e\n\u003ctd\u003eManager posts\u003c/td\u003e\n\u003ctd\u003eNo: case, slugification, alias, and duplicate semantics differ\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePost service \u003ccode\u003eGet\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eexact path\u003c/td\u003e\n\u003ctd\u003eLinear \u003ccode\u003eManager.Posts()\u003c/code\u003e scan, first match\u003c/td\u003e\n\u003ctd\u003eService lifetime\u003c/td\u003e\n\u003ctd\u003eManager posts\u003c/td\u003e\n\u003ctd\u003eNo: \u003ccode\u003eByPath\u003c/code\u003e is last match on duplicates\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePrev/next\u003c/td\u003e\n\u003ctd\u003epost slug to feed membership\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emap[string][]*Feed\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCollect call\u003c/td\u003e\n\u003ctd\u003eSelected feed posts\u003c/td\u003e\n\u003ctd\u003eNo: membership and order are the result\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTemplates/sidebar\u003c/td\u003e\n\u003ctd\u003ecurrent slug in selected feeds\u003c/td\u003e\n\u003ctd\u003eLinear membership/position scans\u003c/td\u003e\n\u003ctd\u003eRender/collect call\u003c/td\u003e\n\u003ctd\u003eSelected feed posts\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMentions\u003c/td\u003e\n\u003ctd\u003econfigured post filter\u003c/td\u003e\n\u003ctd\u003eCollection scan and filter\u003c/td\u003e\n\u003ctd\u003eTransform\u003c/td\u003e\n\u003ctd\u003eManager posts\u003c/td\u003e\n\u003ctd\u003eNo: aggregation/filtering\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSlug conflicts\u003c/td\u003e\n\u003ctd\u003enormalized slug to all paths\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emap[string][]string\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eValidation call\u003c/td\u003e\n\u003ctd\u003ePublishable posts\u003c/td\u003e\n\u003ctd\u003eNo: duplicate reporting is intentional\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSearch\u003c/td\u003e\n\u003ctd\u003epath to visible post\u003c/td\u003e\n\u003ctd\u003eFiltered \u003ccode\u003esearch.PostsByPath\u003c/code\u003e map\u003c/td\u003e\n\u003ctd\u003eSearch request/index\u003c/td\u003e\n\u003ctd\u003eSearch-visible posts\u003c/td\u003e\n\u003ctd\u003eNo: drafts/skips are excluded\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSearch API\u003c/td\u003e\n\u003ctd\u003epath to visible post\u003c/td\u003e\n\u003ctd\u003eHandler-owned snapshot map\u003c/td\u003e\n\u003ctd\u003eHandler lifetime\u003c/td\u003e\n\u003ctd\u003eHandler update snapshot\u003c/td\u003e\n\u003ctd\u003eNo: independent lifecycle\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eList cache\u003c/td\u003e\n\u003ctd\u003esource path\u003c/td\u003e\n\u003ctd\u003eCache reconstruction map\u003c/td\u003e\n\u003ctd\u003eLoad/cache operation\u003c/td\u003e\n\u003ctd\u003eCached files and feeds\u003c/td\u003e\n\u003ctd\u003eNo: needed before the manager collection is final\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eIncremental serve/load\u003c/td\u003e\n\u003ctd\u003esource path\u003c/td\u003e\n\u003ctd\u003eCached post maps\u003c/td\u003e\n\u003ctd\u003eBuild/serve cycle\u003c/td\u003e\n\u003ctd\u003eServe or build cache\u003c/td\u003e\n\u003ctd\u003eNo: cache state\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePublish HTML\u003c/td\u003e\n\u003ctd\u003epath to slug\u003c/td\u003e\n\u003ctd\u003eTransient invalidation map\u003c/td\u003e\n\u003ctd\u003eOne write operation\u003c/td\u003e\n\u003ctd\u003eCurrent post paths and cache\u003c/td\u003e\n\u003ctd\u003eNo: reverse projection\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eContent index\u003c/td\u003e\n\u003ctd\u003epath eligibility\u003c/td\u003e\n\u003ctd\u003eFiltered eligibility map\u003c/td\u003e\n\u003ctd\u003eContent-index operation\u003c/td\u003e\n\u003ctd\u003eContent-index policy\u003c/td\u003e\n\u003ctd\u003eNo: eligibility is the value\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLSP\u003c/td\u003e\n\u003ctd\u003eslug/URI to \u003ccode\u003ePostInfo\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSeparate locked workspace index\u003c/td\u003e\n\u003ctd\u003eLSP session\u003c/td\u003e\n\u003ctd\u003eWorkspace files\u003c/td\u003e\n\u003ctd\u003eNo: separate model and lifecycle\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eNo local post lookup map met all four replacement conditions: identical source\nposts, normalization, lifecycle visibility, and duplicate/result semantics.\u003c/p\u003e\n\u003ch2 id=\"lifecycle-decision\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLifecycle decision\u003c/span\u003e \u003ca href=\"#lifecycle-decision\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSynthetic posts are added with \u003ccode\u003eAddPost\u003c/code\u003e during \u003ccode\u003eConfigure\u003c/code\u003e or late \u003ccode\u003eLoad\u003c/code\u003e, so\nthey invalidate the index before Transform consumers run. A consumer that\nneeds a filtered subset or a cache-owned snapshot must keep its local lookup.\nNo plugin is changed to use the shared index solely to reduce a small loop when\ndoing so would change normalization or duplicate behavior.\u003c/p\u003e\n\u003ch2 id=\"verification\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVerification\u003c/span\u003e \u003ca href=\"#verification\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe regression sequence is:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eSet post A and build the index.\u003c/li\u003e\n\u003cli\u003eReset the manager.\u003c/li\u003e\n\u003cli\u003eConfirm the manager has no posts and its next index cannot find A.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eAdditional tests cover \u003ccode\u003eSetPosts\u003c/code\u003e, \u003ccode\u003eAddPost\u003c/code\u003e, slug case and slugification,\nhref/path keys, duplicate behavior, direct field mutation followed by explicit\n\u003ccode\u003eRefresh\u003c/code\u003e, and the nil lookup receiver.\u003c/p\u003e\n",
      "content_text": "\n\n## Goal\n\nKeep `lifecycle.Manager.PostIndex()` correct across manager resets and use it\nwhere an existing production lookup has the same source, key semantics, and\nlifecycle. Do not replace filtered collections, cache snapshots, validation\nindexes, or aggregation maps.\n\n## PostIndex contract\n\n`PostIndex()` builds lazily from the manager's current post slice. It is not\nrestricted to the end of `Load`; any plugin can request it at any stage. The\nmanager invalidates the cached index after `SetPosts`, `AddPost`, and `Reset`.\n\n| Key | Behavior |\n| --- | --- |\n| Slug | `BySlug` uses lowercase `Post.Slug`; `LookupBySlug` tries this first |\n| Slugified | `BySlugified` uses `models.Slugify`; lookup tries it second, then the slugified key in `BySlug` |\n| Href | `ByHref` uses the exact non-empty `Post.Href` |\n| Path | `ByPath` uses the exact non-empty `Post.Path` |\n| Aliases | String aliases use lowercase and slugified keys; existing alias entries are not overwritten |\n| Duplicates | Main slug, slugified slug, href, and path entries are last-post-wins |\n| Nil | Nil index receivers and misses return nil from `LookupBySlug`; nil posts are not valid index input |\n\nThe maps are shared pointers to the posts, not copies of post values. A direct\nmutation of `Slug`, `Href`, `Path`, or alias data on an existing post does not\ninvalidate the index. Such a mutation requires `PostIndex().Refresh(m)` before\nthe next lookup. `Refresh` is used once by the wikilinks transform because\nother plugins may have changed post fields before that consumer runs.\n\n## Lookup inventory\n\n| Component | Lookup key | Current implementation | Lifetime | Source of truth | Equivalent to PostIndex? | Can replace safely? |\n| --- | --- | --- | --- | --- | --- | --- |\n| Embeds | slug | Shared `PostIndex.LookupBySlug` | Transform | Manager posts | Yes | Already uses it |\n| Wikilinks | slug | Shared `PostIndex.LookupBySlug` plus one refresh | Transform | Manager posts | Yes | Already uses it |\n| Wikilink hover | href with slash variants | Shared `PostIndex.ByHref` | Render | Manager posts | Yes, with consumer normalization | Already uses it |\n| Link collector | slug/href with slash normalization | Shared `PostIndex` maps | Render | Manager posts | Yes, with consumer normalization | Already uses it |\n| `include_post` template function | exact trimmed slug | Linear `Manager.Posts()` scan | Render/template call | Manager posts | No: case, slugification, alias, and duplicate semantics differ | No |\n| Post service `Get` | exact path | Linear `Manager.Posts()` scan, first match | Service lifetime | Manager posts | No: `ByPath` is last match on duplicates | No |\n| Prev/next | post slug to feed membership | `map[string][]*Feed` | Collect call | Selected feed posts | No: membership and order are the result | No |\n| Templates/sidebar | current slug in selected feeds | Linear membership/position scans | Render/collect call | Selected feed posts | No | No |\n| Mentions | configured post filter | Collection scan and filter | Transform | Manager posts | No: aggregation/filtering | No |\n| Slug conflicts | normalized slug to all paths | `map[string][]string` | Validation call | Publishable posts | No: duplicate reporting is intentional | No |\n| Search | path to visible post | Filtered `search.PostsByPath` map | Search request/index | Search-visible posts | No: drafts/skips are excluded | No |\n| Search API | path to visible post | Handler-owned snapshot map | Handler lifetime | Handler update snapshot | No: independent lifecycle | No |\n| List cache | source path | Cache reconstruction map | Load/cache operation | Cached files and feeds | No: needed before the manager collection is final | No |\n| Incremental serve/load | source path | Cached post maps | Build/serve cycle | Serve or build cache | No: cache state | No |\n| Publish HTML | path to slug | Transient invalidation map | One write operation | Current post paths and cache | No: reverse projection | No |\n| Content index | path eligibility | Filtered eligibility map | Content-index operation | Content-index policy | No: eligibility is the value | No |\n| LSP | slug/URI to `PostInfo` | Separate locked workspace index | LSP session | Workspace files | No: separate model and lifecycle | No |\n\nNo local post lookup map met all four replacement conditions: identical source\nposts, normalization, lifecycle visibility, and duplicate/result semantics.\n\n## Lifecycle decision\n\nSynthetic posts are added with `AddPost` during `Configure` or late `Load`, so\nthey invalidate the index before Transform consumers run. A consumer that\nneeds a filtered subset or a cache-owned snapshot must keep its local lookup.\nNo plugin is changed to use the shared index solely to reduce a small loop when\ndoing so would change normalization or duplicate behavior.\n\n## Verification\n\nThe regression sequence is:\n\n1. Set post A and build the index.\n2. Reset the manager.\n3. Confirm the manager has no posts and its next index cannot find A.\n\nAdditional tests cover `SetPosts`, `AddPost`, slug case and slugification,\nhref/path keys, duplicate behavior, direct field mutation followed by explicit\n`Refresh`, and the nil lookup receiver.\n",
      "summary": "Contract and audit for the shared Markata-Go post lookup index",
      "date_published": "2026-09-03T00:00:00Z",
      "date_modified": "2026-09-03T00:00:00Z",
      "tags": [
        "documentation",
        "plan",
        "lifecycle"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/build-lab/",
      "url": "https://markata.dev/docs/guides/build-lab/",
      "title": "Build Lab",
      "content_html": "\u003cp\u003eBuild Lab compares a baseline binary with a candidate binary. It runs each\nbuild in an isolated temporary workspace and records output manifests and\ncorrectness checks. It runs ordinary \u003ccode\u003emarkata-go build\u003c/code\u003e commands. It does not\nuse a task graph or scheduler flags.\u003c/p\u003e\n\u003cp\u003eBuild Lab copies the fixture, redirects cache and temporary paths, disables\nfixture \u003ccode\u003e.env\u003c/code\u003e loading, and pins child processes to UTC, \u003ccode\u003eC.UTF-8\u003c/code\u003e, and\n\u003ccode\u003eSOURCE_DATE_EPOCH=0\u003c/code\u003e. Custom plugins, arbitrary binaries, and fixture content\nremain trusted inputs. Process groups or Windows Job Objects provide best-effort\ndescendant cleanup; they are not an operating-system sandbox.\u003c/p\u003e\n\u003ch2 id=\"run-a-smoke-comparison\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRun a smoke comparison\u003c/span\u003e \u003ca href=\"#run-a-smoke-comparison\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBuild the binary first:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego build -o /tmp/markata-go ./cmd/markata-go\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go buildlab run \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --fixture /path/to/site \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --baseline /tmp/markata-go \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --candidate /tmp/markata-go \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --result buildlab-result.json\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEach checkpoint compares:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eclean baseline output with clean candidate output;\u003c/li\u003e\n\u003cli\u003ecandidate incremental output with clean candidate output; and\u003c/li\u003e\n\u003cli\u003etwo clean candidate builds when determinism checking is enabled.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe default scenario performs a cache/output cleanup, a priming build, and a\nno-op incremental build. Use \u003ccode\u003e--fast\u003c/code\u003e for a quicker smoke check. Fast mode is\nnot a substitute for a full production-output comparison.\u003c/p\u003e\n\u003ch2 id=\"use-a-scenario-file\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUse a scenario file\u003c/span\u003e \u003ca href=\"#use-a-scenario-file\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eScenario files contain an identifier, version, seed, and ordered operations:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;title-change\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;seed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e42\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;operations\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;build\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;replace-exact\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;path\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;content/foo.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;old\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;title: Old\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;new\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;title: New\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;build\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRun it with:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go buildlab run \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --fixture /path/to/site \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --baseline /tmp/markata-go \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --candidate /tmp/markata-go \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --scenario title-change.json \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --result buildlab-title-change.json\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBuild Lab supports \u003ccode\u003ebuild\u003c/code\u003e, \u003ccode\u003ewrite-file\u003c/code\u003e, \u003ccode\u003ereplace-exact\u003c/code\u003e, \u003ccode\u003edelete-file\u003c/code\u003e,\n\u003ccode\u003erename-file\u003c/code\u003e, \u003ccode\u003ecopy-file\u003c/code\u003e, \u003ccode\u003eset-config\u003c/code\u003e, \u003ccode\u003etouch-file\u003c/code\u003e, \u003ccode\u003eclean-cache\u003c/code\u003e, and\n\u003ccode\u003eclear-output\u003c/code\u003e. Paths stay inside the fixture, and \u003ccode\u003ereplace-exact\u003c/code\u003e must match\nexactly one occurrence. Semantic mutations must be followed by a build.\u003c/p\u003e\n\u003cp\u003eThe foundation covers clean, no-op, edit, add, delete, rename, linked-target,\nand configuration mutations. Add fixture-specific scenarios for other product\nsurfaces.\u003c/p\u003e\n\u003cp\u003eA linked-target checkpoint compares the dependent page and its feed outputs.\nThe incremental build must rerender known dependents before feeds and pages are\nwritten. Unrelated posts must remain eligible for cache hits.\u003c/p\u003e\n\u003ch2 id=\"read-failures-correctly\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRead failures correctly\u003c/span\u003e \u003ca href=\"#read-failures-correctly\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBuild Lab is a measuring instrument. A result with \u003ccode\u003efailure_class: \u0026quot;product\u0026quot;\u003c/code\u003e\nmeans that a child build or an output comparison found a Markata-Go behavior\nproblem. It does not mean that the harness should be changed to hide the\nproblem. A \u003ccode\u003efailure_class: \u0026quot;harness\u0026quot;\u003c/code\u003e result means that the comparison itself\nwas not trustworthy, for example because of a timeout, output truncation, path\nviolation, or manifest error.\u003c/p\u003e\n\u003cp\u003eProduct failures include concise diagnostics in the JSON result and on stderr.\nKnown failures can therefore be recorded while the foundation remains focused\non measurement.\u003c/p\u003e\n\u003cp\u003eSetup errors also emit a versioned JSON result with \u003ccode\u003efailure_class: \u0026quot;harness\u0026quot;\u003c/code\u003e\nwhen the command reaches the Build Lab runner. Invalid command-line syntax is\nreported by the normal CLI parser instead.\u003c/p\u003e\n\u003ch2 id=\"output-classes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOutput classes\u003c/span\u003e \u003ca href=\"#output-classes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eManifest records are deterministic by default. Known minification and fontpack\nmetadata files are excluded because they are build state, not publishable\noutput. Use \u003ccode\u003e--volatile\u003c/code\u003e for known changing publishable paths, such as the\ndefault \u003ccode\u003e.well-known/time\u003c/code\u003e file:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go buildlab run --fixture /path/to/site --volatile .well-known/time\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse \u003ccode\u003e--check-determinism=false\u003c/code\u003e only when a fixture cannot support the clean\nrebuild check. Keep that exception visible in CI configuration.\u003c/p\u003e\n\u003ch2 id=\"isolation-and-environment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIsolation and environment\u003c/span\u003e \u003ca href=\"#isolation-and-environment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse the global \u003ccode\u003e--merge-config\u003c/code\u003e flag to apply a fixture-local profile to both\nchild binaries:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go buildlab run --fixture /path/to/site --merge-config fast.toml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe \u003ccode\u003e--env\u003c/code\u003e option accepts only \u003ccode\u003ePATH\u003c/code\u003e,\n\u003ccode\u003eMARKATA_GO_ENCRYPTION_ENABLED\u003c/code\u003e, and \u003ccode\u003eMARKATA_GO_OFFLINE\u003c/code\u003e. Build Lab does not\ninherit arbitrary environment variables, including proxies, cloud settings,\nGit settings, agent settings, or credentials.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go buildlab run \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --fixture /path/to/site \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --env \u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_ENABLED\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse \u003ccode\u003e--timeout\u003c/code\u003e and \u003ccode\u003e--gomaxprocs\u003c/code\u003e to control execution. Record external tool\nversions with repeated comma-separated entries:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go buildlab run \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --fixture /path/to/site \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --tool-version \u003cspan class=\"nv\"\u003epagefind\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e1.5.2,tailwind\u003cspan class=\"o\"\u003e=\u003c/span\u003e4.1.0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n\nBuild Lab compares a baseline binary with a candidate binary. It runs each\nbuild in an isolated temporary workspace and records output manifests and\ncorrectness checks. It runs ordinary `markata-go build` commands. It does not\nuse a task graph or scheduler flags.\n\nBuild Lab copies the fixture, redirects cache and temporary paths, disables\nfixture `.env` loading, and pins child processes to UTC, `C.UTF-8`, and\n`SOURCE_DATE_EPOCH=0`. Custom plugins, arbitrary binaries, and fixture content\nremain trusted inputs. Process groups or Windows Job Objects provide best-effort\ndescendant cleanup; they are not an operating-system sandbox.\n\n## Run a smoke comparison\n\nBuild the binary first:\n\n```bash\ngo build -o /tmp/markata-go ./cmd/markata-go\nmarkata-go buildlab run \\\n  --fixture /path/to/site \\\n  --baseline /tmp/markata-go \\\n  --candidate /tmp/markata-go \\\n  --result buildlab-result.json\n```\n\nEach checkpoint compares:\n\n- clean baseline output with clean candidate output;\n- candidate incremental output with clean candidate output; and\n- two clean candidate builds when determinism checking is enabled.\n\nThe default scenario performs a cache/output cleanup, a priming build, and a\nno-op incremental build. Use `--fast` for a quicker smoke check. Fast mode is\nnot a substitute for a full production-output comparison.\n\n## Use a scenario file\n\nScenario files contain an identifier, version, seed, and ordered operations:\n\n```json\n{\n  \"id\": \"title-change\",\n  \"version\": \"1\",\n  \"seed\": 42,\n  \"operations\": [\n    {\"type\": \"build\"},\n    {\n      \"type\": \"replace-exact\",\n      \"path\": \"content/foo.md\",\n      \"old\": \"title: Old\",\n      \"new\": \"title: New\"\n    },\n    {\"type\": \"build\"}\n  ]\n}\n```\n\nRun it with:\n\n```bash\nmarkata-go buildlab run \\\n  --fixture /path/to/site \\\n  --baseline /tmp/markata-go \\\n  --candidate /tmp/markata-go \\\n  --scenario title-change.json \\\n  --result buildlab-title-change.json\n```\n\nBuild Lab supports `build`, `write-file`, `replace-exact`, `delete-file`,\n`rename-file`, `copy-file`, `set-config`, `touch-file`, `clean-cache`, and\n`clear-output`. Paths stay inside the fixture, and `replace-exact` must match\nexactly one occurrence. Semantic mutations must be followed by a build.\n\nThe foundation covers clean, no-op, edit, add, delete, rename, linked-target,\nand configuration mutations. Add fixture-specific scenarios for other product\nsurfaces.\n\nA linked-target checkpoint compares the dependent page and its feed outputs.\nThe incremental build must rerender known dependents before feeds and pages are\nwritten. Unrelated posts must remain eligible for cache hits.\n\n## Read failures correctly\n\nBuild Lab is a measuring instrument. A result with `failure_class: \"product\"`\nmeans that a child build or an output comparison found a Markata-Go behavior\nproblem. It does not mean that the harness should be changed to hide the\nproblem. A `failure_class: \"harness\"` result means that the comparison itself\nwas not trustworthy, for example because of a timeout, output truncation, path\nviolation, or manifest error.\n\nProduct failures include concise diagnostics in the JSON result and on stderr.\nKnown failures can therefore be recorded while the foundation remains focused\non measurement.\n\nSetup errors also emit a versioned JSON result with `failure_class: \"harness\"`\nwhen the command reaches the Build Lab runner. Invalid command-line syntax is\nreported by the normal CLI parser instead.\n\n## Output classes\n\nManifest records are deterministic by default. Known minification and fontpack\nmetadata files are excluded because they are build state, not publishable\noutput. Use `--volatile` for known changing publishable paths, such as the\ndefault `.well-known/time` file:\n\n```bash\nmarkata-go buildlab run --fixture /path/to/site --volatile .well-known/time\n```\n\nUse `--check-determinism=false` only when a fixture cannot support the clean\nrebuild check. Keep that exception visible in CI configuration.\n\n## Isolation and environment\n\nUse the global `--merge-config` flag to apply a fixture-local profile to both\nchild binaries:\n\n```bash\nmarkata-go buildlab run --fixture /path/to/site --merge-config fast.toml\n```\n\nThe `--env` option accepts only `PATH`,\n`MARKATA_GO_ENCRYPTION_ENABLED`, and `MARKATA_GO_OFFLINE`. Build Lab does not\ninherit arbitrary environment variables, including proxies, cloud settings,\nGit settings, agent settings, or credentials.\n\n```bash\nmarkata-go buildlab run \\\n  --fixture /path/to/site \\\n  --env MARKATA_GO_ENCRYPTION_ENABLED=false\n```\n\nUse `--timeout` and `--gomaxprocs` to control execution. Record external tool\nversions with repeated comma-separated entries:\n\n```bash\nmarkata-go buildlab run \\\n  --fixture /path/to/site \\\n  --tool-version pagefind=1.5.2,tailwind=4.1.0\n```\n",
      "summary": "Compare clean and incremental Markata-Go builds in isolated workspaces",
      "date_published": "2026-08-31T00:00:00Z",
      "date_modified": "2026-08-31T00:00:00Z",
      "tags": [
        "documentation",
        "build-lab",
        "reproducibility"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/content-index/",
      "url": "https://markata.dev/docs/guides/content-index/",
      "title": "Content Index",
      "content_html": "\u003cp\u003eMarkata can write one compact JSON file with the metadata it resolved during a\nbuild. It does not include article bodies.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent_index\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;content-index.json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe file is written below \u003ccode\u003eoutput_dir\u003c/code\u003e unless \u003ccode\u003eoutput\u003c/code\u003e is absolute. Its\nidentity is \u003ccode\u003eschema = \u0026quot;markata.content-index\u0026quot;\u003c/code\u003e and its current generation is\n\u003ccode\u003eschema_version = 2\u003c/code\u003e. V2 emits \u003ccode\u003escope = \u0026quot;public-metadata\u0026quot;\u003c/code\u003e. This means the file\ncan contain safe metadata records for private posts; it never contains their\narticle bodies or encryption keys.\u003c/p\u003e\n\u003ch2 id=\"reading-the-file\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReading the file\u003c/span\u003e \u003ca href=\"#reading-the-file\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRead \u003ccode\u003eschema\u003c/code\u003e and \u003ccode\u003eschema_version\u003c/code\u003e before decoding. Ignore fields you do not\nknow. If the generation is newer than the reader supports, stop with a clear\nupgrade message. Do not guess how a future generation works.\u003c/p\u003e\n\u003cp\u003eUse each document\u0026rsquo;s repository-relative \u003ccode\u003epath\u003c/code\u003e to find its source file. The\n\u003ccode\u003efeeds\u003c/code\u003e array already contains resolved Markata feed membership. Consumers\nshould not implement Markata\u0026rsquo;s feed filter language again.\u003c/p\u003e\n\u003cp\u003eDocuments may also include optional resolved frontmatter and author metadata:\n\u003ccode\u003eimage\u003c/code\u003e, \u003ccode\u003evideo\u003c/code\u003e, \u003ccode\u003eavatar\u003c/code\u003e, \u003ccode\u003ebio\u003c/code\u003e, \u003ccode\u003ethumbnail\u003c/code\u003e, \u003ccode\u003ecover\u003c/code\u003e, \u003ccode\u003eog_image\u003c/code\u003e, \u003ccode\u003eauthor\u003c/code\u003e,\n\u003ccode\u003eauthors\u003c/code\u003e, \u003ccode\u003ecategory\u003c/code\u003e, and \u003ccode\u003ecategories\u003c/code\u003e. Media values are source references;\nMarkata does not copy or download those assets into the index. Author order is\npreserved. \u003ccode\u003ecover\u003c/code\u003e uses \u003ccode\u003ecover\u003c/code\u003e first and \u003ccode\u003ecover_image\u003c/code\u003e as a compatibility\nfallback. \u003ccode\u003eog_image\u003c/code\u003e uses \u003ccode\u003eog_image\u003c/code\u003e first and \u003ccode\u003esocial_image\u003c/code\u003e as a fallback.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003esource.commit\u003c/code\u003e identifies the Git \u003ccode\u003eHEAD\u003c/code\u003e observed for the build.\n\u003ccode\u003esource.dirty\u003c/code\u003e is false when the working tree was observed clean at the Content\nIndex source-state boundaries. It is true when Git reports tracked, staged,\ndeleted, untracked, or ignored Markdown source files. Compare both values with\nthe source repository revision before using metadata as a bootstrap cache.\nBoth fields are absent when Git cannot provide source state.\nMarkata captures this state before content discovery and rechecks it before\nwriting. A changing source state fails an enabled index write instead of\npublishing a mismatched identity.\u003c/p\u003e\n\u003cp\u003eThe pair \u003ccode\u003esource.commit\u003c/code\u003e plus \u003ccode\u003edirty: false\u003c/code\u003e is build provenance. It does not\nprove that every document came byte-for-byte from a blob in that Git revision.\nA source file can change and be restored between the two observations. Use Git\ncommit/blob identity, or another exact source identity mechanism, when exact\nper-file synchronization is required.\u003c/p\u003e\n\u003cp\u003eThe index includes non-draft, non-skipped posts, including private posts. A\n\u003ccode\u003epublished: false\u003c/code\u003e direct page may still appear. A feed named \u003ccode\u003edraft\u003c/code\u003e is feed\nmembership only and does not mean that the document has \u003ccode\u003edraft: true\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003ePrivate records contain only safe metadata. Titles and descriptions are present\nonly when they were explicitly provided in frontmatter; content-derived values,\narticle bodies, rendered HTML, key names, private media, and resolved author\nbiographies are omitted. Tags, dates, slugs, aliases, author identifiers,\ncategories, and an explicit avatar may remain. The \u003ccode\u003efeeds\u003c/code\u003e list for a private\nrecord contains only feeds configured with \u003ccode\u003einclude_private = true\u003c/code\u003e (or\n\u003ccode\u003eprivate = true\u003c/code\u003e).\u003c/p\u003e\n\u003cp\u003eMarkata retains readers for every released generation and normalizes them into\none current internal model. The index is not a source archive, rendered-body\ncache, access-control system, or guarantee that source files remain available.\nIf you disable the output, use a clean output directory or remove the old\nartifact before deployment.\u003c/p\u003e\n\u003cp\u003eThe v1 and v2 schemas and immutable interoperability fixtures are in\n\u003ccode\u003epkg/contentindex/v1_schema.json\u003c/code\u003e, \u003ccode\u003epkg/contentindex/v2_schema.json\u003c/code\u003e, and\n\u003ccode\u003epkg/contentindex/fixtures/\u003c/code\u003e. Set \u003ccode\u003eschema_version = 1\u003c/code\u003e when a consumer still\nrequires the public-only v1 artifact.\u003c/p\u003e\n",
      "content_text": "\n\nMarkata can write one compact JSON file with the metadata it resolved during a\nbuild. It does not include article bodies.\n\n```toml\n[markata-go.content_index]\nenabled = true\noutput = \"content-index.json\"\n```\n\nThe file is written below `output_dir` unless `output` is absolute. Its\nidentity is `schema = \"markata.content-index\"` and its current generation is\n`schema_version = 2`. V2 emits `scope = \"public-metadata\"`. This means the file\ncan contain safe metadata records for private posts; it never contains their\narticle bodies or encryption keys.\n\n## Reading the file\n\nRead `schema` and `schema_version` before decoding. Ignore fields you do not\nknow. If the generation is newer than the reader supports, stop with a clear\nupgrade message. Do not guess how a future generation works.\n\nUse each document's repository-relative `path` to find its source file. The\n`feeds` array already contains resolved Markata feed membership. Consumers\nshould not implement Markata's feed filter language again.\n\nDocuments may also include optional resolved frontmatter and author metadata:\n`image`, `video`, `avatar`, `bio`, `thumbnail`, `cover`, `og_image`, `author`,\n`authors`, `category`, and `categories`. Media values are source references;\nMarkata does not copy or download those assets into the index. Author order is\npreserved. `cover` uses `cover` first and `cover_image` as a compatibility\nfallback. `og_image` uses `og_image` first and `social_image` as a fallback.\n\n`source.commit` identifies the Git `HEAD` observed for the build.\n`source.dirty` is false when the working tree was observed clean at the Content\nIndex source-state boundaries. It is true when Git reports tracked, staged,\ndeleted, untracked, or ignored Markdown source files. Compare both values with\nthe source repository revision before using metadata as a bootstrap cache.\nBoth fields are absent when Git cannot provide source state.\nMarkata captures this state before content discovery and rechecks it before\nwriting. A changing source state fails an enabled index write instead of\npublishing a mismatched identity.\n\nThe pair `source.commit` plus `dirty: false` is build provenance. It does not\nprove that every document came byte-for-byte from a blob in that Git revision.\nA source file can change and be restored between the two observations. Use Git\ncommit/blob identity, or another exact source identity mechanism, when exact\nper-file synchronization is required.\n\nThe index includes non-draft, non-skipped posts, including private posts. A\n`published: false` direct page may still appear. A feed named `draft` is feed\nmembership only and does not mean that the document has `draft: true`.\n\nPrivate records contain only safe metadata. Titles and descriptions are present\nonly when they were explicitly provided in frontmatter; content-derived values,\narticle bodies, rendered HTML, key names, private media, and resolved author\nbiographies are omitted. Tags, dates, slugs, aliases, author identifiers,\ncategories, and an explicit avatar may remain. The `feeds` list for a private\nrecord contains only feeds configured with `include_private = true` (or\n`private = true`).\n\nMarkata retains readers for every released generation and normalizes them into\none current internal model. The index is not a source archive, rendered-body\ncache, access-control system, or guarantee that source files remain available.\nIf you disable the output, use a clean output directory or remove the old\nartifact before deployment.\n\nThe v1 and v2 schemas and immutable interoperability fixtures are in\n`pkg/contentindex/v1_schema.json`, `pkg/contentindex/v2_schema.json`, and\n`pkg/contentindex/fixtures/`. Set `schema_version = 1` when a consumer still\nrequires the public-only v1 artifact.\n",
      "summary": "Use Markata's stable metadata index for search and tooling.",
      "date_published": "2026-08-15T00:00:00Z",
      "date_modified": "2026-08-15T00:00:00Z",
      "tags": [
        "documentation",
        "content-index"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/rendering-merge-readiness/",
      "url": "https://markata.dev/docs/guides/rendering-merge-readiness/",
      "title": "Rendering migration merge-readiness evidence",
      "content_html": "\u003cp\u003eThis record closes the rendering-contract acceptance checklist. It does not\nclaim full application WCAG compliance or exact cross-browser pixel parity.\u003c/p\u003e\n\u003ch2 id=\"commands-and-outcomes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommands and outcomes\u003c/span\u003e \u003ca href=\"#commands-and-outcomes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"markata-go\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMarkata-Go\u003c/span\u003e \u003ca href=\"#markata-go\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAll commands passed:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego run ./scripts/rendering-contract --check\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego test ./...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego vet ./...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego build ./cmd/markata-go\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego test ./pkg/renderingcontract -run TestContract_FinalRenderSweepCoversEveryCanonicalPalette -count=1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit diff --check\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe final CSS projection sweep audited 120 canonical variants: 120 audited,\n120 passing, 0 failing. The contract contains 60 light/dark families.\u003c/p\u003e\n\u003ch3 id=\"theme-lab\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTheme Lab\u003c/span\u003e \u003ca href=\"#theme-lab\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAll commands passed:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebun test                         # 10 pass, 0 fail\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejust browser-regression          # 3 pass, 0 fail, 45 assertions\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit diff --check\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe browser matrix uses \u003ccode\u003ebrush-poster\u003c/code\u003e, waits for the Knewave font load,\nchecks H1-H6 fixture geometry and bounds, and captures six generated\nscreenshots: none, splatter 0, splatter half, splatter full, dry-brush half,\nand screenprint half. The zero/none geometry is equal, intermediate/full and\nrecipe masks differ, and the headings remain inside the preview bounds.\u003c/p\u003e\n\u003ch3 id=\"plaindown\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlaindown\u003c/span\u003e \u003ca href=\"#plaindown\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFocused and browser checks passed:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebun test tests/markata-theme.test.js tests/editor-theme-accessibility.test.js tests/render-plan-fixtures.test.js\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejust browser-regression          # 22 pass, 0 fail, 130 assertions across 2 browser files\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit diff --check\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe browser files include two Plaindown rendering-regression tests plus the\nexisting browser smoke tests. The suite asserts both Site and Editor mode\nstates, including Site-mode canonical variables and Editor-mode ownership.\u003c/p\u003e\n\u003cp\u003eThe full suite is a baseline, not a rendering gate:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurrent worktree: 415 pass, 18 fail, 2 errors\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eorigin/main:     389 pass, 20 fail, 4 errors\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe 16 named assertion failures are identical in both runs: selectable-hunk\nreview, draft/discard persistence, file-tree actions, navigation aliases,\nfrontmatter media completion, semantic preview routing, remote update actions,\nwikilink resolution, stale-route recovery, draft deep links, live-preview\ndebouncing, and repository-content sweep checks. The two unhandled errors are\nenvironment/dependency failures (\u003ccode\u003e@codemirror/*\u003c/code\u003e/vendor \u003ccode\u003efflate\u003c/code\u003e), not\nrendering changes.\u003c/p\u003e\n\u003ch2 id=\"evidence-boundaries\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEvidence boundaries\u003c/span\u003e \u003ca href=\"#evidence-boundaries\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eGo, Theme Lab, and Plaindown intentionally use different rendering recipes:\nGo emits generated site CSS, Theme Lab is the visual reference, and\nPlaindown owns editor chrome while Site mode projects the contract. Their\nshared evidence is normalized state, complete render plans, semantic roles,\nand final CSS variables—not identical implementation details.\u003c/li\u003e\n\u003cli\u003ePlaindown browser endpoint checks exercise texture, heading-mask, and motif\nvalues at 0, 0.5, and 1. They verify readable heading contrast and that\nmotif color mix changes the image, not layer opacity.\u003c/li\u003e\n\u003cli\u003ePlaindown editor source-to-final-variable accessibility uses the separate\neditor projection audit for every editor-owned theme plus representative\nbrowser checks of final body, muted, and boundary variables.\u003c/li\u003e\n\u003cli\u003eChromium is available and passes. Firefox/WebKit smoke execution is not\nclaimed: installed browser binaries are older than the Playwright package\u0026rsquo;s\nrequested revisions, and no large download was performed.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"repository-hygiene-and-payload\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRepository hygiene and payload\u003c/span\u003e \u003ca href=\"#repository-hygiene-and-payload\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe intended files are the source, tests, generated contract projections,\ndocs, checklist, and Theme Lab \u003ccode\u003epackage.json\u003c/code\u003e/\u003ccode\u003ebun.lock\u003c/code\u003e. Theme Lab\n\u003ccode\u003enode_modules/\u003c/code\u003e and \u003ccode\u003etest-results/\u003c/code\u003e are ignored and are not intended for the\nPR. Browser screenshots are transient review artifacts.\u003c/p\u003e\n\u003cp\u003eThe contract JSON and generated consumer contract are about 34.7 KB and 39.6\nKB respectively. Theme Lab\u0026rsquo;s HTML is about 160 KB; Plaindown\u0026rsquo;s rendering\ncontract and theme module are about 39.7 KB and 38.8 KB. Theme Lab declares all\nfont families in one CSS import for its catalog, but font-face files are\nrequested by browser use; no 120-palette asset requests were observed.\u003c/p\u003e\n\u003cp\u003eThe public authoring names audited and frozen are \u003ccode\u003epalette\u003c/code\u003e, \u003ccode\u003eaesthetic\u003c/code\u003e,\n\u003ccode\u003efontpack\u003c/code\u003e, the nested \u003ccode\u003etexture\u003c/code\u003e, \u003ccode\u003eheading_texture\u003c/code\u003e, and \u003ccode\u003emotif\u003c/code\u003e fields, and\n\u003ccode\u003evariables\u003c/code\u003e. No accepted public field is silently ignored.\u003c/p\u003e\n",
      "content_text": "\n\nThis record closes the rendering-contract acceptance checklist. It does not\nclaim full application WCAG compliance or exact cross-browser pixel parity.\n\n## Commands and outcomes\n\n### Markata-Go\n\nAll commands passed:\n\n```text\ngo run ./scripts/rendering-contract --check\ngo test ./...\ngo vet ./...\ngo build ./cmd/markata-go\ngo test ./pkg/renderingcontract -run TestContract_FinalRenderSweepCoversEveryCanonicalPalette -count=1\ngit diff --check\n```\n\nThe final CSS projection sweep audited 120 canonical variants: 120 audited,\n120 passing, 0 failing. The contract contains 60 light/dark families.\n\n### Theme Lab\n\nAll commands passed:\n\n```text\nbun test                         # 10 pass, 0 fail\njust browser-regression          # 3 pass, 0 fail, 45 assertions\ngit diff --check\n```\n\nThe browser matrix uses `brush-poster`, waits for the Knewave font load,\nchecks H1-H6 fixture geometry and bounds, and captures six generated\nscreenshots: none, splatter 0, splatter half, splatter full, dry-brush half,\nand screenprint half. The zero/none geometry is equal, intermediate/full and\nrecipe masks differ, and the headings remain inside the preview bounds.\n\n### Plaindown\n\nFocused and browser checks passed:\n\n```text\nbun test tests/markata-theme.test.js tests/editor-theme-accessibility.test.js tests/render-plan-fixtures.test.js\njust browser-regression          # 22 pass, 0 fail, 130 assertions across 2 browser files\ngit diff --check\n```\n\nThe browser files include two Plaindown rendering-regression tests plus the\nexisting browser smoke tests. The suite asserts both Site and Editor mode\nstates, including Site-mode canonical variables and Editor-mode ownership.\n\nThe full suite is a baseline, not a rendering gate:\n\n```text\ncurrent worktree: 415 pass, 18 fail, 2 errors\norigin/main:     389 pass, 20 fail, 4 errors\n```\n\nThe 16 named assertion failures are identical in both runs: selectable-hunk\nreview, draft/discard persistence, file-tree actions, navigation aliases,\nfrontmatter media completion, semantic preview routing, remote update actions,\nwikilink resolution, stale-route recovery, draft deep links, live-preview\ndebouncing, and repository-content sweep checks. The two unhandled errors are\nenvironment/dependency failures (`@codemirror/*`/vendor `fflate`), not\nrendering changes.\n\n## Evidence boundaries\n\n- Go, Theme Lab, and Plaindown intentionally use different rendering recipes:\n  Go emits generated site CSS, Theme Lab is the visual reference, and\n  Plaindown owns editor chrome while Site mode projects the contract. Their\n  shared evidence is normalized state, complete render plans, semantic roles,\n  and final CSS variables—not identical implementation details.\n- Plaindown browser endpoint checks exercise texture, heading-mask, and motif\n  values at 0, 0.5, and 1. They verify readable heading contrast and that\n  motif color mix changes the image, not layer opacity.\n- Plaindown editor source-to-final-variable accessibility uses the separate\n  editor projection audit for every editor-owned theme plus representative\n  browser checks of final body, muted, and boundary variables.\n- Chromium is available and passes. Firefox/WebKit smoke execution is not\n  claimed: installed browser binaries are older than the Playwright package's\n  requested revisions, and no large download was performed.\n\n## Repository hygiene and payload\n\nThe intended files are the source, tests, generated contract projections,\ndocs, checklist, and Theme Lab `package.json`/`bun.lock`. Theme Lab\n`node_modules/` and `test-results/` are ignored and are not intended for the\nPR. Browser screenshots are transient review artifacts.\n\nThe contract JSON and generated consumer contract are about 34.7 KB and 39.6\nKB respectively. Theme Lab's HTML is about 160 KB; Plaindown's rendering\ncontract and theme module are about 39.7 KB and 38.8 KB. Theme Lab declares all\nfont families in one CSS import for its catalog, but font-face files are\nrequested by browser use; no 120-palette asset requests were observed.\n\nThe public authoring names audited and frozen are `palette`, `aesthetic`,\n`fontpack`, the nested `texture`, `heading_texture`, and `motif` fields, and\n`variables`. No accepted public field is silently ignored.\n",
      "summary": "Validation record for the versioned rendering contract migration.",
      "date_published": "2026-08-10T00:00:00Z",
      "date_modified": "2026-08-10T00:00:00Z",
      "tags": [
        "documentation",
        "rendering",
        "migration"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/rendering-contract/",
      "url": "https://markata.dev/docs/guides/rendering-contract/",
      "title": "Rendering presentation contract",
      "content_html": "\u003cp\u003eMarkata-Go uses rendering contract version 1 for portable presentation settings.\nThe authoring source is \u003ccode\u003espec/rendering-contract/contract-v1.json\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"canonical-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCanonical configuration\u003c/span\u003e \u003ca href=\"#canonical-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePut theme-level settings under \u003ccode\u003e[markata-go.theme]\u003c/code\u003e. Put texture, heading\ntexture, motif, and variable settings under their nested tables.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtract_version\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ayu-dark\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eaesthetic\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;minimal\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efontpack\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;brush-poster\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecustom_css\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;custom.css\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etexture\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ekind\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;screenprint\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecolor_mix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.35\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escale\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e1.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escope\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;all\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eheading_texture\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ekind\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;inherit\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecolor_mix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.45\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escale\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e1.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emotif\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ekind\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;block-w\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eglyph\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;W\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esize\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;78px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egap\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;10px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erow_offset\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.24\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewobble\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.18\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escatter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elayer\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;sandwich\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecolor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ink\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecolor_mix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.01\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://waylonwalker.com/w.svg\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--content-width\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;68ch\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe motif is off by default (\u003ccode\u003ekind = \u0026quot;off\u0026quot;\u003c/code\u003e); the example above enables the\n\u003ccode\u003eblock-w\u003c/code\u003e motif explicitly.\u003c/p\u003e\n\u003cp\u003eIn TOML, a key belongs to the current table until another table header\nappears. Keep \u003ccode\u003ecustom_css\u003c/code\u003e in \u003ccode\u003e[markata-go.theme]\u003c/code\u003e, not in \u003ccode\u003emotif\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"contract-values\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContract values\u003c/span\u003e \u003ca href=\"#contract-values\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe contract defines the shared IDs, defaults, enums, and bounds. Use its\npalette IDs, aesthetic IDs, fontpack IDs, texture kinds, heading texture kinds,\nmotif kinds, colors, layers, and scopes.\u003c/p\u003e\n\u003cp\u003eThe canonical dials use numbers:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecolor_mix\u003c/code\u003e, \u003ccode\u003erow_offset\u003c/code\u003e, \u003ccode\u003ewobble\u003c/code\u003e, and \u003ccode\u003escatter\u003c/code\u003e: \u003ccode\u003e0..1\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etexture.scale\u003c/code\u003e and \u003ccode\u003eheading_texture.scale\u003c/code\u003e: \u003ccode\u003e0.25..3\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ccode\u003eheading_texture.kind = \u0026quot;inherit\u0026quot;\u003c/code\u003e uses the surface texture kind while keeping\nthe heading texture\u0026rsquo;s own mix and scale.\u003c/p\u003e\n\u003cp\u003eFontpacks assign the named roles \u003ccode\u003ebody\u003c/code\u003e, \u003ccode\u003eheading\u003c/code\u003e, and \u003ccode\u003emono\u003c/code\u003e. Select a\nfontpack instead of inventing role names in site configuration.\u003c/p\u003e\n\u003ch2 id=\"migration-from-flat-settings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMigration from flat settings\u003c/span\u003e \u003ca href=\"#migration-from-flat-settings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eContract version 1 accepts legacy flat settings as migration inputs. Canonical\nnested values always win when both forms are present. The loader reports a\nwarning when the values conflict. Canonical serialization emits only nested\nsettings.\u003c/p\u003e\n\u003cp\u003eThe legacy \u003ccode\u003etexture_scope = \u0026quot;headings\u0026quot;\u003c/code\u003e value means headings-only behavior.\nDo not convert it to \u003ccode\u003etheme.texture.scope = \u0026quot;headings\u0026quot;\u003c/code\u003e; \u003ccode\u003eheadings\u003c/code\u003e is not a\ncanonical scope. The migration keeps the texture kind in\n\u003ccode\u003etheme.heading_texture.kind\u003c/code\u003e and sets the surface texture scope to \u003ccode\u003equiet\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eOther documented aliases include \u003ccode\u003etexture_strength\u003c/code\u003e,\n\u003ccode\u003eheading_texture_strength\u003c/code\u003e, \u003ccode\u003emotif_color_distance\u003c/code\u003e, \u003ccode\u003etexture_scale\u003c/code\u003e,\n\u003ccode\u003eheading_texture_scale\u003c/code\u003e, \u003ccode\u003emotif_row_offset\u003c/code\u003e, \u003ccode\u003emotif_wobble\u003c/code\u003e,\n\u003ccode\u003emotif_scatter\u003c/code\u003e, \u003ccode\u003emotif_layer\u003c/code\u003e, and \u003ccode\u003emotif_color\u003c/code\u003e. See\n\u003ccode\u003espec/rendering-contract/MIGRATIONS.md\u003c/code\u003e for the complete mapping.\u003c/p\u003e\n\u003ch2 id=\"add-or-change-contract-data\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdd or change contract data\u003c/span\u003e \u003ca href=\"#add-or-change-contract-data\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eChange \u003ccode\u003econtract-v1.json\u003c/code\u003e first when you add a shared palette family, palette\nvariant, fontpack, aesthetic, texture, motif value, default, bound, or alias.\nDo not edit generated projections by hand. Regenerate them from the repository\nroot, then run the generated-artifact check:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego run ./scripts/rendering-contract\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego run ./scripts/rendering-contract --check\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe generator also targets supported consumer repositories. Run it only when\nthose repositories are available, and do not add a local registry instead.\u003c/p\u003e\n\u003ch3 id=\"new-site\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNew site\u003c/span\u003e \u003ca href=\"#new-site\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eStart with the canonical example above. Select one palette ID, aesthetic, and\nfontpack. \u003ccode\u003etheme.fontpack\u003c/code\u003e accepts contract fontpack IDs and any pack or alias\nin the font catalog (\u003ccode\u003emarkata-go fonts packs\u003c/code\u003e, or your \u003ccode\u003efontpacks_file\u003c/code\u003e). Validate the site with the contract check and the\nfocused configuration tests before adding local variables.\u003c/p\u003e\n\u003ch3 id=\"new-palette\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNew palette\u003c/span\u003e \u003ca href=\"#new-palette\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd the family and both \u003ccode\u003elight\u003c/code\u003e and \u003ccode\u003edark\u003c/code\u003e variants to \u003ccode\u003econtract-v1.json\u003c/code\u003e.\nInclude explicit family, variant, name, and semantic role metadata. Regenerate\nall projections and run the 120-variant final-CSS sweep.\u003c/p\u003e\n\u003ch3 id=\"new-dial\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNew dial\u003c/span\u003e \u003ca href=\"#new-dial\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd the field, default, bounds, and migration alias to the contract first.\nThen update normalization, serialization, render plans, CSS projection,\ncompletion, and browser fixtures in Go, Plaindown, and Theme Lab. The drift\ncheck must pass before the dial is accepted.\u003c/p\u003e\n\u003ch2 id=\"validation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eValidation\u003c/span\u003e \u003ca href=\"#validation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCheck a palette after changing its roles or colors:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette check ayu-dark\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette check ayu-dark --strict\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRun \u003ccode\u003ego run ./scripts/rendering-contract --check\u003c/code\u003e after contract changes.\nRun \u003ccode\u003ego test ./pkg/config ./pkg/renderingcontract\u003c/code\u003e to exercise configuration\nmigration and contract loading.\u003c/p\u003e\n\u003ch2 id=\"wcag-aa-color-gate\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWCAG AA color gate\u003c/span\u003e \u003ca href=\"#wcag-aa-color-gate\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe rendering/theme gate checks the final semantic projection used by generated\nCSS. Normal text, metadata, headings, links, code tokens, and button text use\n4.5:1. Controls, focus indicators, borders that identify controls, status\ncolors, and other non-text UI use 3:1. A role is not treated as large text\nbecause its name says muted, secondary, or comment.\u003c/p\u003e\n\u003cp\u003eDecorative texture, motif, and shadow layers have no independent contrast target,\nbut their mix and opacity must not lower readable content below these limits.\nAAA is reported separately and is optional.\u003c/p\u003e\n\u003cp\u003eThe canonical palette sweep validates every catalog variant and records the\nfinal foreground/background pair and ratio. Plaindown Editor themes use a\nseparate sweep because Editor mode owns its chrome; Site mode uses the canonical\nMarkata palette projection. Both sweeps are required before changing a palette\nor editor theme.\u003c/p\u003e\n",
      "content_text": "\n\nMarkata-Go uses rendering contract version 1 for portable presentation settings.\nThe authoring source is `spec/rendering-contract/contract-v1.json`.\n\n## Canonical configuration\n\nPut theme-level settings under `[markata-go.theme]`. Put texture, heading\ntexture, motif, and variable settings under their nested tables.\n\n```toml\n[markata-go.theme]\ncontract_version = 1\npalette = \"ayu-dark\"\naesthetic = \"minimal\"\nfontpack = \"brush-poster\"\ncustom_css = \"custom.css\"\n\n[markata-go.theme.texture]\nkind = \"screenprint\"\ncolor_mix = 0.35\nscale = 1.0\nscope = \"all\"\n\n[markata-go.theme.heading_texture]\nkind = \"inherit\"\ncolor_mix = 0.45\nscale = 1.0\n\n[markata-go.theme.motif]\nkind = \"block-w\"\nglyph = \"W\"\nsize = \"78px\"\ngap = \"10px\"\nrow_offset = 0.24\nwobble = 0.18\nscatter = 0.0\nlayer = \"sandwich\"\ncolor = \"ink\"\ncolor_mix = 0.01\nurl = \"https://waylonwalker.com/w.svg\"\n\n[markata-go.theme.variables]\n\"--content-width\" = \"68ch\"\n```\n\nThe motif is off by default (`kind = \"off\"`); the example above enables the\n`block-w` motif explicitly.\n\nIn TOML, a key belongs to the current table until another table header\nappears. Keep `custom_css` in `[markata-go.theme]`, not in `motif`.\n\n## Contract values\n\nThe contract defines the shared IDs, defaults, enums, and bounds. Use its\npalette IDs, aesthetic IDs, fontpack IDs, texture kinds, heading texture kinds,\nmotif kinds, colors, layers, and scopes.\n\nThe canonical dials use numbers:\n\n- `color_mix`, `row_offset`, `wobble`, and `scatter`: `0..1`\n- `texture.scale` and `heading_texture.scale`: `0.25..3`\n\n`heading_texture.kind = \"inherit\"` uses the surface texture kind while keeping\nthe heading texture's own mix and scale.\n\nFontpacks assign the named roles `body`, `heading`, and `mono`. Select a\nfontpack instead of inventing role names in site configuration.\n\n## Migration from flat settings\n\nContract version 1 accepts legacy flat settings as migration inputs. Canonical\nnested values always win when both forms are present. The loader reports a\nwarning when the values conflict. Canonical serialization emits only nested\nsettings.\n\nThe legacy `texture_scope = \"headings\"` value means headings-only behavior.\nDo not convert it to `theme.texture.scope = \"headings\"`; `headings` is not a\ncanonical scope. The migration keeps the texture kind in\n`theme.heading_texture.kind` and sets the surface texture scope to `quiet`.\n\nOther documented aliases include `texture_strength`,\n`heading_texture_strength`, `motif_color_distance`, `texture_scale`,\n`heading_texture_scale`, `motif_row_offset`, `motif_wobble`,\n`motif_scatter`, `motif_layer`, and `motif_color`. See\n`spec/rendering-contract/MIGRATIONS.md` for the complete mapping.\n\n## Add or change contract data\n\nChange `contract-v1.json` first when you add a shared palette family, palette\nvariant, fontpack, aesthetic, texture, motif value, default, bound, or alias.\nDo not edit generated projections by hand. Regenerate them from the repository\nroot, then run the generated-artifact check:\n\n```bash\ngo run ./scripts/rendering-contract\ngo run ./scripts/rendering-contract --check\n```\n\nThe generator also targets supported consumer repositories. Run it only when\nthose repositories are available, and do not add a local registry instead.\n\n### New site\n\nStart with the canonical example above. Select one palette ID, aesthetic, and\nfontpack. `theme.fontpack` accepts contract fontpack IDs and any pack or alias\nin the font catalog (`markata-go fonts packs`, or your `fontpacks_file`). Validate the site with the contract check and the\nfocused configuration tests before adding local variables.\n\n### New palette\n\nAdd the family and both `light` and `dark` variants to `contract-v1.json`.\nInclude explicit family, variant, name, and semantic role metadata. Regenerate\nall projections and run the 120-variant final-CSS sweep.\n\n### New dial\n\nAdd the field, default, bounds, and migration alias to the contract first.\nThen update normalization, serialization, render plans, CSS projection,\ncompletion, and browser fixtures in Go, Plaindown, and Theme Lab. The drift\ncheck must pass before the dial is accepted.\n\n## Validation\n\nCheck a palette after changing its roles or colors:\n\n```bash\nmarkata-go palette check ayu-dark\nmarkata-go palette check ayu-dark --strict\n```\n\nRun `go run ./scripts/rendering-contract --check` after contract changes.\nRun `go test ./pkg/config ./pkg/renderingcontract` to exercise configuration\nmigration and contract loading.\n\n## WCAG AA color gate\n\nThe rendering/theme gate checks the final semantic projection used by generated\nCSS. Normal text, metadata, headings, links, code tokens, and button text use\n4.5:1. Controls, focus indicators, borders that identify controls, status\ncolors, and other non-text UI use 3:1. A role is not treated as large text\nbecause its name says muted, secondary, or comment.\n\nDecorative texture, motif, and shadow layers have no independent contrast target,\nbut their mix and opacity must not lower readable content below these limits.\nAAA is reported separately and is optional.\n\nThe canonical palette sweep validates every catalog variant and records the\nfinal foreground/background pair and ratio. Plaindown Editor themes use a\nseparate sweep because Editor mode owns its chrome; Site mode uses the canonical\nMarkata palette projection. Both sweeps are required before changing a palette\nor editor theme.\n",
      "summary": "Configure portable palettes, typography, texture, and motif settings with the shared rendering contract.",
      "date_published": "2026-08-09T00:00:00Z",
      "date_modified": "2026-08-09T00:00:00Z",
      "tags": [
        "documentation",
        "themes",
        "rendering"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/fonts/",
      "url": "https://markata.dev/docs/guides/fonts/",
      "title": "Font packs",
      "content_html": "\u003cp\u003eMarkata defaults to the offline \u003ccode\u003esystem\u003c/code\u003e pack. It makes no external font\nrequests and emits no font binaries. To choose another pack, add this to the\nsite configuration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003efontpack\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esystem-reader\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe same value can be set as \u003ccode\u003etheme.fontpack\u003c/code\u003e. Any pack or alias listed by\n\u003ccode\u003emarkata-go fonts packs\u003c/code\u003e is valid. When \u003ccode\u003efontpacks_file\u003c/code\u003e is set, names are\nchecked against that catalog when the site builds.\u003c/p\u003e\n\u003cp\u003eCatalog-defined bundled packs use vendored, stable WOFF2 tiers. The built-in\ncatalog, manifests, licenses, and font assets are embedded in the executable,\nso these packs work from an installed or GoReleaser binary in any working\ndirectory. Bundled builds do not run Python or FontTools during \u003ccode\u003emarkata build\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThe generated \u003ccode\u003ecss/fonts.css\u003c/code\u003e has a content-hashed URL for caching. Pages\npreload the emitted WOFF2 files for their body and main heading ahead of CSS;\nper-page overrides use their own pack. A stored picker choice is restored\nbefore paint and preloads that choice too. Nonempty editorial feeds also preload\nthe code face used by their visible week labels, so layout does not have to\ndiscover that font later. Calendar controls reserve their space while loading\nto keep the archive toolbar stable. Shared sources are fetched once, and system code\nstacks need no download. Other layouts keep code fonts on demand. Additional\nscript coverage also loads when needed. Font faces use\n\u003ccode\u003efont-display: swap\u003c/code\u003e, so slow networks can still briefly show fallback text;\npreloading reduces that delay without forcing fallback fonts permanently.\u003c/p\u003e\n\u003cp\u003eSystem packs use local system stacks and transfer zero font files. Custom packs\nare loaded from an explicit catalog and may reference local assets. Relative\npaths in a custom catalog are resolved relative to the catalog file, not the\ncurrent working directory.\u003c/p\u003e\n\u003cp\u003eInspect the catalog with:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go fonts packs\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go fonts show system\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go fonts doctor\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go fonts verify\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go fonts report\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"compare-packs-on-one-site\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCompare packs on one site\u003c/span\u003e \u003ca href=\"#compare-packs-on-one-site\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"painted-sign\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePainted Sign\u003c/span\u003e \u003ca href=\"#painted-sign\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003epainted-sign\u003c/code\u003e combines Finger Paint display lettering with scratchy Rock Salt\nheadings and accents over a clean Source Sans 3 prose stack. DM Mono remains\navailable for code, so the expressive hierarchy does not compromise reading.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003efontpack\u003c/code\u003e frontmatter field overrides the site default for one page:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Brush comparison\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003efontpack\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebrush-poster\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAll selected page packs share one generated stylesheet and deduplicated asset\nset. The comparison pages in \u003ccode\u003epages/post/test-*.md\u003c/code\u003e use this mechanism.\u003c/p\u003e\n\u003cp\u003eMarkata tracks emitted files in \u003ccode\u003eoutput/assets/fonts/.markata-fonts.json\u003c/code\u003e.\nSwitching packs removes obsolete Markata-generated files while preserving\nunrelated user-managed files in the same directory.\u003c/p\u003e\n\u003cp\u003eOn warm builds, pages that already select the resolved pack keep their existing\nHTML rather than copying the page body just to reapply the root attribute.\nChanging the site or per-page pack still updates \u003ccode\u003edata-fontpack\u003c/code\u003e; custom\nattributes and quoted values on the HTML element are preserved. Font catalog,\nglyph coverage, preloads, and missing output files are still checked normally.\u003c/p\u003e\n\u003cp\u003eCold resolution streams article HTML through one shared visible-character\nanalysis. Repeated characters and repeated pack selections do not repeat that\nwork, and a family\u0026rsquo;s coverage checks stop once its full tier is required.\nThis does not change font choices or run a subsetter during your build.\u003c/p\u003e\n\u003cp\u003eBuilt-in output caching tracks visible coverage, the default pack, effective\npack choices, picker settings, and bundled catalog/manifest revisions.\nReordering equivalent selections or using equivalent aliases does not invalidate\nthe cache. Missing generated stylesheets or fonts are regenerated through the\nsame accelerated resolver; custom catalogs still validate their asset checksums.\nA new cache schema or bundled metadata revision causes one fresh resolution.\u003c/p\u003e\n\u003cp\u003eCoverage is selected per font family. A family gets \u003ccode\u003elatin-ext\u003c/code\u003e only when its\nmanifest provides that tier; otherwise Markata falls back to that family\u0026rsquo;s\n\u003ccode\u003efull\u003c/code\u003e tier, so expressive faces without extended subsets still render all\ntext. Role \u003ccode\u003eweight\u003c/code\u003e, \u003ccode\u003estyle\u003c/code\u003e, \u003ccode\u003esize\u003c/code\u003e, and \u003ccode\u003eoptical_size\u003c/code\u003e values are emitted as\nCSS properties and applied to the corresponding body, heading, code, lead,\nquote, and caption elements.\nWhen multiple packs are used, role variables and declarations are scoped to\n\u003ccode\u003e[data-fontpack=\u0026quot;...\u0026quot;]\u003c/code\u003e; optional properties from one pack cannot affect\nanother pack. A missing specialized role falls back to \u003ccode\u003ebody\u003c/code\u003e as a whole, but\nan existing specialized role does not inherit optional properties that it did\nnot configure. For example, a quote role without \u003ccode\u003eoptical_size\u003c/code\u003e will not pick\nup the body\u0026rsquo;s optical-size setting.\u003c/p\u003e\n\u003cp\u003eThe maintenance generator reads variable-font \u003ccode\u003efvar\u003c/code\u003e axes from the source\nfont, including their real weight and optical-size bounds. To check generated\nmanifests without rewriting them, run it with \u003ccode\u003e--check\u003c/code\u003e and the pinned\ngoogle/fonts checkout.\u003c/p\u003e\n\u003cp\u003eRegenerate the comparison pages after changing the catalog with:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv run --with pyyaml python scripts/generate_fontpack_demos.py\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n\nMarkata defaults to the offline `system` pack. It makes no external font\nrequests and emits no font binaries. To choose another pack, add this to the\nsite configuration:\n\n```yaml\nfontpack: system-reader\n```\n\nThe same value can be set as `theme.fontpack`. Any pack or alias listed by\n`markata-go fonts packs` is valid. When `fontpacks_file` is set, names are\nchecked against that catalog when the site builds.\n\nCatalog-defined bundled packs use vendored, stable WOFF2 tiers. The built-in\ncatalog, manifests, licenses, and font assets are embedded in the executable,\nso these packs work from an installed or GoReleaser binary in any working\ndirectory. Bundled builds do not run Python or FontTools during `markata build`.\n\nThe generated `css/fonts.css` has a content-hashed URL for caching. Pages\npreload the emitted WOFF2 files for their body and main heading ahead of CSS;\nper-page overrides use their own pack. A stored picker choice is restored\nbefore paint and preloads that choice too. Nonempty editorial feeds also preload\nthe code face used by their visible week labels, so layout does not have to\ndiscover that font later. Calendar controls reserve their space while loading\nto keep the archive toolbar stable. Shared sources are fetched once, and system code\nstacks need no download. Other layouts keep code fonts on demand. Additional\nscript coverage also loads when needed. Font faces use\n`font-display: swap`, so slow networks can still briefly show fallback text;\npreloading reduces that delay without forcing fallback fonts permanently.\n\nSystem packs use local system stacks and transfer zero font files. Custom packs\nare loaded from an explicit catalog and may reference local assets. Relative\npaths in a custom catalog are resolved relative to the catalog file, not the\ncurrent working directory.\n\nInspect the catalog with:\n\n```text\nmarkata-go fonts packs\nmarkata-go fonts show system\nmarkata-go fonts doctor\nmarkata-go fonts verify\nmarkata-go fonts report\n```\n\n## Compare packs on one site\n\n### Painted Sign\n\n`painted-sign` combines Finger Paint display lettering with scratchy Rock Salt\nheadings and accents over a clean Source Sans 3 prose stack. DM Mono remains\navailable for code, so the expressive hierarchy does not compromise reading.\n\nThe `fontpack` frontmatter field overrides the site default for one page:\n\n```yaml\n---\ntitle: \"Brush comparison\"\nfontpack: brush-poster\n---\n```\n\nAll selected page packs share one generated stylesheet and deduplicated asset\nset. The comparison pages in `pages/post/test-*.md` use this mechanism.\n\nMarkata tracks emitted files in `output/assets/fonts/.markata-fonts.json`.\nSwitching packs removes obsolete Markata-generated files while preserving\nunrelated user-managed files in the same directory.\n\nOn warm builds, pages that already select the resolved pack keep their existing\nHTML rather than copying the page body just to reapply the root attribute.\nChanging the site or per-page pack still updates `data-fontpack`; custom\nattributes and quoted values on the HTML element are preserved. Font catalog,\nglyph coverage, preloads, and missing output files are still checked normally.\n\nCold resolution streams article HTML through one shared visible-character\nanalysis. Repeated characters and repeated pack selections do not repeat that\nwork, and a family's coverage checks stop once its full tier is required.\nThis does not change font choices or run a subsetter during your build.\n\nBuilt-in output caching tracks visible coverage, the default pack, effective\npack choices, picker settings, and bundled catalog/manifest revisions.\nReordering equivalent selections or using equivalent aliases does not invalidate\nthe cache. Missing generated stylesheets or fonts are regenerated through the\nsame accelerated resolver; custom catalogs still validate their asset checksums.\nA new cache schema or bundled metadata revision causes one fresh resolution.\n\nCoverage is selected per font family. A family gets `latin-ext` only when its\nmanifest provides that tier; otherwise Markata falls back to that family's\n`full` tier, so expressive faces without extended subsets still render all\ntext. Role `weight`, `style`, `size`, and `optical_size` values are emitted as\nCSS properties and applied to the corresponding body, heading, code, lead,\nquote, and caption elements.\nWhen multiple packs are used, role variables and declarations are scoped to\n`[data-fontpack=\"...\"]`; optional properties from one pack cannot affect\nanother pack. A missing specialized role falls back to `body` as a whole, but\nan existing specialized role does not inherit optional properties that it did\nnot configure. For example, a quote role without `optical_size` will not pick\nup the body's optical-size setting.\n\nThe maintenance generator reads variable-font `fvar` axes from the source\nfont, including their real weight and optical-size bounds. To check generated\nmanifests without rewriting them, run it with `--check` and the pinned\ngoogle/fonts checkout.\n\nRegenerate the comparison pages after changing the catalog with:\n\n```bash\nuv run --with pyyaml python scripts/generate_fontpack_demos.py\n```\n",
      "summary": "Choose offline system typography or a vendored Markata font pack.",
      "date_published": "2026-08-06T00:00:00Z",
      "date_modified": "2026-08-06T00:00:00Z",
      "tags": [
        "documentation",
        "typography"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/tui/",
      "url": "https://markata.dev/docs/guides/tui/",
      "title": "Terminal UI",
      "content_html": "\u003cp\u003eLaunch the terminal UI with \u003ccode\u003emarkata-go tui\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThe interface appears immediately with a loading state while site data is\nprepared in the background. You can quit during loading; navigation becomes\navailable when the initial data arrives.\u003c/p\u003e\n\u003cp\u003eThe TUI reuses \u003ccode\u003e.markata/cache/list.json\u003c/code\u003e between launches. It checks file\nmetadata and the configured globs, then refreshes only changed posts. Ignored\ndirectories are skipped during discovery, so generated output and dependency\ntrees do not need to be scanned. On a cold cache, changed posts are parsed in\nparallel, including source-encrypted posts.\u003c/p\u003e\n\u003ch2 id=\"filter-the-posts-you-can-see\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFilter the posts you can see\u003c/span\u003e \u003ca href=\"#filter-the-posts-you-can-see\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePress \u003ccode\u003e/\u003c/code\u003e in the posts or feeds view and start typing. Results update\nimmediately and are limited to the items currently in the list. Post matching\nchecks the title, path, description, tags, and content; feed matching checks\nthe feed name, title, and path. Press \u003ccode\u003eEnter\u003c/code\u003e to keep the filtered list, or\n\u003ccode\u003eEsc\u003c/code\u003e to cancel and restore the list.\u003c/p\u003e\n\u003cp\u003eThis is intentionally a simple list filter; it does not parse filter\nexpressions. Use the regular CLI list command when you need structured filters.\u003c/p\u003e\n\u003ch2 id=\"feed-inventory\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed inventory\u003c/span\u003e \u003ca href=\"#feed-inventory\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePress \u003ccode\u003ef\u003c/code\u003e to open the feed inventory. It includes every configured feed,\nincluding private-enabled, sidebar-hidden, and automatically generated feeds.\nTheir titles include explicit labels such as \u003ccode\u003e[private]\u003c/code\u003e, \u003ccode\u003e[hidden]\u003c/code\u003e, and\n\u003ccode\u003e[auto]\u003c/code\u003e; the labels are also color-coded when the terminal supports color.\u003c/p\u003e\n\u003cp\u003ePress \u003ccode\u003eEnter\u003c/code\u003e on any feed to view its posts.\u003c/p\u003e\n",
      "content_text": "\n\nLaunch the terminal UI with `markata-go tui`.\n\nThe interface appears immediately with a loading state while site data is\nprepared in the background. You can quit during loading; navigation becomes\navailable when the initial data arrives.\n\nThe TUI reuses `.markata/cache/list.json` between launches. It checks file\nmetadata and the configured globs, then refreshes only changed posts. Ignored\ndirectories are skipped during discovery, so generated output and dependency\ntrees do not need to be scanned. On a cold cache, changed posts are parsed in\nparallel, including source-encrypted posts.\n\n## Filter the posts you can see\n\nPress `/` in the posts or feeds view and start typing. Results update\nimmediately and are limited to the items currently in the list. Post matching\nchecks the title, path, description, tags, and content; feed matching checks\nthe feed name, title, and path. Press `Enter` to keep the filtered list, or\n`Esc` to cancel and restore the list.\n\nThis is intentionally a simple list filter; it does not parse filter\nexpressions. Use the regular CLI list command when you need structured filters.\n\n## Feed inventory\n\nPress `f` to open the feed inventory. It includes every configured feed,\nincluding private-enabled, sidebar-hidden, and automatically generated feeds.\nTheir titles include explicit labels such as `[private]`, `[hidden]`, and\n`[auto]`; the labels are also color-coded when the terminal supports color.\n\nPress `Enter` on any feed to view its posts.\n",
      "summary": "Browse posts and feeds with markata-go's terminal UI",
      "date_published": "2026-08-02T00:00:00Z",
      "date_modified": "2026-08-02T00:00:00Z",
      "tags": [
        "documentation",
        "tui",
        "navigation"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/cli-output/",
      "url": "https://markata.dev/docs/guides/cli-output/",
      "title": "CLI Output",
      "content_html": "\u003cp\u003eMarkata uses your configured site palette for interactive help, status output,\nand section headings. Help sections use Unicode box-drawing rules sized to your\nterminal, up to 80 columns.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go --help\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lsp --help\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen output is redirected, or when you pass \u003ccode\u003e--no-color\u003c/code\u003e, Markata keeps the\nsame text and separators but removes ANSI color codes. Structured output such\nas JSON, YAML, and TOML remains suitable for scripts.\u003c/p\u003e\n",
      "content_text": "\n\nMarkata uses your configured site palette for interactive help, status output,\nand section headings. Help sections use Unicode box-drawing rules sized to your\nterminal, up to 80 columns.\n\n```bash\nmarkata-go --help\nmarkata-go lsp --help\n```\n\nWhen output is redirected, or when you pass `--no-color`, Markata keeps the\nsame text and separators but removes ANSI color codes. Structured output such\nas JSON, YAML, and TOML remains suitable for scripts.\n",
      "summary": "Understand Markata's terminal colors, themed help, and plain output behavior.",
      "date_published": "2026-07-29T00:00:00Z",
      "date_modified": "2026-07-29T00:00:00Z",
      "tags": [
        "documentation",
        "cli",
        "themes"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/deployment/builder-admin/",
      "url": "https://markata.dev/docs/guides/deployment/builder-admin/",
      "title": "Builder Admin",
      "content_html": "\u003cp\u003eThe builder admin service keeps a warm markata-go build worker running inside your cluster.\u003c/p\u003e\n\u003cp\u003eInstead of starting a new Kubernetes Job for every authoring build, it keeps one HTTP service alive with:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ea serialized build queue\u003c/li\u003e\n\u003cli\u003efile watching that enqueues builds\u003c/li\u003e\n\u003cli\u003ebuild history and full raw logs\u003c/li\u003e\n\u003cli\u003erelease history and current live release\u003c/li\u003e\n\u003cli\u003ethe sanitized content diagnostics artifact from successful full builds\u003c/li\u003e\n\u003cli\u003erollback by promoting an older rendered release\u003c/li\u003e\n\u003cli\u003escheduled refresh tasks for reader, blogroll, or other remote-content commands\u003c/li\u003e\n\u003cli\u003esigned GitHub and Forgejo push webhooks that pull and build matching branches\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"what-it-is-good-for\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat It Is Good For\u003c/span\u003e \u003ca href=\"#what-it-is-good-for\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse builder admin when:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eyour site content already lives on a mounted filesystem such as a hostPath\u003c/li\u003e\n\u003cli\u003eyou care about fast authoring loops more than one-shot batch builds\u003c/li\u003e\n\u003cli\u003eyou want an operator UI for builds and releases\u003c/li\u003e\n\u003cli\u003eyou want remote-content refreshes to stay decoupled from normal content builds\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"basic-helm-values\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Helm Values\u003c/span\u003e \u003ca href=\"#basic-helm-values\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuilderAdmin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eenabled\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eport\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e8080\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003efast\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ewatch\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenabled\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edebounce\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e2s\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ereleases\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ekeep\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e25\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ehistory\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esuccessfulBuilds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e60\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003efailedBuilds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e100\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erefreshRuns\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e100\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erefreshTasks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ereader-update\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eevery\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e30m\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eenqueueBuildOnSuccess\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- --\u003cspan class=\"l\"\u003econfig\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"l\"\u003e/data/source/markata-go.toml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"l\"\u003ereader\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"l\"\u003eupdate\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"build-automatically-after-a-new-builder-image-starts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild automatically after a new Builder image starts\u003c/span\u003e \u003ca href=\"#build-automatically-after-a-new-builder-image-starts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eHelm enables \u003ccode\u003ebuilderAdmin.buildOnStartupRevisionChange: true\u003c/code\u003e by default.\nWhen the replacement Builder Admin pod acquires leadership, it compares the\nrunning binary\u0026rsquo;s embedded Git commit against the \u003cstrong\u003elast successful real build\u003c/strong\u003e.\nIf the revisions differ, it immediately enqueues a normal full build with\ntrigger \u003ccode\u003estartup-revision\u003c/code\u003e and records the comparison in build history.\nPublication remains atomic: a failed build keeps the last live release.\u003c/p\u003e\n\u003cp\u003eAn unchanged restart does not enqueue another build. Existing pending normal\nbuilds suppress duplicates, and standby pods never enqueue during rolling\nupdates. Before comparing revisions, the new leader reloads the previous\nleader\u0026rsquo;s persisted state. Rollbacks and failed builds do not count as\nsuccessful builds for this comparison.\u003c/p\u003e\n\u003cp\u003eFor older build records without a commit, Builder Admin checks the live\ndiagnostics artifact. If neither source supplies a reliable previous\nrevision, it performs one build to establish a baseline. A running\nexecutable without a reliable Git commit SHA does not automatically\nbuild based on a mutable image tag or development version.\u003c/p\u003e\n\u003cp\u003eSet \u003ccode\u003ebuilderAdmin.buildOnStartupRevisionChange: false\u003c/code\u003e to disable the\nHelm behavior. Helm injects \u003ccode\u003eMARKATA_GO_BUILDER_ADMIN_STARTUP_REBUILD\u003c/code\u003e as an\nenvironment variable instead of passing a new flag; older builder images\nignore the variable, avoiding startup failures during staggered rollouts.\nDirect CLI use is opt-in via\n\u003ccode\u003emarkata-go builder-admin --build-on-startup-revision-change\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"put-transient-build-work-on-node-local-storage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePut transient build work on node-local storage\u003c/span\u003e \u003ca href=\"#put-transient-build-work-on-node-local-storage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBy default Builder Admin preserves the historical behavior and creates \u003ccode\u003e.build-work\u003c/code\u003e under the\nrelease directory. For a write-heavy site whose durable site volume is slow at small-file I/O,\nmove only the transient workspace onto node-local storage:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuilderAdmin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eworkspace\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenabled\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003emode\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eemptyDir\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003emountPath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/data/work\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eworkDir\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/data/work/build\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eemptyDir\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e{}\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003eemptyDir\u003c/code\u003e is node-local and disappears with the pod. The next build safely seeds\na new workspace from the current release. Retained releases and the \u003ccode\u003ecurrent\u003c/code\u003e symlink remain under \u003ccode\u003erelease-dir\u003c/code\u003e on the\ndurable site volume.\u003c/p\u003e\n\u003cp\u003eBuilder Admin retains an independent mutable workspace after publication. It creates\na hidden staged release and compares its files with the previous immutable release.\nMatching file contents and permissions reuse that release\u0026rsquo;s inode through a hard\nlink. Changed files use independent copies. Unsupported hard links fall back to\ncopies. The workspace never shares writable file inodes with published releases.\u003c/p\u003e\n\u003cp\u003ePublication renames the complete staging directory into its retained release path\nbefore switching \u003ccode\u003ecurrent\u003c/code\u003e. Deleted workspace paths remain absent from the new\nrelease. A failed stage preserves the current site and historical releases. This\nguarantee covers atomic visibility, not full power-loss durability. Linked files\nretain the previous release\u0026rsquo;s modification time.\u003c/p\u003e\n\u003cp\u003eLogs report \u003ccode\u003elinked_files\u003c/code\u003e, \u003ccode\u003ecopied_files\u003c/code\u003e, \u003ccode\u003ecopied_bytes\u003c/code\u003e, and \u003ccode\u003ecompared_bytes\u003c/code\u003e.\nA bounded pool processes up to eight files concurrently. Each worker owns its\ncomparison buffers. Publication waits for all workers before exposing a release.\nIndependent copies retain per-file synchronization.\u003c/p\u003e\n\u003cp\u003eDirect byte comparisons still read unchanged output. They avoid copying those\nbytes onto replicated storage. The first publication needs independent copies\nwhen no baseline exists, and requires space for both the workspace and release.\u003c/p\u003e\n\u003cp\u003eUse \u003ccode\u003emode: hostPath\u003c/code\u003e and set \u003ccode\u003eworkspace.hostPath.path\u003c/code\u003e when you want a specific node-local disk\ninstead of the pod\u0026rsquo;s ephemeral storage. Keep \u003ccode\u003eworkDir\u003c/code\u003e underneath \u003ccode\u003emountPath\u003c/code\u003e; the CLI also rejects\nfilesystem roots, the source tree, and the release root as explicit \u003ccode\u003e--work-dir\u003c/code\u003e values because the\nworkspace can be deleted and recreated when it needs a fresh seed.\u003c/p\u003e\n\u003cp\u003eKeep \u003ccode\u003ebuilderAdmin.fast\u003c/code\u003e at \u003ccode\u003efalse\u003c/code\u003e when queued builds publish the live site. In this repo,\n\u003ccode\u003e--fast\u003c/code\u003e is an authoring optimization, not a production-equivalent build mode: it skips\nblogroll, mentions, and other expensive work that can affect user-facing output. Enable it\nonly when the admin service is being used as a preview loop and a separate full build path\nstill exists for public releases.\u003c/p\u003e\n\u003cp\u003eCurrent chart defaults also prefer clean rolling cutover instead of stop-then-start replacement.\nBuilder-admin keeps one active leader for queue draining, file watching, refresh scheduling, and\nrelease promotion while standby pods stay ready during rollout handoff.\u003c/p\u003e\n\u003ch2 id=\"match-the-site-theme\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMatch the Site Theme\u003c/span\u003e \u003ca href=\"#match-the-site-theme\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBuilder admin reads the site\u0026rsquo;s configured palette from the source directory and uses its fallback\nmode for the operator UI. For example, this site configuration gives the admin UI the Everforest\nDark colors:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;everforest-dark\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen your site config uses \u003ccode\u003epalette_light\u003c/code\u003e, \u003ccode\u003epalette_dark\u003c/code\u003e, or \u003ccode\u003efallback_mode\u003c/code\u003e, builder admin uses\nthe same fallback palette. Keep the site config and any custom palette files under the mounted\nsource directory. If the palette cannot be loaded, builder admin remains available with its\ndefault colors. Builder Admin and local Serve share a semantic browser token stylesheet for these\ncolors and keyboard focus treatment; their page structure and production/local capabilities remain\nseparate while a shared shell is developed.\u003c/p\u003e\n\u003ch2 id=\"read-build-history-quickly\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRead Build History Quickly\u003c/span\u003e \u003ca href=\"#read-build-history-quickly\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eJobs and releases are expandable: select a row to see full IDs, timings, logs, and the build\nrecord link without losing your place in the list. Release rows use their creation time as the\nprimary label; full IDs remain available in the expanded view.\u003c/p\u003e\n\u003cp\u003eFor successful builds, the duration bar compares each build with up to 60 builds completed in the\nlast 30 days. It marks the mean and recorded maximum. Builder admin needs at least eight matching\nbuilds before it flags unusually fast or slow work, using a median/MAD baseline so a single slow\nbuild does not distort the result.\u003c/p\u003e\n\u003ch2 id=\"secure-access-with-forwardauth\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSecure Access with ForwardAuth\u003c/span\u003e \u003ca href=\"#secure-access-with-forwardauth\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBuilder admin is an operator control plane. Expose it only through its protected Traefik ingress;\ndirect Service access and \u003ccode\u003ekubectl port-forward\u003c/code\u003e fail closed because they cannot prove that the\nrequest came through the trusted proxy.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuilderAdmin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eenabled\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eauth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# CIDR used by the Traefik instances and builder-admin peers that forward this\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# Ingress. 0.0.0.0/0 and ::/0 are rejected.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003etrustedProxyCIDRs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"m\"\u003e10.42.0.0\u003c/span\u003e\u003cspan class=\"l\"\u003e/24\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eingress\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenabled\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehost\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuilder.example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eingressClassName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etraefik\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003etls\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eenabled\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003esecretName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuilder-example-com-tls\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eauth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eenabled\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# Traefik uses this direct Service URL for ForwardAuth. The chart appends\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# /api/v1/forward-auth.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003einternalUrl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttp://hlab-auth.hlab-auth.svc.cluster.local:8000\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# Optional: browser-reachable auth origin for the operator\u0026#39;s own picture.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# This does not alter hlab-auth login, session, or WebAuthn configuration.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003epublicAuthOrigin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://auth.wayl.one\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003enetworkPolicy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenabled\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# Verify these against the live Traefik installation before applying.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003etraefikNamespace\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ekube-system\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003etraefikNamespaceSelector\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ekubernetes.io/metadata.name\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ekube-system\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003etraefikPodSelector\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eapp.kubernetes.io/name\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etraefik\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eapp.kubernetes.io/instance\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etraefik-kube-system\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe chart strips every configured identity header before calling the ForwardAuth service. On a\nsuccessful decision, Traefik forwards only configured response headers to builder admin. The\nForwardAuth \u003ccode\u003einternalUrl\u003c/code\u003e must use HTTPS or a cluster-local Service URL in the form\n\u003ccode\u003ehttp://\u0026lt;service\u0026gt;.\u0026lt;namespace\u0026gt;.svc.cluster.local:\u0026lt;port\u0026gt;\u003c/code\u003e; Helm rejects other HTTP URLs. Keep\n\u003ccode\u003epublicAuthOrigin\u003c/code\u003e on the browser-facing HTTPS auth origin when you use profile pictures.\nSet \u003ccode\u003etrustedProxyCIDRs\u003c/code\u003e to only the actual Traefik source CIDRs seen by the pod. A shared Pod CIDR\nis permitted only when it is needed for builder-admin peer forwarding and the required selector\nNetworkPolicy restricts that CIDR to the configured Traefik pods and builder-admin peers. Do not\nuse universal, loopback, or link-local CIDRs; the service rejects them.\u003c/p\u003e\n\u003cp\u003eThe default values use hlab-auth\u0026rsquo;s \u003ccode\u003e/api/v1/forward-auth\u003c/code\u003e endpoint, \u003ccode\u003eX-Hlab-*\u003c/code\u003e headers, and the\n\u003ccode\u003e__Host-hlab-app-session\u003c/code\u003e cookie. Builder admin itself has no hlab-auth API dependency: any SSO\nthat supports Traefik ForwardAuth can be used by setting the endpoint path, response cookies, and\nidentity-header mapping. Builder admin makes no authorization decision from a username, display\nname, group, role, or scope; the ForwardAuth service is the access decision point.\u003c/p\u003e\n\u003ch3 id=\"authentik-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuthentik example\u003c/span\u003e \u003ca href=\"#authentik-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAuthentik\u0026rsquo;s proxy outpost supplies durable \u003ccode\u003eX-Authentik-Uid\u003c/code\u003e values. Configure its Traefik\nForwardAuth endpoint, then map those headers in the chart:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuilderAdmin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eauth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003euserID\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eX-Authentik-Uid\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eusername\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eX-Authentik-Username\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003edisplayName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eX-Authentik-Name\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eemail\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eX-Authentik-Email\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003egroups\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eX-Authentik-Groups\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eroles\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003escopes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eingress\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eauth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003einternalUrl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttp://ak-outpost.authentik.svc.cluster.local:9000\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eforwardAuthPath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/outpost.goauthentik.io/auth/traefik\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eresponseCookies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor a non-Helm deployment, use the same names with \u003ccode\u003ebuilder-admin\u003c/code\u003e flags such as\n\u003ccode\u003e--auth-user-id-header=X-Authentik-Uid\u003c/code\u003e. Configure Traefik to strip every configured identity\nheader before ForwardAuth and forward the same headers from its successful response. Do not map a\nmutable username to \u003ccode\u003euserID\u003c/code\u003e; use the SSO\u0026rsquo;s stable subject or UID header.\u003c/p\u003e\n\u003cp\u003eYou can keep this mapping in the site configuration instead of repeating CLI flags:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder_admin\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauth\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003euser_id\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;X-Authentik-Uid\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eusername\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;X-Authentik-Username\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edisplay_name\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;X-Authentik-Name\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eemail\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;X-Authentik-Email\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egroups\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;X-Authentik-Groups\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eroles\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escopes\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEnvironment variables override this file, for example\n\u003ccode\u003eMARKATA_GO_BUILDER_ADMIN_AUTH_HEADERS_USER_ID=X-Authentik-Uid\u003c/code\u003e. Explicit CLI flags have the\nhighest precedence. Empty optional header values disable those display-only assertions; the durable\n\u003ccode\u003euser_id\u003c/code\u003e header is always required.\u003c/p\u003e\n\u003cp\u003eThe operator panel uses the trusted durable user ID and any supplied profile headers only for\nidentity display; they never grant access. Set \u003ccode\u003epublicAuthOrigin\u003c/code\u003e only when the browser can reach\nhlab-auth at that HTTPS origin and you want the panel to request the signed-in operator\u0026rsquo;s own\npicture. The URL is derived from the authenticated stable user ID; a \u003ccode\u003eNo image\u003c/code\u003e fallback remains\nvisible when it is unset, unavailable, or cannot load. Do not use this setting to change hlab-auth\u0026rsquo;s\nprimary public auth origin, cookies/sessions, or primary WebAuthn RP.\u003c/p\u003e\n\u003ch3 id=\"agent-api\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAgent API\u003c/span\u003e \u003ca href=\"#agent-api\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBuilder admin exposes a machine API at \u003ccode\u003e/api/v1/\u003c/code\u003e for reading state and logs, inspecting build and\nrefresh operations, enqueueing builds and refreshes, and rolling back releases. Successful\nmutations return HTTP 202 with an operation ID and queued status. Poll the operation detail endpoint\nor \u003ccode\u003e/api/v1/state\u003c/code\u003e until it completes. The API records the trusted operator ID on operations.\u003c/p\u003e\n\u003cp\u003eThe API is restricted to requests that pass through ForwardAuth with a trusted \u003ccode\u003ebearer\u003c/code\u003e auth-method\nassertion. The default header is \u003ccode\u003eX-Hlab-Auth-Method\u003c/code\u003e; the chart strips any client-supplied copy and\nonly accepts the value when ForwardAuth returns it. The ForwardAuth route for \u003ccode\u003e/api/v1/\u003c/code\u003e must\nrequire the site\u0026rsquo;s operator-access scope (for example, \u003ccode\u003egobuilder:access\u003c/code\u003e). Hlab-auth ForwardAuth\nvalidates personal bearer tokens on \u003ccode\u003e/api/\u003c/code\u003e routes against the matched route\u0026rsquo;s required scopes and\nreturns the identity plus auth-method headers. Deploy a hlab-auth release with bearer ForwardAuth\nsupport before enabling this API. Browser UI requests continue to use passkey sessions and CSRF\nvalidation.\u003c/p\u003e\n\u003cp\u003eUse the API with the same credential used for \u003ccode\u003ehlab\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -fsS -H \u003cspan class=\"s2\"\u003e\u0026#34;Authorization: Bearer \u003c/span\u003e\u003cspan class=\"nv\"\u003e$HLAB_TOKEN\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  https://builder.example.com/api/v1/state\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -fsS -X POST -H \u003cspan class=\"s2\"\u003e\u0026#34;Authorization: Bearer \u003c/span\u003e\u003cspan class=\"nv\"\u003e$HLAB_TOKEN\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  https://builder.example.com/api/v1/builds\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe API also provides \u003ccode\u003eGET /api/v1/builds/{id}\u003c/code\u003e, \u003ccode\u003eGET /api/v1/refreshes/{id}\u003c/code\u003e,\n\u003ccode\u003eGET /api/v1/logs/{filename}\u003c/code\u003e, \u003ccode\u003ePOST /api/v1/refresh/{task}\u003c/code\u003e, and\n\u003ccode\u003ePOST /api/v1/releases/{release-id}/rollback\u003c/code\u003e. It returns JSON errors; queue saturation returns\n503 with \u003ccode\u003eRetry-After\u003c/code\u003e. The browser UI remains CSRF-protected, and bearer API authentication does\nnot grant access to the API unless ForwardAuth validates the token and returns the trusted marker.\u003c/p\u003e\n\u003cp\u003eWhen \u003ccode\u003ebuilderAdmin.enabled\u003c/code\u003e is true, Helm fails unless the protected ingress, TLS secret, ingress\nhost/class, ForwardAuth URL, trusted proxy CIDRs, and builder-admin ingress NetworkPolicy are all\nconfigured. The service receives its CSRF public origin as exactly \u003ccode\u003ehttps://\u0026lt;ingress host\u0026gt;\u003c/code\u003e from\nthe chart. Do not supply that value from request headers or alter hlab-auth\u0026rsquo;s primary RP/origin.\nThe NetworkPolicy permits the configured \u003ccode\u003ebuilderAdmin.port\u003c/code\u003e only from the configured Traefik\nnamespace/pod selectors and other builder-admin pods; confirm the default labels match the\ninstalled controller. The peer-forwarding marker is accepted only from a configured trusted CIDR;\nit cannot authenticate a direct request by itself.\u003c/p\u003e\n\u003cp\u003eAuthenticated \u003ccode\u003eGET /\u003c/code\u003e responses set a host-only, secure, HttpOnly, strict-SameSite CSRF cookie\nand include its token in each mutation form. Browser mutations must present the matching token and\nthe exact configured Origin; programmatic clients may use \u003ccode\u003eX-CSRF-Token\u003c/code\u003e instead of a form field.\u003c/p\u003e\n\u003ch2 id=\"what-you-can-see\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat You Can See\u003c/span\u003e \u003ca href=\"#what-you-can-see\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe UI shows:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003equeued and running builds\u003c/li\u003e\n\u003cli\u003erecent successful and failed builds\u003c/li\u003e\n\u003cli\u003ethe trigger source for each build\u003c/li\u003e\n\u003cli\u003eper-build duration and phase timings\u003c/li\u003e\n\u003cli\u003efull raw logs\u003c/li\u003e\n\u003cli\u003eparsed markata-go performance summary lines\u003c/li\u003e\n\u003cli\u003ecurrent live release\u003c/li\u003e\n\u003cli\u003eold releases that can be promoted back to live\u003c/li\u003e\n\u003cli\u003erefresh task history\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"reading-the-operator-ui\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReading the Operator UI\u003c/span\u003e \u003ca href=\"#reading-the-operator-ui\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe default \u003cstrong\u003eJobs\u003c/strong\u003e workspace is the primary operational view. It puts running work, queued\nwork, and completed builds, refreshes, and rollbacks in one list. Use \u003cstrong\u003eEnqueue Build\u003c/strong\u003e for a\nmanual build, then inspect its row for status, queue wait, build duration, trigger, and release.\u003c/p\u003e\n\u003cp\u003eSelect \u003cstrong\u003eDetails\u003c/strong\u003e on a build to see phase timings, changed paths, parsed performance lines, and\nthe raw log. Release pruning runs asynchronously after publication, so a completed build can be live\nbefore old release files finish deleting; the recorded prune timing updates when cleanup completes.\nRaw IDs and filesystem paths are detail data rather than dashboard metrics. On narrow screens,\neach build and release reflows into a labeled record so operators do not need to read a clipped\ndesktop table.\u003c/p\u003e\n\u003ch2 id=\"protected-release-previews\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProtected Release Previews\u003c/span\u003e \u003ca href=\"#protected-release-previews\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEach retained successful release is available at \u003ccode\u003ehttps://\u0026lt;site-host\u0026gt;/__preview/\u0026lt;release-id\u0026gt;/\u003c/code\u003e.\nThe chart protects this path with the builder-admin ForwardAuth middleware, so unpromoted content\nis not public. Preview links expire when release retention prunes the underlying release.\u003c/p\u003e\n\u003cp\u003eThe browser tab favicon also reflects live admin state so you can spot activity without keeping the tab focused:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eidle when nothing is running\u003c/li\u003e\n\u003cli\u003equeued when work is waiting\u003c/li\u003e\n\u003cli\u003ebuild when a build or rollback is running\u003c/li\u003e\n\u003cli\u003erefresh when a refresh task is running\u003c/li\u003e\n\u003cli\u003eerror when UI polling fails\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe workspace tabs show one primary view at a time so build history, refresh runs, and releases do\nnot visually stack on top of each other during tab switches. Build and release timestamps also pair\nthe absolute RFC3339 value with a relative age label such as \u003ccode\u003e(5m ago)\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"build-triggers\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Triggers\u003c/span\u003e \u003ca href=\"#build-triggers\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBuilder admin can enqueue builds from:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ethe UI\u003c/li\u003e\n\u003cli\u003eHTTP API calls\u003c/li\u003e\n\u003cli\u003edebounced file-watch events\u003c/li\u003e\n\u003cli\u003esuccessful refresh task runs when configured to enqueue a build\u003c/li\u003e\n\u003cli\u003eGitHub or Forgejo push webhooks\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"build-on-git-push\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild on Git Push\u003c/span\u003e \u003ca href=\"#build-on-git-push\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEnable one builder-admin service for each environment. Each service owns one checked-out branch,\nsource directory, site directory, and webhook secret. The branch defaults to \u003ccode\u003emain\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# markata-go.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder_admin\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebhook\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebranch\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;main\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSet the HMAC secret outside version control. Environment variables override the config file, and\nexplicit flags override both:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_BUILDER_ADMIN_WEBHOOK_SECRET\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;replace-with-a-random-secret\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go builder-admin --webhook-enabled --webhook-branch main\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe endpoint is \u003ccode\u003ehttps://\u0026lt;builder-admin-host\u0026gt;/webhook\u003c/code\u003e. In GitHub, create a repository webhook\nwith that payload URL, set the same secret, select JSON payloads, and subscribe to \u003cstrong\u003ePush\u003c/strong\u003e events.\nForgejo uses the same URL and secret; select its push event. Builder admin accepts GitHub\u0026rsquo;s\n\u003ccode\u003eX-Hub-Signature-256\u003c/code\u003e and Forgejo\u0026rsquo;s \u003ccode\u003eX-Gitea-Signature\u003c/code\u003e headers. Invalid signatures, events other\nthan push, and pushes to another branch are ignored or rejected without running a build.\u003c/p\u003e\n\u003cp\u003eFor an accepted matching push, builder admin runs \u003ccode\u003egit -C \u0026lt;source-dir\u0026gt; pull --ff-only origin \u0026lt;branch\u0026gt;\u003c/code\u003e. It queues\na build only when that changes the checkout. Ensure the deployed source directory is a clean clone\nwith an authenticated \u003ccode\u003eorigin\u003c/code\u003e remote and that its checked-out branch tracks the configured branch.\nThe normal source watcher remains active during the pull so a local author edit is never ignored.\nThat safety measure can produce a follow-up file-watch build after a push.\u003c/p\u003e\n\u003ch3 id=\"helm-setup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHelm setup\u003c/span\u003e \u003ca href=\"#helm-setup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe chart exposes \u003ccode\u003e/webhook\u003c/code\u003e without the operator ForwardAuth middleware; HMAC validation protects\nthat endpoint. Create a Kubernetes Secret, then reference it in the environment\u0026rsquo;s Helm values:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuilderAdmin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ewebhook\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenabled\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranch\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eexistingSecretName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuilder-webhook\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eexistingSecretKey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewebhook-secret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor a public GitHub repository, the chart can initialize the source PVC as a\nshallow checkout before Builder Admin starts. It refreshes that checkout on\npod startup; signed push webhooks keep it current between restarts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuilderAdmin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003esourceGit\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenabled\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erepository\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://github.com/WaylonWalker/markata.git\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranch\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edepth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ewebhook\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenabled\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranch\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eexistingSecretName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-docs-builder-webhook\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eexistingSecretKey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewebhook-secret\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003esourceGit\u003c/code\u003e only seeds an empty source directory or refreshes an existing Git\ncheckout. If the directory contains files but no \u003ccode\u003e.git\u003c/code\u003e repository, startup\nfails without deleting those files. The webhook continues to use a\nfast-forward-only pull and queues a build only when the checkout changes.\nConfigure the builder\u0026rsquo;s site config with \u003ccode\u003esearch.configPath\u003c/code\u003e when the source\nrepository uses a non-default config filename.\u003c/p\u003e\n\u003cp\u003eCreate separate releases for \u003ccode\u003emain\u003c/code\u003e, \u003ccode\u003edev\u003c/code\u003e, and \u003ccode\u003eqa\u003c/code\u003e when they publish different domains. Give each\nrelease a distinct source checkout, site storage, builder-admin ingress host, and webhook secret.\nPoint each repository webhook at its matching builder-admin host. Do not share a production webhook\nsecret with preview environments.\u003c/p\u003e\n\u003cp\u003eIf GitHub or Forgejo reports a successful delivery but no build appears, verify the delivery branch,\nthe service\u0026rsquo;s configured branch, the HMAC secret, and that \u003ccode\u003egit -C \u0026lt;source-dir\u0026gt; pull --ff-only origin \u0026lt;branch\u0026gt;\u003c/code\u003e\nsucceeds in the builder container. A delivery for an unchanged commit intentionally does not queue\na build.\u003c/p\u003e\n\u003ch2 id=\"rollback\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRollback\u003c/span\u003e \u003ca href=\"#rollback\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRollback in the first version promotes a previous rendered release by repointing the \u003ccode\u003ecurrent\u003c/code\u003e symlink.\u003c/p\u003e\n\u003cp\u003eThis is fast and keeps the release model simple, but it does not restore the historical source tree.\u003c/p\u003e\n\u003ch2 id=\"scheduled-refresh-tasks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eScheduled Refresh Tasks\u003c/span\u003e \u003ca href=\"#scheduled-refresh-tasks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRefresh tasks are external commands that run on an interval.\u003c/p\u003e\n\u003cp\u003eExamples:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go reader update\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go blogroll update --force\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ea custom remote-asset fetch command\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUse them to keep reader/blogroll data or other remote caches fresh without slowing down every normal content build.\u003c/p\u003e\n\u003ch3 id=\"retaining-a-warm-workspace\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRetaining a warm workspace\u003c/span\u003e \u003ca href=\"#retaining-a-warm-workspace\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSuccessful publication retains the completed workspace on both same-filesystem and\ncross-filesystem layouts. Builder Admin reuses it only when its successful-release\nmarker matches current. Logs report \u003ccode\u003ereusing build work from current release\u003c/code\u003e.\nFailed or interrupted builds and rollbacks trigger a fresh independent seed. A\npersistent workspace survives pod restarts. An \u003ccode\u003eemptyDir\u003c/code\u003e survives container\nrestarts but disappears with the pod. Incremental publication still compares\nunchanged bytes, so storage and host load affect elapsed time.\u003c/p\u003e\n\u003ch3 id=\"background-release-cleanup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBackground release cleanup\u003c/span\u003e \u003ca href=\"#background-release-cleanup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBuilder Admin first removes obsolete releases from the published release list with an atomic rename, then deletes their files in the background. Large cleanup jobs do not hold the lock needed for promotion or rollback. Internal \u003ccode\u003e.pruning-\u003c/code\u003e directories are not rollback targets; interrupted cleanup is retried on the next prune run. Published build success is separate from cleanup errors, which appear in service logs.\u003c/p\u003e\n\u003ch3 id=\"successful-build-but-nginx-returns-403\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSuccessful build but nginx returns 403\u003c/span\u003e \u003ca href=\"#successful-build-but-nginx-returns-403\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf nginx reports \u003ccode\u003ecurrent/index.html is forbidden (13: Permission denied)\u003c/code\u003e, inspect the completed release root permissions. Builder-admin publishes release roots as \u003ccode\u003e0755\u003c/code\u003e so nginx can traverse them. Older cross-filesystem publication could retain a private \u003ccode\u003e0700\u003c/code\u003e staging directory, and subsequent seeded builds could inherit it. Upgrade the engine and correct affected retained release roots to \u003ccode\u003e0755\u003c/code\u003e; child file permissions do not need a recursive change for this defect.\u003c/p\u003e\n\u003ch3 id=\"warm-publication-digest-cache\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWarm publication digest cache\u003c/span\u003e \u003ca href=\"#warm-publication-digest-cache\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBuilder Admin stores a private SHA-256 manifest beside its mutable workspace.\nOn Linux, unchanged file identity and change timestamps allow cached digest reuse.\nFiles with recent or changed timestamps require content hashing. Missing or corrupt\ncache records fall back to hashing. Other platforms always hash source files.\u003c/p\u003e\n\u003cp\u003eThe manifest binds the workspace and previous release. Published releases must\nstay immutable. Do not edit retained releases in place. Delete the workspace\u0026rsquo;s\n\u003ccode\u003e.publication.json\u003c/code\u003e sibling to force content verification on the next publication.\nManifest write failures leave publication usable but disable cache reuse. Logs\nreport \u003ccode\u003ecached_source_hashes\u003c/code\u003e, \u003ccode\u003ecached_release_hashes\u003c/code\u003e, and \u003ccode\u003emanifest_saved\u003c/code\u003e.\nThe manifest contains file identities and digests and never appears in a release.\u003c/p\u003e\n\u003ch2 id=\"revision-provenance-and-new-build-status\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRevision provenance and new-build status\u003c/span\u003e \u003ca href=\"#revision-provenance-and-new-build-status\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBuilder Admin shows the running \u003cstrong\u003eBuilder executable revision\u003c/strong\u003e beside the\nrevision used by the latest successful build, as well as the current site Git\nHEAD. Its top status banner highlights \u003cstrong\u003eNew Builder revision has not built\nyet\u003c/strong\u003e when the running commit differs from every retained successful build\n(and there is reliable previous-build provenance). A queued or running build\nshows a pending state. Once a successful build using that Builder revision is\nrecorded the warning clears.\u003c/p\u003e\n\u003cp\u003eNew build records persist \u003ccode\u003ebuilder_version\u003c/code\u003e, \u003ccode\u003ebuilder_commit\u003c/code\u003e, and\n\u003ccode\u003esource_commit\u003c/code\u003e. These are visible in Jobs details, build detail pages and\nthe authenticated \u003ccode\u003e/api/v1/state\u003c/code\u003e response under \u003ccode\u003erevision\u003c/code\u003e. Retained\nreleases also show recorded revisions where available. Older build records may\nlack these fields; the current release\u0026rsquo;s diagnostics artifact provides a\nbest-effort fallback. Unknown revision identity is explicitly reported as\n\u003cstrong\u003eunknown\u003c/strong\u003e, not mistaken for an unbuilt revision.\u003c/p\u003e\n\u003cp\u003eSource revision comparison is Git HEAD based. Uncommitted edits can require a\nrebuild even if HEAD matches; this status does not claim to fingerprint dirty\nsource files. The displayed Builder revision is taken from the running binary\u0026rsquo;s\nbuild metadata, not the site\u0026rsquo;s Git HEAD or a mutable image tag.\u003c/p\u003e\n",
      "content_text": "\n\nThe builder admin service keeps a warm markata-go build worker running inside your cluster.\n\nInstead of starting a new Kubernetes Job for every authoring build, it keeps one HTTP service alive with:\n\n- a serialized build queue\n- file watching that enqueues builds\n- build history and full raw logs\n- release history and current live release\n- the sanitized content diagnostics artifact from successful full builds\n- rollback by promoting an older rendered release\n- scheduled refresh tasks for reader, blogroll, or other remote-content commands\n- signed GitHub and Forgejo push webhooks that pull and build matching branches\n\n## What It Is Good For\n\nUse builder admin when:\n\n- your site content already lives on a mounted filesystem such as a hostPath\n- you care about fast authoring loops more than one-shot batch builds\n- you want an operator UI for builds and releases\n- you want remote-content refreshes to stay decoupled from normal content builds\n\n## Basic Helm Values\n\n```yaml\nbuilderAdmin:\n  enabled: true\n  port: 8080\n  fast: false\n  watch:\n    enabled: true\n    debounce: 2s\n  releases:\n    keep: 25\n  history:\n    successfulBuilds: 60\n    failedBuilds: 100\n    refreshRuns: 100\n  refreshTasks:\n    - name: reader-update\n      every: 30m\n      enqueueBuildOnSuccess: true\n      args:\n        - markata-go\n        - --config\n        - /data/source/markata-go.toml\n        - reader\n        - update\n```\n\n### Build automatically after a new Builder image starts\n\nHelm enables `builderAdmin.buildOnStartupRevisionChange: true` by default.\nWhen the replacement Builder Admin pod acquires leadership, it compares the\nrunning binary's embedded Git commit against the **last successful real build**.\nIf the revisions differ, it immediately enqueues a normal full build with\ntrigger `startup-revision` and records the comparison in build history.\nPublication remains atomic: a failed build keeps the last live release.\n\nAn unchanged restart does not enqueue another build. Existing pending normal\nbuilds suppress duplicates, and standby pods never enqueue during rolling\nupdates. Before comparing revisions, the new leader reloads the previous\nleader's persisted state. Rollbacks and failed builds do not count as\nsuccessful builds for this comparison.\n\nFor older build records without a commit, Builder Admin checks the live\ndiagnostics artifact. If neither source supplies a reliable previous\nrevision, it performs one build to establish a baseline. A running\nexecutable without a reliable Git commit SHA does not automatically\nbuild based on a mutable image tag or development version.\n\nSet `builderAdmin.buildOnStartupRevisionChange: false` to disable the\nHelm behavior. Helm injects `MARKATA_GO_BUILDER_ADMIN_STARTUP_REBUILD` as an\nenvironment variable instead of passing a new flag; older builder images\nignore the variable, avoiding startup failures during staggered rollouts.\nDirect CLI use is opt-in via\n`markata-go builder-admin --build-on-startup-revision-change`.\n\n### Put transient build work on node-local storage\n\nBy default Builder Admin preserves the historical behavior and creates `.build-work` under the\nrelease directory. For a write-heavy site whose durable site volume is slow at small-file I/O,\nmove only the transient workspace onto node-local storage:\n\n```yaml\nbuilderAdmin:\n  workspace:\n    enabled: true\n    mode: emptyDir\n    mountPath: /data/work\n    workDir: /data/work/build\n    emptyDir: {}\n```\n\n`emptyDir` is node-local and disappears with the pod. The next build safely seeds\na new workspace from the current release. Retained releases and the `current` symlink remain under `release-dir` on the\ndurable site volume.\n\nBuilder Admin retains an independent mutable workspace after publication. It creates\na hidden staged release and compares its files with the previous immutable release.\nMatching file contents and permissions reuse that release's inode through a hard\nlink. Changed files use independent copies. Unsupported hard links fall back to\ncopies. The workspace never shares writable file inodes with published releases.\n\nPublication renames the complete staging directory into its retained release path\nbefore switching `current`. Deleted workspace paths remain absent from the new\nrelease. A failed stage preserves the current site and historical releases. This\nguarantee covers atomic visibility, not full power-loss durability. Linked files\nretain the previous release's modification time.\n\nLogs report `linked_files`, `copied_files`, `copied_bytes`, and `compared_bytes`.\nA bounded pool processes up to eight files concurrently. Each worker owns its\ncomparison buffers. Publication waits for all workers before exposing a release.\nIndependent copies retain per-file synchronization.\n\nDirect byte comparisons still read unchanged output. They avoid copying those\nbytes onto replicated storage. The first publication needs independent copies\nwhen no baseline exists, and requires space for both the workspace and release.\n\nUse `mode: hostPath` and set `workspace.hostPath.path` when you want a specific node-local disk\ninstead of the pod's ephemeral storage. Keep `workDir` underneath `mountPath`; the CLI also rejects\nfilesystem roots, the source tree, and the release root as explicit `--work-dir` values because the\nworkspace can be deleted and recreated when it needs a fresh seed.\n\nKeep `builderAdmin.fast` at `false` when queued builds publish the live site. In this repo,\n`--fast` is an authoring optimization, not a production-equivalent build mode: it skips\nblogroll, mentions, and other expensive work that can affect user-facing output. Enable it\nonly when the admin service is being used as a preview loop and a separate full build path\nstill exists for public releases.\n\nCurrent chart defaults also prefer clean rolling cutover instead of stop-then-start replacement.\nBuilder-admin keeps one active leader for queue draining, file watching, refresh scheduling, and\n release promotion while standby pods stay ready during rollout handoff.\n\n## Match the Site Theme\n\nBuilder admin reads the site's configured palette from the source directory and uses its fallback\nmode for the operator UI. For example, this site configuration gives the admin UI the Everforest\nDark colors:\n\n```toml\n[markata-go.theme]\npalette = \"everforest-dark\"\n```\n\nWhen your site config uses `palette_light`, `palette_dark`, or `fallback_mode`, builder admin uses\nthe same fallback palette. Keep the site config and any custom palette files under the mounted\nsource directory. If the palette cannot be loaded, builder admin remains available with its\ndefault colors. Builder Admin and local Serve share a semantic browser token stylesheet for these\ncolors and keyboard focus treatment; their page structure and production/local capabilities remain\nseparate while a shared shell is developed.\n\n## Read Build History Quickly\n\nJobs and releases are expandable: select a row to see full IDs, timings, logs, and the build\nrecord link without losing your place in the list. Release rows use their creation time as the\nprimary label; full IDs remain available in the expanded view.\n\nFor successful builds, the duration bar compares each build with up to 60 builds completed in the\nlast 30 days. It marks the mean and recorded maximum. Builder admin needs at least eight matching\nbuilds before it flags unusually fast or slow work, using a median/MAD baseline so a single slow\nbuild does not distort the result.\n\n## Secure Access with ForwardAuth\n\nBuilder admin is an operator control plane. Expose it only through its protected Traefik ingress;\ndirect Service access and `kubectl port-forward` fail closed because they cannot prove that the\nrequest came through the trusted proxy.\n\n```yaml\nbuilderAdmin:\n  enabled: true\n  auth:\n    # CIDR used by the Traefik instances and builder-admin peers that forward this\n    # Ingress. 0.0.0.0/0 and ::/0 are rejected.\n    trustedProxyCIDRs:\n      - 10.42.0.0/24\n  ingress:\n    enabled: true\n    host: builder.example.com\n    ingressClassName: traefik\n    tls:\n      enabled: true\n      secretName: builder-example-com-tls\n    auth:\n      enabled: true\n      # Traefik uses this direct Service URL for ForwardAuth. The chart appends\n      # /api/v1/forward-auth.\n      internalUrl: http://hlab-auth.hlab-auth.svc.cluster.local:8000\n      # Optional: browser-reachable auth origin for the operator's own picture.\n      # This does not alter hlab-auth login, session, or WebAuthn configuration.\n      publicAuthOrigin: https://auth.wayl.one\n  networkPolicy:\n    enabled: true\n    # Verify these against the live Traefik installation before applying.\n    traefikNamespace: kube-system\n    traefikNamespaceSelector:\n      kubernetes.io/metadata.name: kube-system\n    traefikPodSelector:\n      app.kubernetes.io/name: traefik\n      app.kubernetes.io/instance: traefik-kube-system\n```\n\nThe chart strips every configured identity header before calling the ForwardAuth service. On a\nsuccessful decision, Traefik forwards only configured response headers to builder admin. The\nForwardAuth `internalUrl` must use HTTPS or a cluster-local Service URL in the form\n`http://\u003cservice\u003e.\u003cnamespace\u003e.svc.cluster.local:\u003cport\u003e`; Helm rejects other HTTP URLs. Keep\n`publicAuthOrigin` on the browser-facing HTTPS auth origin when you use profile pictures.\nSet `trustedProxyCIDRs` to only the actual Traefik source CIDRs seen by the pod. A shared Pod CIDR\nis permitted only when it is needed for builder-admin peer forwarding and the required selector\nNetworkPolicy restricts that CIDR to the configured Traefik pods and builder-admin peers. Do not\nuse universal, loopback, or link-local CIDRs; the service rejects them.\n\nThe default values use hlab-auth's `/api/v1/forward-auth` endpoint, `X-Hlab-*` headers, and the\n`__Host-hlab-app-session` cookie. Builder admin itself has no hlab-auth API dependency: any SSO\nthat supports Traefik ForwardAuth can be used by setting the endpoint path, response cookies, and\nidentity-header mapping. Builder admin makes no authorization decision from a username, display\nname, group, role, or scope; the ForwardAuth service is the access decision point.\n\n### Authentik example\n\nAuthentik's proxy outpost supplies durable `X-Authentik-Uid` values. Configure its Traefik\nForwardAuth endpoint, then map those headers in the chart:\n\n```yaml\nbuilderAdmin:\n  auth:\n    headers:\n      userID: X-Authentik-Uid\n      username: X-Authentik-Username\n      displayName: X-Authentik-Name\n      email: X-Authentik-Email\n      groups: X-Authentik-Groups\n      roles: \"\"\n      scopes: \"\"\n  ingress:\n    auth:\n      internalUrl: http://ak-outpost.authentik.svc.cluster.local:9000\n      forwardAuthPath: /outpost.goauthentik.io/auth/traefik\n      responseCookies: []\n```\n\nFor a non-Helm deployment, use the same names with `builder-admin` flags such as\n`--auth-user-id-header=X-Authentik-Uid`. Configure Traefik to strip every configured identity\nheader before ForwardAuth and forward the same headers from its successful response. Do not map a\nmutable username to `userID`; use the SSO's stable subject or UID header.\n\nYou can keep this mapping in the site configuration instead of repeating CLI flags:\n\n```toml\n[markata-go.builder_admin.auth.headers]\nuser_id = \"X-Authentik-Uid\"\nusername = \"X-Authentik-Username\"\ndisplay_name = \"X-Authentik-Name\"\nemail = \"X-Authentik-Email\"\ngroups = \"X-Authentik-Groups\"\nroles = \"\"\nscopes = \"\"\n```\n\nEnvironment variables override this file, for example\n`MARKATA_GO_BUILDER_ADMIN_AUTH_HEADERS_USER_ID=X-Authentik-Uid`. Explicit CLI flags have the\nhighest precedence. Empty optional header values disable those display-only assertions; the durable\n`user_id` header is always required.\n\nThe operator panel uses the trusted durable user ID and any supplied profile headers only for\nidentity display; they never grant access. Set `publicAuthOrigin` only when the browser can reach\nhlab-auth at that HTTPS origin and you want the panel to request the signed-in operator's own\npicture. The URL is derived from the authenticated stable user ID; a `No image` fallback remains\nvisible when it is unset, unavailable, or cannot load. Do not use this setting to change hlab-auth's\nprimary public auth origin, cookies/sessions, or primary WebAuthn RP.\n\n### Agent API\n\nBuilder admin exposes a machine API at `/api/v1/` for reading state and logs, inspecting build and\nrefresh operations, enqueueing builds and refreshes, and rolling back releases. Successful\nmutations return HTTP 202 with an operation ID and queued status. Poll the operation detail endpoint\nor `/api/v1/state` until it completes. The API records the trusted operator ID on operations.\n\nThe API is restricted to requests that pass through ForwardAuth with a trusted `bearer` auth-method\nassertion. The default header is `X-Hlab-Auth-Method`; the chart strips any client-supplied copy and\nonly accepts the value when ForwardAuth returns it. The ForwardAuth route for `/api/v1/` must\nrequire the site's operator-access scope (for example, `gobuilder:access`). Hlab-auth ForwardAuth\nvalidates personal bearer tokens on `/api/` routes against the matched route's required scopes and\nreturns the identity plus auth-method headers. Deploy a hlab-auth release with bearer ForwardAuth\nsupport before enabling this API. Browser UI requests continue to use passkey sessions and CSRF\nvalidation.\n\nUse the API with the same credential used for `hlab`:\n\n```sh\ncurl -fsS -H \"Authorization: Bearer $HLAB_TOKEN\" \\\n  https://builder.example.com/api/v1/state\n\ncurl -fsS -X POST -H \"Authorization: Bearer $HLAB_TOKEN\" \\\n  https://builder.example.com/api/v1/builds\n```\n\nThe API also provides `GET /api/v1/builds/{id}`, `GET /api/v1/refreshes/{id}`,\n`GET /api/v1/logs/{filename}`, `POST /api/v1/refresh/{task}`, and\n`POST /api/v1/releases/{release-id}/rollback`. It returns JSON errors; queue saturation returns\n503 with `Retry-After`. The browser UI remains CSRF-protected, and bearer API authentication does\nnot grant access to the API unless ForwardAuth validates the token and returns the trusted marker.\n\nWhen `builderAdmin.enabled` is true, Helm fails unless the protected ingress, TLS secret, ingress\nhost/class, ForwardAuth URL, trusted proxy CIDRs, and builder-admin ingress NetworkPolicy are all\nconfigured. The service receives its CSRF public origin as exactly `https://\u003cingress host\u003e` from\nthe chart. Do not supply that value from request headers or alter hlab-auth's primary RP/origin.\nThe NetworkPolicy permits the configured `builderAdmin.port` only from the configured Traefik\nnamespace/pod selectors and other builder-admin pods; confirm the default labels match the\ninstalled controller. The peer-forwarding marker is accepted only from a configured trusted CIDR;\nit cannot authenticate a direct request by itself.\n\nAuthenticated `GET /` responses set a host-only, secure, HttpOnly, strict-SameSite CSRF cookie\nand include its token in each mutation form. Browser mutations must present the matching token and\nthe exact configured Origin; programmatic clients may use `X-CSRF-Token` instead of a form field.\n\n## What You Can See\n\nThe UI shows:\n\n- queued and running builds\n- recent successful and failed builds\n- the trigger source for each build\n- per-build duration and phase timings\n- full raw logs\n- parsed markata-go performance summary lines\n- current live release\n- old releases that can be promoted back to live\n- refresh task history\n\n## Reading the Operator UI\n\nThe default **Jobs** workspace is the primary operational view. It puts running work, queued\nwork, and completed builds, refreshes, and rollbacks in one list. Use **Enqueue Build** for a\nmanual build, then inspect its row for status, queue wait, build duration, trigger, and release.\n\nSelect **Details** on a build to see phase timings, changed paths, parsed performance lines, and\nthe raw log. Release pruning runs asynchronously after publication, so a completed build can be live\nbefore old release files finish deleting; the recorded prune timing updates when cleanup completes.\nRaw IDs and filesystem paths are detail data rather than dashboard metrics. On narrow screens,\neach build and release reflows into a labeled record so operators do not need to read a clipped\ndesktop table.\n\n## Protected Release Previews\n\nEach retained successful release is available at `https://\u003csite-host\u003e/__preview/\u003crelease-id\u003e/`.\nThe chart protects this path with the builder-admin ForwardAuth middleware, so unpromoted content\nis not public. Preview links expire when release retention prunes the underlying release.\n\nThe browser tab favicon also reflects live admin state so you can spot activity without keeping the tab focused:\n\n- idle when nothing is running\n- queued when work is waiting\n- build when a build or rollback is running\n- refresh when a refresh task is running\n- error when UI polling fails\n\nThe workspace tabs show one primary view at a time so build history, refresh runs, and releases do\nnot visually stack on top of each other during tab switches. Build and release timestamps also pair\nthe absolute RFC3339 value with a relative age label such as `(5m ago)`.\n\n## Build Triggers\n\nBuilder admin can enqueue builds from:\n\n- the UI\n- HTTP API calls\n- debounced file-watch events\n- successful refresh task runs when configured to enqueue a build\n- GitHub or Forgejo push webhooks\n\n## Build on Git Push\n\nEnable one builder-admin service for each environment. Each service owns one checked-out branch,\nsource directory, site directory, and webhook secret. The branch defaults to `main`.\n\n```toml\n# markata-go.toml\n[markata-go.builder_admin.webhook]\nenabled = true\nbranch = \"main\"\n```\n\nSet the HMAC secret outside version control. Environment variables override the config file, and\nexplicit flags override both:\n\n```bash\nexport MARKATA_GO_BUILDER_ADMIN_WEBHOOK_SECRET='replace-with-a-random-secret'\nmarkata-go builder-admin --webhook-enabled --webhook-branch main\n```\n\nThe endpoint is `https://\u003cbuilder-admin-host\u003e/webhook`. In GitHub, create a repository webhook\nwith that payload URL, set the same secret, select JSON payloads, and subscribe to **Push** events.\nForgejo uses the same URL and secret; select its push event. Builder admin accepts GitHub's\n`X-Hub-Signature-256` and Forgejo's `X-Gitea-Signature` headers. Invalid signatures, events other\nthan push, and pushes to another branch are ignored or rejected without running a build.\n\nFor an accepted matching push, builder admin runs `git -C \u003csource-dir\u003e pull --ff-only origin \u003cbranch\u003e`. It queues\na build only when that changes the checkout. Ensure the deployed source directory is a clean clone\nwith an authenticated `origin` remote and that its checked-out branch tracks the configured branch.\nThe normal source watcher remains active during the pull so a local author edit is never ignored.\nThat safety measure can produce a follow-up file-watch build after a push.\n\n### Helm setup\n\nThe chart exposes `/webhook` without the operator ForwardAuth middleware; HMAC validation protects\nthat endpoint. Create a Kubernetes Secret, then reference it in the environment's Helm values:\n\n```yaml\nbuilderAdmin:\n  webhook:\n    enabled: true\n    branch: main\n    existingSecretName: builder-webhook\n    existingSecretKey: webhook-secret\n```\n\nFor a public GitHub repository, the chart can initialize the source PVC as a\nshallow checkout before Builder Admin starts. It refreshes that checkout on\npod startup; signed push webhooks keep it current between restarts:\n\n```yaml\nbuilderAdmin:\n  sourceGit:\n    enabled: true\n    repository: https://github.com/WaylonWalker/markata.git\n    branch: main\n    depth: 1\n  webhook:\n    enabled: true\n    branch: main\n    existingSecretName: markata-docs-builder-webhook\n    existingSecretKey: webhook-secret\n```\n\n`sourceGit` only seeds an empty source directory or refreshes an existing Git\ncheckout. If the directory contains files but no `.git` repository, startup\nfails without deleting those files. The webhook continues to use a\nfast-forward-only pull and queues a build only when the checkout changes.\nConfigure the builder's site config with `search.configPath` when the source\nrepository uses a non-default config filename.\n\nCreate separate releases for `main`, `dev`, and `qa` when they publish different domains. Give each\nrelease a distinct source checkout, site storage, builder-admin ingress host, and webhook secret.\nPoint each repository webhook at its matching builder-admin host. Do not share a production webhook\nsecret with preview environments.\n\nIf GitHub or Forgejo reports a successful delivery but no build appears, verify the delivery branch,\nthe service's configured branch, the HMAC secret, and that `git -C \u003csource-dir\u003e pull --ff-only origin \u003cbranch\u003e`\nsucceeds in the builder container. A delivery for an unchanged commit intentionally does not queue\na build.\n\n## Rollback\n\nRollback in the first version promotes a previous rendered release by repointing the `current` symlink.\n\nThis is fast and keeps the release model simple, but it does not restore the historical source tree.\n\n## Scheduled Refresh Tasks\n\nRefresh tasks are external commands that run on an interval.\n\nExamples:\n\n- `markata-go reader update`\n- `markata-go blogroll update --force`\n- a custom remote-asset fetch command\n\nUse them to keep reader/blogroll data or other remote caches fresh without slowing down every normal content build.\n\n### Retaining a warm workspace\n\nSuccessful publication retains the completed workspace on both same-filesystem and\ncross-filesystem layouts. Builder Admin reuses it only when its successful-release\nmarker matches current. Logs report `reusing build work from current release`.\nFailed or interrupted builds and rollbacks trigger a fresh independent seed. A\npersistent workspace survives pod restarts. An `emptyDir` survives container\nrestarts but disappears with the pod. Incremental publication still compares\nunchanged bytes, so storage and host load affect elapsed time.\n\n### Background release cleanup\n\nBuilder Admin first removes obsolete releases from the published release list with an atomic rename, then deletes their files in the background. Large cleanup jobs do not hold the lock needed for promotion or rollback. Internal `.pruning-` directories are not rollback targets; interrupted cleanup is retried on the next prune run. Published build success is separate from cleanup errors, which appear in service logs.\n\n### Successful build but nginx returns 403\n\nIf nginx reports `current/index.html is forbidden (13: Permission denied)`, inspect the completed release root permissions. Builder-admin publishes release roots as `0755` so nginx can traverse them. Older cross-filesystem publication could retain a private `0700` staging directory, and subsequent seeded builds could inherit it. Upgrade the engine and correct affected retained release roots to `0755`; child file permissions do not need a recursive change for this defect.\n\n### Warm publication digest cache\n\nBuilder Admin stores a private SHA-256 manifest beside its mutable workspace.\nOn Linux, unchanged file identity and change timestamps allow cached digest reuse.\nFiles with recent or changed timestamps require content hashing. Missing or corrupt\ncache records fall back to hashing. Other platforms always hash source files.\n\nThe manifest binds the workspace and previous release. Published releases must\nstay immutable. Do not edit retained releases in place. Delete the workspace's\n`.publication.json` sibling to force content verification on the next publication.\nManifest write failures leave publication usable but disable cache reuse. Logs\nreport `cached_source_hashes`, `cached_release_hashes`, and `manifest_saved`.\nThe manifest contains file identities and digests and never appears in a release.\n\n\n## Revision provenance and new-build status\n\nBuilder Admin shows the running **Builder executable revision** beside the\nrevision used by the latest successful build, as well as the current site Git\nHEAD. Its top status banner highlights **New Builder revision has not built\nyet** when the running commit differs from every retained successful build\n(and there is reliable previous-build provenance). A queued or running build\nshows a pending state. Once a successful build using that Builder revision is\nrecorded the warning clears.\n\nNew build records persist `builder_version`, `builder_commit`, and\n`source_commit`. These are visible in Jobs details, build detail pages and\nthe authenticated `/api/v1/state` response under `revision`. Retained\nreleases also show recorded revisions where available. Older build records may\nlack these fields; the current release's diagnostics artifact provides a\nbest-effort fallback. Unknown revision identity is explicitly reported as\n**unknown**, not mistaken for an unbuilt revision.\n\nSource revision comparison is Git HEAD based. Uncommitted edits can require a\nrebuild even if HEAD matches; this status does not claim to fingerprint dirty\nsource files. The displayed Builder revision is taken from the running binary's\nbuild metadata, not the site's Git HEAD or a mutable image tag.\n",
      "summary": "Run a long-lived builder admin service for fast Kubernetes authoring loops",
      "date_published": "2026-06-27T00:00:00Z",
      "date_modified": "2026-06-27T00:00:00Z",
      "tags": [
        "documentation",
        "deployment",
        "kubernetes",
        "performance"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/webawesome/",
      "url": "https://markata.dev/docs/guides/webawesome/",
      "title": "Web Awesome Components",
      "content_html": "\u003cp\u003emarkata-go can render \u003ca href=\"https://webawesome.com/\"\u003eWeb Awesome\u003c/a\u003e components from Markdown. The built-in shortcuts focus on content patterns that make sense for blogs and docs: comparisons, expandable details, tabs, copy buttons, QR codes, badges, tags, tooltips, carousels, and animated images.\u003c/p\u003e\n\u003ch2 id=\"demo\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDemo\u003c/span\u003e \u003ca href=\"#demo\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cfigure class=\"markata-webawesome-figure\"\u003e\u003cwa-comparison class=\"markata-webawesome-comparison\" position=\"42\"\u003e\u003cimg slot=\"after\" src=\"https://images.unsplash.com/photo-1557683316-973673baf926?auto=format\u0026amp;fit=crop\u0026amp;w=1200\u0026amp;q=80\u0026amp;sat=-100\" alt=\"Before: a grayscale abstract generated graphic\" loading=\"lazy\"\u003e\u003cimg slot=\"before\" src=\"https://images.unsplash.com/photo-1557683316-973673baf926?auto=format\u0026amp;fit=crop\u0026amp;w=1200\u0026amp;q=80\" alt=\"After: a colorful abstract generated graphic\" loading=\"lazy\"\u003e\u003c/wa-comparison\u003e\u003cfigcaption\u003eCompare the same generated graphic before and after a color treatment.\u003c/figcaption\u003e\u003c/figure\u003e\n\u003ch2 id=\"theme-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTheme Integration\u003c/span\u003e \u003ca href=\"#theme-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWeb Awesome components inherit markata-go theme variables for text, surfaces, borders, radii, shadows, and semantic colors. This keeps component chrome aligned with the active palette instead of falling back to Web Awesome defaults.\u003c/p\u003e\n\u003ch2 id=\"asset-loading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAsset Loading\u003c/span\u003e \u003ca href=\"#asset-loading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWeb Awesome uses vendored assets by default (\u003ccode\u003esource = \u0026quot;vendor\u0026quot;\u003c/code\u003e). In that mode, markata-go downloads the Web Awesome npm archive, extracts the browser-ready \u003ccode\u003edist-cdn\u003c/code\u003e subtree, and serves it from \u003ccode\u003e/assets/vendor/webawesome/\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003emarkata-go assets download\u003c/code\u003e includes this archive in the default asset cache, so builder images can pre-seed Web Awesome and run with \u003ccode\u003eMARKATA_GO_OFFLINE=true\u003c/code\u003e without reaching the npm registry during a site build.\u003c/p\u003e\n\u003ch2 id=\"markdown\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMarkdown\u003c/span\u003e \u003ca href=\"#markdown\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"comparison\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComparison\u003c/span\u003e \u003ca href=\"#comparison\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWrite a \u003ccode\u003ewa-comparison\u003c/code\u003e container with two images. Author them in natural left-to-right order: the first image starts on the left side of the divider and the second image starts on the right.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: wa-comparison {position=42 caption=\u0026#34;Compare the same graphic before and after a color treatment.\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eBefore: grayscale graphic\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/graphic-before.webp\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eAfter: colorful graphic\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/graphic-after.webp\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"details\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDetails\u003c/span\u003e \u003ca href=\"#details\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse details for FAQs, spoilers, and advanced notes.\u003c/p\u003e\n\u003cwa-details summary=\"When should I self-host assets?\"\u003e\u003cp\u003eSelf-host Web Awesome when your site must build without external CDN dependencies or when your privacy policy avoids third-party asset requests.\u003c/p\u003e\u003c/wa-details\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: wa-details {summary=\u0026#34;When should I self-host assets?\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSelf-host Web Awesome when your site must build without external CDN dependencies.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"tabs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTabs\u003c/span\u003e \u003ca href=\"#tabs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse tabs for platform-specific install instructions or examples in multiple languages.\u003c/p\u003e\n\u003cwa-tab-group\u003e\n  \u003cwa-tab slot=\"nav\" panel=\"macos\"\u003emacOS\u003c/wa-tab\u003e\n  \u003cwa-tab slot=\"nav\" panel=\"linux\"\u003eLinux\u003c/wa-tab\u003e\n  \u003cwa-tab-panel name=\"macos\"\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew install markata-go\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e  \u003c/wa-tab-panel\u003e\n  \u003cwa-tab-panel name=\"linux\"\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -fsSL https://example.com/install.sh \u003cspan class=\"p\"\u003e|\u003c/span\u003e sh\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e  \u003c/wa-tab-panel\u003e\n\u003c/wa-tab-group\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: wa-tabs\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: wa-tab {label=\u0026#34;macOS\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew install markata-go\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: wa-tab {label=\u0026#34;Linux\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -fsSL https://example.com/install.sh \u003cspan class=\"p\"\u003e|\u003c/span\u003e sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"copy-button\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCopy Button\u003c/span\u003e \u003ca href=\"#copy-button\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse copy buttons next to commands, URLs, or config snippets.\u003c/p\u003e\n\u003cwa-copy-button value=\"go test ./...\"\u003e\u003c/wa-copy-button\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: wa-copy\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e`go test ./...`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"qr-code\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQR Code\u003c/span\u003e \u003ca href=\"#qr-code\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse QR codes for shareable article URLs, event links, or contact links.\u003c/p\u003e\n\u003cwa-qr-code value=\"https://example.com/docs/guides/webawesome/\" label=\"Web Awesome guide QR code\"\u003e\u003c/wa-qr-code\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: wa-qr\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehttps://example.com/docs/guides/webawesome/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"badge-and-tag\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBadge And Tag\u003c/span\u003e \u003ca href=\"#badge-and-tag\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse badges and tags for compact labels like new, stable, deprecated, or experimental.\u003c/p\u003e\n\u003cwa-badge variant=\"brand\"\u003eNew\u003c/wa-badge\u003e\n\u003cwa-tag variant=\"success\"\u003eStable\u003c/wa-tag\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: wa-badge {variant=\u0026#34;brand\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eNew\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: wa-tag {variant=\u0026#34;success\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eStable\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"tooltip\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTooltip\u003c/span\u003e \u003ca href=\"#tooltip\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse tooltips for short inline explanations.\u003c/p\u003e\n\u003cspan class=\"markata-wa-tooltip-anchor\" id=\"wa-tt-353a49589e513a18\" tabindex=\"0\"\u003eSSG\u003c/span\u003e\u003cwa-tooltip for=\"wa-tt-353a49589e513a18\"\u003eStatic Site Generator\u003c/wa-tooltip\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: wa-tooltip {content=\u0026#34;Static Site Generator\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSSG\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"carousel\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCarousel\u003c/span\u003e \u003ca href=\"#carousel\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse carousels for screenshot galleries or visual changelogs.\u003c/p\u003e\n\u003cwa-carousel navigation=\"true\" pagination=\"true\"\u003e\u003cwa-carousel-item\u003e\u003cimg src=\"https://images.unsplash.com/photo-1498050108023-c5249f4df085?auto=format\u0026amp;fit=crop\u0026amp;w=1200\u0026amp;q=80\" alt=\"First screenshot\" loading=\"lazy\" decoding=\"async\" style=\"display: block; max-width: 100%; max-height: 100%; width: auto !important; height: auto !important; object-fit: contain !important; border-radius: var(--radius-lg);\"\u003e\u003c/wa-carousel-item\u003e\u003cwa-carousel-item\u003e\u003cimg src=\"https://images.unsplash.com/photo-1515879218367-8466d910aaa4?auto=format\u0026amp;fit=crop\u0026amp;w=1200\u0026amp;q=80\" alt=\"Second screenshot\" loading=\"lazy\" decoding=\"async\" style=\"display: block; max-width: 100%; max-height: 100%; width: auto !important; height: auto !important; object-fit: contain !important; border-radius: var(--radius-lg);\"\u003e\u003c/wa-carousel-item\u003e\u003c/wa-carousel\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: wa-carousel {navigation=\u0026#34;true\u0026#34; pagination=\u0026#34;true\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eFirst screenshot\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/one.webp\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFirst screenshot caption\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eSecond screenshot\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/two.webp\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSecond screenshot caption\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"animated-image\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAnimated Image\u003c/span\u003e \u003ca href=\"#animated-image\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse animated images to give readers play and pause controls for GIF or animated WebP content.\u003c/p\u003e\n\u003cwa-animated-image src=\"https://media.giphy.com/media/26tn33aiTi1jkl6H6/giphy.gif\" alt=\"Animated demo\"\u003e\u003c/wa-animated-image\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: wa-animated-image\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eAnimated demo\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/demo.gif\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe longer \u003ccode\u003e::: webawesome comparison\u003c/code\u003e form remains supported as an alias, but \u003ccode\u003ewa-*\u003c/code\u003e is the recommended authoring style. You can combine Web Awesome container classes with layout or utility classes; for example, a rendered container with \u003ccode\u003eclass=\u0026quot;not-prose wa-carousel\u0026quot;\u003c/code\u003e is still detected and converted.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: webawesome comparison {position=65}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eBefore\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/before.webp\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eAfter\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/after.webp\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEnable the plugin in your hooks list. The default \u003ccode\u003esource\u003c/code\u003e is \u003ccode\u003e\u0026quot;vendor\u0026quot;\u003c/code\u003e, which downloads and self-hosts Web Awesome through the shared \u003ccode\u003e[markata-go.assets]\u003c/code\u003e pipeline.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehooks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;webawesome\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebawesome\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esource\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;vendor\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eversion\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;3.5.0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;assets/vendor/webawesome\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebrand\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blue\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen \u003ccode\u003esource = \u0026quot;vendor\u0026quot;\u003c/code\u003e, Web Awesome is downloaded into the shared assets cache (\u003ccode\u003e[markata-go.assets].cache_dir\u003c/code\u003e) and published under the shared vendor root (\u003ccode\u003e[markata-go.assets].output_dir\u003c/code\u003e). The plugin\u0026rsquo;s \u003ccode\u003eoutput_dir\u003c/code\u003e remains \u003ccode\u003eassets/vendor/webawesome\u003c/code\u003e by default so pages load \u003ccode\u003e/assets/vendor/webawesome/...\u003c/code\u003e URLs.\u003c/p\u003e\n\u003cp\u003eIf you prefer to load assets from a CDN instead of self-hosting, set \u003ccode\u003esource = \u0026quot;cdn\u0026quot;\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebawesome\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esource\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cdn\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eversion\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;3.5.0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# cdn_base_url defaults to https://cdn.jsdelivr.net/npm/@awesome.me/webawesome@\u0026lt;version\u0026gt;/dist-cdn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSelf-hosting (the default) is recommended when your site must build without external CDN dependencies, when your privacy policy avoids third-party asset requests, or when you want stable, immutable component versions tied to your repo. You can prefetch the shared asset cache with \u003ccode\u003emarkata-go assets download\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"raw-components\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRaw Components\u003c/span\u003e \u003ca href=\"#raw-components\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRaw Web Awesome HTML works too. Any page containing a \u003ccode\u003e\u0026lt;wa-*\u0026gt;\u003c/code\u003e element automatically gets the configured Web Awesome assets.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ewa-callout\u003c/span\u003e \u003cspan class=\"na\"\u003evariant\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;brand\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eRaw Web Awesome also works.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ewa-callout\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cwa-callout variant=\"brand\"\u003eRaw Web Awesome also works.\u003c/wa-callout\u003e\u003c/p\u003e\n\u003ch2 id=\"component-loading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComponent Loading\u003c/span\u003e \u003ca href=\"#component-loading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePages that use any \u003ccode\u003ewa-*\u003c/code\u003e element automatically get the Web Awesome stylesheet and initialized Web Awesome autoloader. The built-in template imports \u003ccode\u003ewebawesome.loader.js\u003c/code\u003e, sets the configured base path, and calls \u003ccode\u003estartLoader()\u003c/code\u003e so the autoloader watches the document for \u003ccode\u003e\u0026lt;wa-*\u0026gt;\u003c/code\u003e tags and lazy-imports the matching component modules on demand. Each page only downloads what it actually uses. Pages without \u003ccode\u003ewa-*\u003c/code\u003e elements do not load Web Awesome CSS or JavaScript.\u003c/p\u003e\n\u003cp\u003eWhen \u003ccode\u003esource = \u0026quot;vendor\u0026quot;\u003c/code\u003e, the theme stylesheet and autoloader are served from your site under \u003ccode\u003eoutput_dir\u003c/code\u003e (for example \u003ccode\u003e/assets/vendor/webawesome/styles/themes/default.css\u003c/code\u003e and \u003ccode\u003e/assets/vendor/webawesome/webawesome.loader.js\u003c/code\u003e). The focused theme stylesheet avoids Web Awesome\u0026rsquo;s global native-element styles so normal site typography and link styling stay unchanged. These files come from the npm tarball downloaded through the shared \u003ccode\u003e[markata-go.assets]\u003c/code\u003e cache/output pipeline. When \u003ccode\u003esource = \u0026quot;cdn\u0026quot;\u003c/code\u003e, they are served from the browser-ready \u003ccode\u003ehttps://cdn.jsdelivr.net/npm/@awesome.me/webawesome@VERSION/dist-cdn/\u003c/code\u003e subtree.\u003c/p\u003e\n",
      "content_text": "\n\nmarkata-go can render [Web Awesome](https://webawesome.com/) components from Markdown. The built-in shortcuts focus on content patterns that make sense for blogs and docs: comparisons, expandable details, tabs, copy buttons, QR codes, badges, tags, tooltips, carousels, and animated images.\n\n## Demo\n\n::: wa-comparison {position=42 caption=\"Compare the same generated graphic before and after a color treatment.\"}\n![Before: a grayscale abstract generated graphic](https://images.unsplash.com/photo-1557683316-973673baf926?auto=format\u0026fit=crop\u0026w=1200\u0026q=80\u0026sat=-100)\n![After: a colorful abstract generated graphic](https://images.unsplash.com/photo-1557683316-973673baf926?auto=format\u0026fit=crop\u0026w=1200\u0026q=80)\n:::\n\n## Theme Integration\n\nWeb Awesome components inherit markata-go theme variables for text, surfaces, borders, radii, shadows, and semantic colors. This keeps component chrome aligned with the active palette instead of falling back to Web Awesome defaults.\n\n## Asset Loading\n\nWeb Awesome uses vendored assets by default (`source = \"vendor\"`). In that mode, markata-go downloads the Web Awesome npm archive, extracts the browser-ready `dist-cdn` subtree, and serves it from `/assets/vendor/webawesome/`.\n\n`markata-go assets download` includes this archive in the default asset cache, so builder images can pre-seed Web Awesome and run with `MARKATA_GO_OFFLINE=true` without reaching the npm registry during a site build.\n\n## Markdown\n\n### Comparison\n\nWrite a `wa-comparison` container with two images. Author them in natural left-to-right order: the first image starts on the left side of the divider and the second image starts on the right.\n\n```markdown\n::: wa-comparison {position=42 caption=\"Compare the same graphic before and after a color treatment.\"}\n![Before: grayscale graphic](/images/graphic-before.webp)\n![After: colorful graphic](/images/graphic-after.webp)\n:::\n```\n\n### Details\n\nUse details for FAQs, spoilers, and advanced notes.\n\n::: wa-details {summary=\"When should I self-host assets?\"}\nSelf-host Web Awesome when your site must build without external CDN dependencies or when your privacy policy avoids third-party asset requests.\n:::\n\n```markdown\n::: wa-details {summary=\"When should I self-host assets?\"}\nSelf-host Web Awesome when your site must build without external CDN dependencies.\n:::\n```\n\n### Tabs\n\nUse tabs for platform-specific install instructions or examples in multiple languages.\n\n\u003cwa-tab-group\u003e\n  \u003cwa-tab slot=\"nav\" panel=\"macos\"\u003emacOS\u003c/wa-tab\u003e\n  \u003cwa-tab slot=\"nav\" panel=\"linux\"\u003eLinux\u003c/wa-tab\u003e\n  \u003cwa-tab-panel name=\"macos\"\u003e\n\n```bash\nbrew install markata-go\n```\n\n  \u003c/wa-tab-panel\u003e\n  \u003cwa-tab-panel name=\"linux\"\u003e\n\n```bash\ncurl -fsSL https://example.com/install.sh | sh\n```\n\n  \u003c/wa-tab-panel\u003e\n\u003c/wa-tab-group\u003e\n\n````markdown\n::: wa-tabs\n\n:::: wa-tab {label=\"macOS\"}\n```bash\nbrew install markata-go\n```\n::::\n\n:::: wa-tab {label=\"Linux\"}\n```bash\ncurl -fsSL https://example.com/install.sh | sh\n```\n::::\n:::\n````\n\n### Copy Button\n\nUse copy buttons next to commands, URLs, or config snippets.\n\n::: wa-copy\n`go test ./...`\n:::\n\n```markdown\n::: wa-copy\n`go test ./...`\n:::\n```\n\n### QR Code\n\nUse QR codes for shareable article URLs, event links, or contact links.\n\n::: wa-qr {label=\"Web Awesome guide QR code\"}\nhttps://example.com/docs/guides/webawesome/\n:::\n\n```markdown\n::: wa-qr\nhttps://example.com/docs/guides/webawesome/\n:::\n```\n\n### Badge And Tag\n\nUse badges and tags for compact labels like new, stable, deprecated, or experimental.\n\n::: wa-badge {variant=\"brand\"}\nNew\n:::\n\n::: wa-tag {variant=\"success\"}\nStable\n:::\n\n```markdown\n::: wa-badge {variant=\"brand\"}\nNew\n:::\n\n::: wa-tag {variant=\"success\"}\nStable\n:::\n```\n\n### Tooltip\n\nUse tooltips for short inline explanations.\n\n::: wa-tooltip {content=\"Static Site Generator\"}\nSSG\n:::\n\n```markdown\n::: wa-tooltip {content=\"Static Site Generator\"}\nSSG\n:::\n```\n\n### Carousel\n\nUse carousels for screenshot galleries or visual changelogs.\n\n::: wa-carousel {navigation=\"true\" pagination=\"true\"}\n![First screenshot](https://images.unsplash.com/photo-1498050108023-c5249f4df085?auto=format\u0026fit=crop\u0026w=1200\u0026q=80)\n![Second screenshot](https://images.unsplash.com/photo-1515879218367-8466d910aaa4?auto=format\u0026fit=crop\u0026w=1200\u0026q=80)\n:::\n\n```markdown\n::: wa-carousel {navigation=\"true\" pagination=\"true\"}\n![First screenshot](/images/one.webp)\nFirst screenshot caption\n![Second screenshot](/images/two.webp)\nSecond screenshot caption\n:::\n```\n\n### Animated Image\n\nUse animated images to give readers play and pause controls for GIF or animated WebP content.\n\n::: wa-animated-image\n![Animated demo](https://media.giphy.com/media/26tn33aiTi1jkl6H6/giphy.gif)\n:::\n\n```markdown\n::: wa-animated-image\n![Animated demo](/images/demo.gif)\n:::\n```\n\nThe longer `::: webawesome comparison` form remains supported as an alias, but `wa-*` is the recommended authoring style. You can combine Web Awesome container classes with layout or utility classes; for example, a rendered container with `class=\"not-prose wa-carousel\"` is still detected and converted.\n\n```markdown\n::: webawesome comparison {position=65}\n![Before](/images/before.webp)\n![After](/images/after.webp)\n:::\n```\n\n## Configuration\n\nEnable the plugin in your hooks list. The default `source` is `\"vendor\"`, which downloads and self-hosts Web Awesome through the shared `[markata-go.assets]` pipeline.\n\n```toml\n[markata-go]\nhooks = [\"default\", \"webawesome\"]\n\n[markata-go.webawesome]\nenabled = true\nsource = \"vendor\"\nversion = \"3.5.0\"\noutput_dir = \"assets/vendor/webawesome\"\ntheme = \"default\"\npalette = \"default\"\nbrand = \"blue\"\n```\n\nWhen `source = \"vendor\"`, Web Awesome is downloaded into the shared assets cache (`[markata-go.assets].cache_dir`) and published under the shared vendor root (`[markata-go.assets].output_dir`). The plugin's `output_dir` remains `assets/vendor/webawesome` by default so pages load `/assets/vendor/webawesome/...` URLs.\n\nIf you prefer to load assets from a CDN instead of self-hosting, set `source = \"cdn\"`:\n\n```toml\n[markata-go.webawesome]\nsource = \"cdn\"\nversion = \"3.5.0\"\n# cdn_base_url defaults to https://cdn.jsdelivr.net/npm/@awesome.me/webawesome@\u003cversion\u003e/dist-cdn\n```\n\nSelf-hosting (the default) is recommended when your site must build without external CDN dependencies, when your privacy policy avoids third-party asset requests, or when you want stable, immutable component versions tied to your repo. You can prefetch the shared asset cache with `markata-go assets download`.\n\n## Raw Components\n\nRaw Web Awesome HTML works too. Any page containing a `\u003cwa-*\u003e` element automatically gets the configured Web Awesome assets.\n\n```html\n\u003cwa-callout variant=\"brand\"\u003eRaw Web Awesome also works.\u003c/wa-callout\u003e\n```\n\n\u003cwa-callout variant=\"brand\"\u003eRaw Web Awesome also works.\u003c/wa-callout\u003e\n\n## Component Loading\n\nPages that use any `wa-*` element automatically get the Web Awesome stylesheet and initialized Web Awesome autoloader. The built-in template imports `webawesome.loader.js`, sets the configured base path, and calls `startLoader()` so the autoloader watches the document for `\u003cwa-*\u003e` tags and lazy-imports the matching component modules on demand. Each page only downloads what it actually uses. Pages without `wa-*` elements do not load Web Awesome CSS or JavaScript.\n\nWhen `source = \"vendor\"`, the theme stylesheet and autoloader are served from your site under `output_dir` (for example `/assets/vendor/webawesome/styles/themes/default.css` and `/assets/vendor/webawesome/webawesome.loader.js`). The focused theme stylesheet avoids Web Awesome's global native-element styles so normal site typography and link styling stay unchanged. These files come from the npm tarball downloaded through the shared `[markata-go.assets]` cache/output pipeline. When `source = \"cdn\"`, they are served from the browser-ready `https://cdn.jsdelivr.net/npm/@awesome.me/webawesome@VERSION/dist-cdn/` subtree.\n",
      "summary": "Use Web Awesome components in Markdown, including image comparisons with vendored or CDN assets.",
      "date_published": "2026-04-28T00:00:00Z",
      "date_modified": "2026-04-28T00:00:00Z",
      "tags": [
        "documentation",
        "markdown",
        "webawesome"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/python-docs/",
      "url": "https://markata.dev/docs/guides/python-docs/",
      "title": "Python Source Docs",
      "content_html": "\u003cp\u003eUse the optional \u003ccode\u003epython_docs\u003c/code\u003e plugin to turn Python modules into source-backed documentation pages.\u003c/p\u003e\n\u003cp\u003eThe plugin only runs when it is explicitly listed in \u003ccode\u003ehooks\u003c/code\u003e and enabled in its config section.\u003c/p\u003e\n\u003ch2 id=\"example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample\u003c/span\u003e \u003ca href=\"#example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehooks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;python_docs\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epython_docs\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;src/**/*.py\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pkg/**/*.py\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;**/tests/**\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;**/.venv/**\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug_prefix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;api\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_source\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_module_code\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epublished\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis creates one generated post per discovered Python module.\u003c/p\u003e\n\u003cp\u003eExamples:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003epkg/util.py\u003c/code\u003e -\u0026gt; \u003ccode\u003e/api/pkg/util/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epkg/client/http.py\u003c/code\u003e -\u0026gt; \u003ccode\u003e/api/pkg/client/http/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epkg/__init__.py\u003c/code\u003e -\u0026gt; \u003ccode\u003e/api/pkg/\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"what-gets-rendered\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat Gets Rendered\u003c/span\u003e \u003ca href=\"#what-gets-rendered\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor each module, the plugin generates markdown that includes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ethe module name and source path\u003c/li\u003e\n\u003cli\u003ethe module docstring rendered as markdown\u003c/li\u003e\n\u003cli\u003ean imports section\u003c/li\u003e\n\u003cli\u003ean API index for classes and functions\u003c/li\u003e\n\u003cli\u003eper-symbol sections with signatures and docstrings\u003c/li\u003e\n\u003cli\u003ecollapsible source snippets without repeated leading docstrings\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"cross-linking\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCross-Linking\u003c/span\u003e \u003ca href=\"#cross-linking\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen multiple modules are documented together, the plugin links internal references where possible.\u003c/p\u003e\n\u003cp\u003eSupported cases include:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eimport lists like \u003ccode\u003efrom pkg.util import greet\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ebackticked references like \u003ccode\u003e`pkg.util`\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eSphinx-style refs like \u003ccode\u003e:func:\u003c/code\u003epkg.util.greet``\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"common-options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Options\u003c/span\u003e \u003ca href=\"#common-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehooks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;python_docs\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epython_docs\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;src/**/*.py\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edirectories\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pkg\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;scripts\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;**/tests/**\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003euse_gitignore\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug_prefix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;reference\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epublished\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_private\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_source\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_module_code\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;python\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einterpreter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;python3\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"notes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNotes\u003c/span\u003e \u003ca href=\"#notes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eThe plugin requires a Python interpreter on \u003ccode\u003ePATH\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eThe plugin must be listed in \u003ccode\u003e[markata-go].hooks\u003c/code\u003e as \u003ccode\u003epython_docs\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eMarkdown content loading is unchanged; Python docs are added alongside normal posts.\u003c/li\u003e\n\u003cli\u003eGenerated docs are unpublished by default so they stay out of feeds and sitemap unless you opt in.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"related\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRelated\u003c/span\u003e \u003ca href=\"#related\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"../reference/plugins.md\"\u003eBuilt-in Plugins Reference\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"./configuration.md\"\u003eConfiguration Reference\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nUse the optional `python_docs` plugin to turn Python modules into source-backed documentation pages.\n\nThe plugin only runs when it is explicitly listed in `hooks` and enabled in its config section.\n\n## Example\n\n```toml\n[markata-go]\nhooks = [\"default\", \"python_docs\"]\n\n[markata-go.python_docs]\nenabled = true\npatterns = [\"src/**/*.py\", \"pkg/**/*.py\"]\nexclude = [\"**/tests/**\", \"**/.venv/**\"]\nslug_prefix = \"api\"\ntemplate = \"docs\"\ninclude_source = true\ninclude_module_code = false\npublished = false\n```\n\nThis creates one generated post per discovered Python module.\n\nExamples:\n\n- `pkg/util.py` -\u003e `/api/pkg/util/`\n- `pkg/client/http.py` -\u003e `/api/pkg/client/http/`\n- `pkg/__init__.py` -\u003e `/api/pkg/`\n\n## What Gets Rendered\n\nFor each module, the plugin generates markdown that includes:\n\n- the module name and source path\n- the module docstring rendered as markdown\n- an imports section\n- an API index for classes and functions\n- per-symbol sections with signatures and docstrings\n- collapsible source snippets without repeated leading docstrings\n\n## Cross-Linking\n\nWhen multiple modules are documented together, the plugin links internal references where possible.\n\nSupported cases include:\n\n- import lists like `from pkg.util import greet`\n- backticked references like `` `pkg.util` ``\n- Sphinx-style refs like `:func:`pkg.util.greet``\n\n## Common Options\n\n```toml\n[markata-go]\nhooks = [\"default\", \"python_docs\"]\n\n[markata-go.python_docs]\nenabled = true\npatterns = [\"src/**/*.py\"]\ndirectories = [\"pkg\", \"scripts\"]\nexclude = [\"**/tests/**\"]\nuse_gitignore = true\nslug_prefix = \"reference\"\ntemplate = \"docs\"\npublished = false\ninclude_private = false\ninclude_source = true\ninclude_module_code = false\ntags = [\"python\", \"docs\"]\ninterpreter = \"python3\"\n```\n\n## Notes\n\n- The plugin requires a Python interpreter on `PATH`.\n- The plugin must be listed in `[markata-go].hooks` as `python_docs`.\n- Markdown content loading is unchanged; Python docs are added alongside normal posts.\n- Generated docs are unpublished by default so they stay out of feeds and sitemap unless you opt in.\n\n## Related\n\n- [Built-in Plugins Reference](../reference/plugins.md)\n- [Configuration Reference](./configuration.md)\n",
      "summary": "Generate API reference pages from Python source files with the optional python_docs plugin",
      "date_published": "2026-04-13T00:00:00Z",
      "date_modified": "2026-04-13T00:00:00Z",
      "tags": [
        "documentation",
        "plugins",
        "python"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/ai-agent-prompts/",
      "url": "https://markata.dev/docs/guides/ai-agent-prompts/",
      "title": "AI Agent Prompt Templates",
      "content_html": "\u003cp\u003emarkata-go includes reusable GPT-5.4 prompt templates for OpenCode workflows.\nUse the generator script to fetch issue metadata from GitHub and render prompt\nfiles for either a single issue or a group of issues.\u003c/p\u003e\n\u003ch2 id=\"files\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFiles\u003c/span\u003e \u003ca href=\"#files\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003econtinue-prompt-gpt-54.template.txt\u003c/code\u003e - multi-issue template\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econtinue-prompt-gpt-54-single-issue.template.txt\u003c/code\u003e - single-issue template\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003escripts/fill_continue_prompts.py\u003c/code\u003e - generator script\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"generate-prompt-files\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGenerate Prompt Files\u003c/span\u003e \u003ca href=\"#generate-prompt-files\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGenerate a multi-issue prompt and one single-issue prompt:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython scripts/fill_continue_prompts.py \u003cspan class=\"m\"\u003e942\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eGenerate a multi-issue prompt for several issues plus one single-issue prompt\nper issue:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython scripts/fill_continue_prompts.py \u003cspan class=\"m\"\u003e935\u003c/span\u003e \u003cspan class=\"m\"\u003e936\u003c/span\u003e \u003cspan class=\"m\"\u003e937\u003c/span\u003e \u003cspan class=\"m\"\u003e938\u003c/span\u003e \u003cspan class=\"m\"\u003e939\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWrite the rendered content back to the root prompt filenames too:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython scripts/fill_continue_prompts.py \u003cspan class=\"m\"\u003e942\u003c/span\u003e --write-root-prompts\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOptions\u003c/span\u003e \u003ca href=\"#options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse a different worktree root hint:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython scripts/fill_continue_prompts.py \u003cspan class=\"m\"\u003e942\u003c/span\u003e --worktree-root ../worktrees\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWrite outputs to a different directory:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython scripts/fill_continue_prompts.py \u003cspan class=\"m\"\u003e942\u003c/span\u003e --output-dir /tmp/prompts\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse a different repository:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython scripts/fill_continue_prompts.py \u003cspan class=\"m\"\u003e942\u003c/span\u003e --repo owner/repo\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"output-naming\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOutput Naming\u003c/span\u003e \u003ca href=\"#output-naming\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor issue \u003ccode\u003e942\u003c/code\u003e, the script writes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003econtinue-prompt-gpt-54-issues-942.txt\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econtinue-prompt-gpt-54-issue-942.txt\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFor issues \u003ccode\u003e935 936 937\u003c/code\u003e, the script writes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003econtinue-prompt-gpt-54-issues-935-936-937.txt\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econtinue-prompt-gpt-54-issue-935.txt\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econtinue-prompt-gpt-54-issue-936.txt\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econtinue-prompt-gpt-54-issue-937.txt\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"notes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNotes\u003c/span\u003e \u003ca href=\"#notes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eThe script requires the GitHub CLI and access to the target repository.\u003c/li\u003e\n\u003cli\u003eSingle-issue prompts include a suggested branch name and worktree path hint.\u003c/li\u003e\n\u003cli\u003eThe templates stay editable as plain text, so prompt tuning does not require\nPython changes.\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nmarkata-go includes reusable GPT-5.4 prompt templates for OpenCode workflows.\nUse the generator script to fetch issue metadata from GitHub and render prompt\nfiles for either a single issue or a group of issues.\n\n## Files\n\n- `continue-prompt-gpt-54.template.txt` - multi-issue template\n- `continue-prompt-gpt-54-single-issue.template.txt` - single-issue template\n- `scripts/fill_continue_prompts.py` - generator script\n\n## Generate Prompt Files\n\nGenerate a multi-issue prompt and one single-issue prompt:\n\n```bash\npython scripts/fill_continue_prompts.py 942\n```\n\nGenerate a multi-issue prompt for several issues plus one single-issue prompt\nper issue:\n\n```bash\npython scripts/fill_continue_prompts.py 935 936 937 938 939\n```\n\nWrite the rendered content back to the root prompt filenames too:\n\n```bash\npython scripts/fill_continue_prompts.py 942 --write-root-prompts\n```\n\n## Options\n\nUse a different worktree root hint:\n\n```bash\npython scripts/fill_continue_prompts.py 942 --worktree-root ../worktrees\n```\n\nWrite outputs to a different directory:\n\n```bash\npython scripts/fill_continue_prompts.py 942 --output-dir /tmp/prompts\n```\n\nUse a different repository:\n\n```bash\npython scripts/fill_continue_prompts.py 942 --repo owner/repo\n```\n\n## Output Naming\n\nFor issue `942`, the script writes:\n\n- `continue-prompt-gpt-54-issues-942.txt`\n- `continue-prompt-gpt-54-issue-942.txt`\n\nFor issues `935 936 937`, the script writes:\n\n- `continue-prompt-gpt-54-issues-935-936-937.txt`\n- `continue-prompt-gpt-54-issue-935.txt`\n- `continue-prompt-gpt-54-issue-936.txt`\n- `continue-prompt-gpt-54-issue-937.txt`\n\n## Notes\n\n- The script requires the GitHub CLI and access to the target repository.\n- Single-issue prompts include a suggested branch name and worktree path hint.\n- The templates stay editable as plain text, so prompt tuning does not require\n  Python changes.\n",
      "summary": "Generate OpenCode GPT-5.4 prompt files from one or more GitHub issues",
      "date_published": "2026-03-12T00:00:00Z",
      "date_modified": "2026-03-12T00:00:00Z",
      "tags": [
        "documentation",
        "ai",
        "prompts",
        "automation"
      ]
    },
    {
      "id": "https://markata.dev/docs/plans/2026-02-16-cli-list-design/",
      "url": "https://markata.dev/docs/plans/2026-02-16-cli-list-design/",
      "title": "CLI List Command Design",
      "content_html": "\u003ch2 id=\"goal\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGoal\u003c/span\u003e \u003ca href=\"#goal\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd a \u003ccode\u003elist\u003c/code\u003e command with \u003ccode\u003eposts\u003c/code\u003e, \u003ccode\u003etags\u003c/code\u003e, and \u003ccode\u003efeeds\u003c/code\u003e subcommands for fast, scriptable data exploration. Output must support a Unix-friendly path-only format for piping.\u003c/p\u003e\n\u003ch2 id=\"command-shape\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommand Shape\u003c/span\u003e \u003ca href=\"#command-shape\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go list posts\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go list tags\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go list feeds\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eShared flags:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e--format\u003c/code\u003e (\u003ccode\u003etable\u003c/code\u003e default, \u003ccode\u003ejson\u003c/code\u003e, \u003ccode\u003ecsv\u003c/code\u003e, \u003ccode\u003epath\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--sort\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--order\u003c/code\u003e (\u003ccode\u003easc\u003c/code\u003e or \u003ccode\u003edesc\u003c/code\u003e, default \u003ccode\u003edesc\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--filter\u003c/code\u003e (posts only, passed to filter expression engine)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"output-formats\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOutput Formats\u003c/span\u003e \u003ca href=\"#output-formats\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003etable\u003c/code\u003e: fixed-width ASCII table with headers, no color\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ejson\u003c/code\u003e: array of objects with raw values\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecsv\u003c/code\u003e: header row + values, same column order as table\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epath\u003c/code\u003e: one value per line, optimized for piping\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePath format fields:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eposts: \u003ccode\u003epath\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003etags: \u003ccode\u003ename\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003efeeds: \u003ccode\u003epath\u003c/code\u003e (fallback to \u003ccode\u003ename\u003c/code\u003e if missing)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"cache\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCache\u003c/span\u003e \u003ca href=\"#cache\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eCache file: \u003ccode\u003e.markata/cache/list.json\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eReused when config hash matches and file metadata is unchanged\u003c/li\u003e\n\u003cli\u003ePartial refresh re-parses only changed files and rebuilds tags/feeds from cached posts\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"data-sources\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eData Sources\u003c/span\u003e \u003ca href=\"#data-sources\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUse \u003ccode\u003eservices.App\u003c/code\u003e and \u003ccode\u003eBuild.LoadForTUI\u003c/code\u003e for consistent stats and feed data.\u003c/li\u003e\n\u003cli\u003ePosts: \u003ccode\u003ePosts.List\u003c/code\u003e with \u003ccode\u003eListOptions\u003c/code\u003e for sort/filter.\u003c/li\u003e\n\u003cli\u003eTags: \u003ccode\u003eTags.List\u003c/code\u003e, sorted in CLI when custom sort requested.\u003c/li\u003e\n\u003cli\u003eFeeds: \u003ccode\u003eFeeds.List\u003c/code\u003e, sorted in CLI when custom sort requested.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"sorting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSorting\u003c/span\u003e \u003ca href=\"#sorting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePosts: \u003ccode\u003edate\u003c/code\u003e, \u003ccode\u003etitle\u003c/code\u003e, \u003ccode\u003ewords\u003c/code\u003e, \u003ccode\u003epath\u003c/code\u003e, \u003ccode\u003ereading_time\u003c/code\u003e, \u003ccode\u003etags\u003c/code\u003e (service-level).\u003c/p\u003e\n\u003cp\u003eTags: \u003ccode\u003ename\u003c/code\u003e, \u003ccode\u003ecount\u003c/code\u003e, \u003ccode\u003ewords\u003c/code\u003e, \u003ccode\u003ereading_time\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eFeeds: \u003ccode\u003ename\u003c/code\u003e, \u003ccode\u003eposts\u003c/code\u003e, \u003ccode\u003ewords\u003c/code\u003e, \u003ccode\u003ereading_time\u003c/code\u003e, \u003ccode\u003eavg_reading_time\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"errors\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eErrors\u003c/span\u003e \u003ca href=\"#errors\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eInvalid format/sort/order: print a clear error and exit code 1.\u003c/li\u003e\n\u003cli\u003eLoad errors: return the underlying error.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"docs-spec\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocs + Spec\u003c/span\u003e \u003ca href=\"#docs-spec\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eNew spec file for \u003ccode\u003elist\u003c/code\u003e behavior.\u003c/li\u003e\n\u003cli\u003eUpdate CLI reference and add a short guide with examples.\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\n## Goal\n\nAdd a `list` command with `posts`, `tags`, and `feeds` subcommands for fast, scriptable data exploration. Output must support a Unix-friendly path-only format for piping.\n\n## Command Shape\n\n- `markata-go list posts`\n- `markata-go list tags`\n- `markata-go list feeds`\n\nShared flags:\n\n- `--format` (`table` default, `json`, `csv`, `path`)\n- `--sort`\n- `--order` (`asc` or `desc`, default `desc`)\n- `--filter` (posts only, passed to filter expression engine)\n\n## Output Formats\n\n- `table`: fixed-width ASCII table with headers, no color\n- `json`: array of objects with raw values\n- `csv`: header row + values, same column order as table\n- `path`: one value per line, optimized for piping\n\nPath format fields:\n\n- posts: `path`\n- tags: `name`\n- feeds: `path` (fallback to `name` if missing)\n\n## Cache\n\n- Cache file: `.markata/cache/list.json`\n- Reused when config hash matches and file metadata is unchanged\n- Partial refresh re-parses only changed files and rebuilds tags/feeds from cached posts\n\n## Data Sources\n\n- Use `services.App` and `Build.LoadForTUI` for consistent stats and feed data.\n- Posts: `Posts.List` with `ListOptions` for sort/filter.\n- Tags: `Tags.List`, sorted in CLI when custom sort requested.\n- Feeds: `Feeds.List`, sorted in CLI when custom sort requested.\n\n## Sorting\n\nPosts: `date`, `title`, `words`, `path`, `reading_time`, `tags` (service-level).\n\nTags: `name`, `count`, `words`, `reading_time`.\n\nFeeds: `name`, `posts`, `words`, `reading_time`, `avg_reading_time`.\n\n## Errors\n\n- Invalid format/sort/order: print a clear error and exit code 1.\n- Load errors: return the underlying error.\n\n## Docs + Spec\n\n- New spec file for `list` behavior.\n- Update CLI reference and add a short guide with examples.\n",
      "summary": "Design for list subcommands and formats for data exploration",
      "date_published": "2026-02-16T00:00:00Z",
      "date_modified": "2026-02-16T00:00:00Z",
      "tags": [
        "documentation",
        "plan",
        "cli"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/data-exploration/",
      "url": "https://markata.dev/docs/guides/data-exploration/",
      "title": "Data Exploration",
      "content_html": "\u003cp\u003eUse \u003ccode\u003elist\u003c/code\u003e for scriptable output and \u003ccode\u003etui\u003c/code\u003e for interactive browsing.\u003c/p\u003e\n\u003ch2 id=\"list-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eList Posts\u003c/span\u003e \u003ca href=\"#list-posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Default table output\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list posts\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Path-only output for piping\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list posts --format path\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Filter posts with an expression\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list posts --filter \u003cspan class=\"s2\"\u003e\u0026#34;published == true and \u0026#39;go\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Sort by title, ascending\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list posts --sort title --order asc\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List posts for a feed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list posts --feed blog\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"list-tags\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eList Tags\u003c/span\u003e \u003ca href=\"#list-tags\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Table output\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list tags\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# JSON output for scripts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list tags --format json\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"list-feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eList Feeds\u003c/span\u003e \u003ca href=\"#list-feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Table output\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list feeds\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# CSV output for spreadsheets\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list feeds --format csv\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List posts for a feed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list feeds posts blog\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List post paths for a feed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list feeds posts blog --format path\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"path-only-output\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePath-Only Output\u003c/span\u003e \u003ca href=\"#path-only-output\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ccode\u003epath\u003c/code\u003e format prints one value per line for easy piping:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Open each post in your editor\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list posts --format path \u003cspan class=\"p\"\u003e|\u003c/span\u003e xargs -n \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"nv\"\u003e$EDITOR\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create a tag list file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list tags --format path \u0026gt; tags.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen \u003ccode\u003e--site-dir\u003c/code\u003e or \u003ccode\u003eMARKATA_GO_SITE_DIR\u003c/code\u003e selects a site, post paths are\nabsolute. This lets agents and scripts edit results from any directory:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go --site-dir ~/sites/blog search \u003cspan class=\"s2\"\u003e\u0026#34;configuration\u0026#34;\u003c/span\u003e --format path\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Edit the returned Markdown path directly.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"interactive-browsing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInteractive Browsing\u003c/span\u003e \u003ca href=\"#interactive-browsing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor a full-screen view with filtering and sorting:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go tui\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"cache\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCache\u003c/span\u003e \u003ca href=\"#cache\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003elist\u003c/code\u003e and \u003ccode\u003etui\u003c/code\u003e use a persistent cache at \u003ccode\u003e.markata/cache/list.json\u003c/code\u003e. It updates automatically when files change. Delete the file to force a full refresh.\u003c/p\u003e\n",
      "content_text": "\n\nUse `list` for scriptable output and `tui` for interactive browsing.\n\n## List Posts\n\n```bash\n# Default table output\nmarkata-go list posts\n\n# Path-only output for piping\nmarkata-go list posts --format path\n\n# Filter posts with an expression\nmarkata-go list posts --filter \"published == true and 'go' in tags\"\n\n# Sort by title, ascending\nmarkata-go list posts --sort title --order asc\n\n# List posts for a feed\nmarkata-go list posts --feed blog\n```\n\n## List Tags\n\n```bash\n# Table output\nmarkata-go list tags\n\n# JSON output for scripts\nmarkata-go list tags --format json\n```\n\n## List Feeds\n\n```bash\n# Table output\nmarkata-go list feeds\n\n# CSV output for spreadsheets\nmarkata-go list feeds --format csv\n\n# List posts for a feed\nmarkata-go list feeds posts blog\n\n# List post paths for a feed\nmarkata-go list feeds posts blog --format path\n```\n\n## Path-Only Output\n\nThe `path` format prints one value per line for easy piping:\n\n```bash\n# Open each post in your editor\nmarkata-go list posts --format path | xargs -n 1 $EDITOR\n\n# Create a tag list file\nmarkata-go list tags --format path \u003e tags.txt\n```\n\nWhen `--site-dir` or `MARKATA_GO_SITE_DIR` selects a site, post paths are\nabsolute. This lets agents and scripts edit results from any directory:\n\n```bash\nmarkata-go --site-dir ~/sites/blog search \"configuration\" --format path\n# Edit the returned Markdown path directly.\n```\n\n## Interactive Browsing\n\nFor a full-screen view with filtering and sorting:\n\n```bash\nmarkata-go tui\n```\n\n## Cache\n\n`list` and `tui` use a persistent cache at `.markata/cache/list.json`. It updates automatically when files change. Delete the file to force a full refresh.\n",
      "summary": "Explore posts, tags, and feeds from the CLI",
      "date_published": "2026-02-16T00:00:00Z",
      "date_modified": "2026-02-16T00:00:00Z",
      "tags": [
        "documentation",
        "guides",
        "cli"
      ]
    },
    {
      "id": "https://markata.dev/docs/plans/2026-02-15-image-optimization-design/",
      "url": "https://markata.dev/docs/plans/2026-02-15-image-optimization-design/",
      "title": "Image Optimization Plugin Design",
      "content_html": "\u003ch2 id=\"goal\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGoal\u003c/span\u003e \u003ca href=\"#goal\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd an optional \u003ccode\u003eimage_optimization\u003c/code\u003e plugin that generates AVIF/WebP variants for local images at build time and rewrites HTML to use \u003ccode\u003e\u0026lt;picture\u0026gt;\u003c/code\u003e with a stable \u003ccode\u003e\u0026lt;img\u0026gt;\u003c/code\u003e fallback. External images are unchanged.\u003c/p\u003e\n\u003ch2 id=\"constraints\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConstraints\u003c/span\u003e \u003ca href=\"#constraints\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUse external CLI encoders (\u003ccode\u003eavifenc\u003c/code\u003e, \u003ccode\u003ecwebp\u003c/code\u003e) when available.\u003c/li\u003e\n\u003cli\u003eDo not fail the build if an encoder is missing; warn and skip the format.\u003c/li\u003e\n\u003cli\u003eDo not add responsive sizes in this issue.\u003c/li\u003e\n\u003cli\u003eWrite optimized variants next to the original output image.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"user-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUser Configuration\u003c/span\u003e \u003ca href=\"#user-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehooks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;image_optimization\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eimage_optimization\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avif\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;webp\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003equality\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eavif_quality\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewebp_quality\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.markata/image-cache\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eavifenc_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecwebp_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBehavior\u003c/span\u003e \u003ca href=\"#behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eRender stage scans \u003ccode\u003epost.ArticleHTML\u003c/code\u003e for \u003ccode\u003e\u0026lt;img\u0026gt;\u003c/code\u003e tags.\u003c/li\u003e\n\u003cli\u003eFor local \u003ccode\u003esrc\u003c/code\u003e values, rewrite each to a \u003ccode\u003e\u0026lt;picture\u0026gt;\u003c/code\u003e wrapper:\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e\u0026lt;source type=\u0026quot;image/avif\u0026quot; srcset=\u0026quot;...\u0026quot;\u0026gt;\u003c/code\u003e when AVIF is enabled\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e\u0026lt;source type=\u0026quot;image/webp\u0026quot; srcset=\u0026quot;...\u0026quot;\u0026gt;\u003c/code\u003e when WebP is enabled\u003c/li\u003e\n\u003cli\u003eKeep the original \u003ccode\u003e\u0026lt;img\u0026gt;\u003c/code\u003e as the fallback\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eExternal URLs, protocol-relative URLs, and data URIs are skipped.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"outputs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOutputs\u003c/span\u003e \u003ca href=\"#outputs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eimage.jpg\u003c/code\u003e -\u0026gt; \u003ccode\u003eimage.avif\u003c/code\u003e and \u003ccode\u003eimage.webp\u003c/code\u003e in the same output folder.\u003c/li\u003e\n\u003cli\u003eOriginal image remains unchanged and serves as the fallback.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"cache-strategy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCache Strategy\u003c/span\u003e \u003ca href=\"#cache-strategy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCache metadata in \u003ccode\u003e.markata/image-cache/\u003c/code\u003e keyed by:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSource path\u003c/li\u003e\n\u003cli\u003eFile size + mod time\u003c/li\u003e\n\u003cli\u003eEncoder + quality settings\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIf the key matches, skip re-encoding.\u003c/p\u003e\n\u003ch2 id=\"error-handling\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eError Handling\u003c/span\u003e \u003ca href=\"#error-handling\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eMissing encoder: warn once per build; skip that format.\u003c/li\u003e\n\u003cli\u003eEncode failure: warn for that file; keep original \u003ccode\u003e\u0026lt;img\u0026gt;\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eMissing source file: warn and skip.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"tests\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTests\u003c/span\u003e \u003ca href=\"#tests\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eHTML rewrite: local images get \u003ccode\u003e\u0026lt;picture\u0026gt;\u003c/code\u003e, external images stay unchanged.\u003c/li\u003e\n\u003cli\u003eCache hit skips encode; cache miss re-encodes.\u003c/li\u003e\n\u003cli\u003eMissing encoder does not fail build.\u003c/li\u003e\n\u003cli\u003eFailed encode does not corrupt output HTML.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"docs-and-spec\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocs and Spec\u003c/span\u003e \u003ca href=\"#docs-and-spec\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eimage_optimization\u003c/code\u003e to \u003ccode\u003espec/spec/OPTIONAL_PLUGINS.md\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eDocument config and usage in \u003ccode\u003edocs/guides/configuration.md\u003c/code\u003e and \u003ccode\u003edocs/reference/plugins.md\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eAdd a new user guide in \u003ccode\u003edocs/guides/image-optimization.md\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"ci-builder-image\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCI/Builder Image\u003c/span\u003e \u003ca href=\"#ci-builder-image\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eavifenc\u003c/code\u003e and \u003ccode\u003ecwebp\u003c/code\u003e to the builder image in PR #781.\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\n## Goal\n\nAdd an optional `image_optimization` plugin that generates AVIF/WebP variants for local images at build time and rewrites HTML to use `\u003cpicture\u003e` with a stable `\u003cimg\u003e` fallback. External images are unchanged.\n\n## Constraints\n\n- Use external CLI encoders (`avifenc`, `cwebp`) when available.\n- Do not fail the build if an encoder is missing; warn and skip the format.\n- Do not add responsive sizes in this issue.\n- Write optimized variants next to the original output image.\n\n## User Configuration\n\n```toml\n[markata-go]\nhooks = [\"default\", \"image_optimization\"]\n\n[markata-go.image_optimization]\nenabled = true\nformats = [\"avif\", \"webp\"]\nquality = 80\navif_quality = 80\nwebp_quality = 80\ncache_dir = \".markata/image-cache\"\navifenc_path = \"\"\ncwebp_path = \"\"\n```\n\n## Behavior\n\n1. Render stage scans `post.ArticleHTML` for `\u003cimg\u003e` tags.\n2. For local `src` values, rewrite each to a `\u003cpicture\u003e` wrapper:\n   - `\u003csource type=\"image/avif\" srcset=\"...\"\u003e` when AVIF is enabled\n   - `\u003csource type=\"image/webp\" srcset=\"...\"\u003e` when WebP is enabled\n   - Keep the original `\u003cimg\u003e` as the fallback\n3. External URLs, protocol-relative URLs, and data URIs are skipped.\n\n## Outputs\n\n- `image.jpg` -\u003e `image.avif` and `image.webp` in the same output folder.\n- Original image remains unchanged and serves as the fallback.\n\n## Cache Strategy\n\nCache metadata in `.markata/image-cache/` keyed by:\n\n- Source path\n- File size + mod time\n- Encoder + quality settings\n\nIf the key matches, skip re-encoding.\n\n## Error Handling\n\n- Missing encoder: warn once per build; skip that format.\n- Encode failure: warn for that file; keep original `\u003cimg\u003e`.\n- Missing source file: warn and skip.\n\n## Tests\n\n- HTML rewrite: local images get `\u003cpicture\u003e`, external images stay unchanged.\n- Cache hit skips encode; cache miss re-encodes.\n- Missing encoder does not fail build.\n- Failed encode does not corrupt output HTML.\n\n## Docs and Spec\n\n- Add `image_optimization` to `spec/spec/OPTIONAL_PLUGINS.md`.\n- Document config and usage in `docs/guides/configuration.md` and `docs/reference/plugins.md`.\n- Add a new user guide in `docs/guides/image-optimization.md`.\n\n## CI/Builder Image\n\n- Add `avifenc` and `cwebp` to the builder image in PR #781.\n",
      "summary": "Add an optional imageoptimization plugin that generates AVIF/WebP variants for local images at build time and rewrites HTML to use with a stable...",
      "date_published": "2026-02-15T00:00:00Z",
      "date_modified": "2026-02-15T00:00:00Z",
      "tags": [
        "documentation"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/image-optimization/",
      "url": "https://markata.dev/docs/guides/image-optimization/",
      "title": "Image Optimization",
      "content_html": "\u003cp\u003eThe \u003ccode\u003eimage_optimization\u003c/code\u003e plugin generates AVIF and WebP variants for local images and rewrites HTML to use a \u003ccode\u003e\u0026lt;picture\u0026gt;\u003c/code\u003e element with the original image as the fallback.\u003c/p\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEnable the plugin in your hooks:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehooks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;image_optimization\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eimage_optimization\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"requirements\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRequirements\u003c/span\u003e \u003ca href=\"#requirements\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eavifenc\u003c/code\u003e for AVIF output\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecwebp\u003c/code\u003e for WebP output\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIf a tool is missing, the build continues and that format is skipped.\u003c/p\u003e\n\u003ch2 id=\"example-output\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample Output\u003c/span\u003e \u003ca href=\"#example-output\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eInput HTML:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/cat.jpg\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Cat\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOutput HTML:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003epicture\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esource\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;image/avif\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003esrcset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/cat-480w.avif 480w, /images/cat-960w.avif 960w\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003esizes\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;100vw\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esource\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;image/webp\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003esrcset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/cat-480w.webp 480w, /images/cat-960w.webp 960w\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003esizes\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;100vw\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/cat.jpg\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Cat\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003epicture\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe generated \u003ccode\u003e.avif\u003c/code\u003e and \u003ccode\u003e.webp\u003c/code\u003e files are written next to the original image in the output folder.\u003c/p\u003e\n\u003cp\u003eThe optimizer reuses the image cache in \u003ccode\u003e.markata/image-cache\u003c/code\u003e and skips re-encoding unchanged inputs across rebuilds.\nEach build logs a summary of targets, missing sources, variants checked, cache hits and misses,\nand encoder calls and failures. This makes cache reuse distinguishable from actual image work.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eimage_optimization\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avif\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;webp\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003equality\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eavif_quality\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewebp_quality\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewidths\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e480\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e960\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esizes\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;100vw\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.markata/image-cache\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eavifenc_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecwebp_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"notes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNotes\u003c/span\u003e \u003ca href=\"#notes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eOnly local images are processed (relative paths and site-root paths).\u003c/li\u003e\n\u003cli\u003eExternal URLs, protocol-relative URLs, and data URIs are skipped.\u003c/li\u003e\n\u003cli\u003eImages already inside \u003ccode\u003e\u0026lt;picture\u0026gt;\u003c/code\u003e are left unchanged.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFor full details, see the \u003ca href=\"/docs/reference/plugins/#image_optimization\"\u003eplugin reference\u003c/a\u003e.\u003c/p\u003e\n",
      "content_text": "\n\nThe `image_optimization` plugin generates AVIF and WebP variants for local images and rewrites HTML to use a `\u003cpicture\u003e` element with the original image as the fallback.\n\n## Quick Start\n\nEnable the plugin in your hooks:\n\n```toml\n[markata-go]\nhooks = [\"default\", \"image_optimization\"]\n\n[markata-go.image_optimization]\nenabled = true\n```\n\n## Requirements\n\n- `avifenc` for AVIF output\n- `cwebp` for WebP output\n\nIf a tool is missing, the build continues and that format is skipped.\n\n## Example Output\n\nInput HTML:\n\n```html\n\u003cimg src=\"/images/cat.jpg\" alt=\"Cat\"\u003e\n```\n\nOutput HTML:\n\n```html\n\u003cpicture\u003e\n  \u003csource type=\"image/avif\" srcset=\"/images/cat-480w.avif 480w, /images/cat-960w.avif 960w\" sizes=\"100vw\"\u003e\n  \u003csource type=\"image/webp\" srcset=\"/images/cat-480w.webp 480w, /images/cat-960w.webp 960w\" sizes=\"100vw\"\u003e\n  \u003cimg src=\"/images/cat.jpg\" alt=\"Cat\"\u003e\n\u003c/picture\u003e\n```\n\nThe generated `.avif` and `.webp` files are written next to the original image in the output folder.\n\nThe optimizer reuses the image cache in `.markata/image-cache` and skips re-encoding unchanged inputs across rebuilds.\nEach build logs a summary of targets, missing sources, variants checked, cache hits and misses,\nand encoder calls and failures. This makes cache reuse distinguishable from actual image work.\n\n## Configuration\n\n```toml\n[markata-go.image_optimization]\nenabled = true\nformats = [\"avif\", \"webp\"]\nquality = 80\navif_quality = 80\nwebp_quality = 80\nwidths = [480, 960]\nsizes = \"100vw\"\ncache_dir = \".markata/image-cache\"\navifenc_path = \"\"\ncwebp_path = \"\"\n```\n\n### Notes\n\n- Only local images are processed (relative paths and site-root paths).\n- External URLs, protocol-relative URLs, and data URIs are skipped.\n- Images already inside `\u003cpicture\u003e` are left unchanged.\n\nFor full details, see the [plugin reference](/docs/reference/plugins/#image_optimization).\n",
      "summary": "Generate AVIF and WebP variants for local images",
      "date_published": "2026-02-15T00:00:00Z",
      "date_modified": "2026-02-15T00:00:00Z",
      "tags": [
        "documentation",
        "images",
        "performance"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/authors/",
      "url": "https://markata.dev/docs/guides/authors/",
      "title": "Multi-Author Support",
      "content_html": "\u003cp\u003eMarkata-go supports multiple authors with rich metadata including roles, bios, avatars, and social links. This guide covers how to configure authors and reference them in your posts.\u003c/p\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"1-configure-authors\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e1. Configure Authors\u003c/span\u003e \u003ca href=\"#1-configure-authors\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd authors to your \u003ccode\u003emarkata-go.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewaylon\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Waylon Walker\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erole\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;author\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://waylonwalker.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eavatar\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/images/waylon.jpg\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebio\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Python and Go developer\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eactive\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eguest\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Guest Writer\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erole\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;editor\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebio\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Occasional contributor\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eguest\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eactive\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"2-reference-authors-in-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e2. Reference Authors in Posts\u003c/span\u003e \u003ca href=\"#2-reference-authors-in-posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eMy Post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ewaylon\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003eguest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"author-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuthor Configuration\u003c/span\u003e \u003ca href=\"#author-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"author-fields\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuthor Fields\u003c/span\u003e \u003ca href=\"#author-fields\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003eRequired\u003c/strong\u003e - Display name\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erole\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSimple role label (author, editor, etc.)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebio\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eShort biography\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eavatar\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eAvatar image URL or path\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eurl\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003ePersonal website URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eemail\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eContact email\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esocial\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003emap\u003c/td\u003e\n\u003ctd\u003eSocial media links\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edefault\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eDefault author for posts without explicit authors\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eguest\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eGuest author flag\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eactive\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eWhether author is currently active\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"default-author\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDefault Author\u003c/span\u003e \u003ca href=\"#default-author\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSet \u003ccode\u003edefault = true\u003c/code\u003e on one author. Posts without an explicit \u003ccode\u003eauthors\u003c/code\u003e frontmatter field will automatically use this author:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewaylon\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Waylon Walker\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"author-pages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuthor Pages\u003c/span\u003e \u003ca href=\"#author-pages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGenerate individual author profile pages:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egenerate_pages\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl_pattern\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/authors/{id}/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"frontmatter\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFrontmatter\u003c/span\u003e \u003ca href=\"#frontmatter\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"simple-format\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSimple Format\u003c/span\u003e \u003ca href=\"#simple-format\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eReference authors by ID:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eMy Post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ewaylon\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003eguest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"extended-format\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExtended Format\u003c/span\u003e \u003ca href=\"#extended-format\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSpecify per-post roles and details:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCollaborative Post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewaylon\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erole\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eauthor\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edetails\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrote the introduction\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecodex\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erole\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epair programmer\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edetails\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrote the code examples\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"key-aliases\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKey Aliases\u003c/span\u003e \u003ca href=\"#key-aliases\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse convenient aliases for common keys:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewaylon    \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# same as id: waylon\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eauthor   \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# same as role: author\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrote it \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# same as details: ...\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"legacy-format\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLegacy Format\u003c/span\u003e \u003ca href=\"#legacy-format\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe older single-author format still works:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eMy Post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewaylon\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"template-access\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Access\u003c/span\u003e \u003ca href=\"#template-access\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIn templates, access author data:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for author in post.author_objects %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ author.name }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% if author.role %}({{ author.role }}){% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAvailable author properties:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eid\u003c/code\u003e, \u003ccode\u003ename\u003c/code\u003e, \u003ccode\u003ebio\u003c/code\u003e, \u003ccode\u003eemail\u003c/code\u003e, \u003ccode\u003eavatar\u003c/code\u003e, \u003ccode\u003eurl\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erole\u003c/code\u003e - Simple role label\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erole_display\u003c/code\u003e - Pre-computed display string\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eguest\u003c/code\u003e, \u003ccode\u003eactive\u003c/code\u003e, \u003ccode\u003edefault\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esocial\u003c/code\u003e - Map of platform -\u0026gt; URL\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econtributions\u003c/code\u003e - CReDiT taxonomy roles\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edetails\u003c/code\u003e - Per-post contribution details\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"role-system\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRole System\u003c/span\u003e \u003ca href=\"#role-system\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"simple-roles\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSimple Roles\u003c/span\u003e \u003ca href=\"#simple-roles\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse the \u003ccode\u003erole\u003c/code\u003e field for blog-friendly roles:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewaylon\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Waylon Walker\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erole\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;author\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCommon roles: \u003ccode\u003eauthor\u003c/code\u003e, \u003ccode\u003eeditor\u003c/code\u003e, \u003ccode\u003ereviewer\u003c/code\u003e, \u003ccode\u003ephotographer\u003c/code\u003e, \u003ccode\u003eillustrator\u003c/code\u003e, \u003ccode\u003etranslator\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"credit-roles\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCReDiT Roles\u003c/span\u003e \u003ca href=\"#credit-roles\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor academic-style contribution tracking, use \u003ccode\u003econtributions\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewaylon\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Waylon Walker\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtributions\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Conceptualization\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Software\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Writing\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"multiple-authors-with-different-roles\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMultiple Authors with Different Roles\u003c/span\u003e \u003ca href=\"#multiple-authors-with-different-roles\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuilding a CLI Tool\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewaylon\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erole\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eauthor\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edetails\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrote the core implementation\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ekimmi\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erole\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ereviewer\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edetails\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ereviewed and tested\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"mixed-author-types\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMixed Author Types\u003c/span\u003e \u003ca href=\"#mixed-author-types\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eGuest Post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ewaylon \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# uses default role from config\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eguest-writer\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erole\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eguest author\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edetails\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrote this guest post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"editorial-credits-and-revision-history\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEditorial credits and revision history\u003c/span\u003e \u003ca href=\"#editorial-credits-and-revision-history\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe default byline keeps writers prominent and groups editing/reviewing roles\nbelow them. The first editor is displayed by name; additional editors are\nstacked behind a disclosure with all contributor names and roles.\u003c/p\u003e\n\u003cp\u003eUse \u003ca href=\"../editorial-history/\"\u003eEditorial history\u003c/a\u003e to show recorded reviews,\nGitHub file diffs, and lazily loaded inline source changes. Humans and agents\ncan use the \u003ca href=\"../editorial-authoring/\"\u003eeditorial authoring commands\u003c/a\u003e to commit\nselected edits and record their attribution automatically.\u003c/p\u003e\n",
      "content_text": "\nMarkata-go supports multiple authors with rich metadata including roles, bios, avatars, and social links. This guide covers how to configure authors and reference them in your posts.\n\n## Quick Start\n\n### 1. Configure Authors\n\nAdd authors to your `markata-go.toml`:\n\n```toml\n[markata-go.authors]\n\n[markata-go.authors.authors.waylon]\nname = \"Waylon Walker\"\nrole = \"author\"\nurl = \"https://waylonwalker.com\"\navatar = \"/images/waylon.jpg\"\nbio = \"Python and Go developer\"\nactive = true\ndefault = true\n\n[markata-go.authors.authors.guest]\nname = \"Guest Writer\"\nrole = \"editor\"\nbio = \"Occasional contributor\"\nguest = true\nactive = true\n```\n\n### 2. Reference Authors in Posts\n\n```yaml\n---\ntitle: My Post\nauthors:\n  - waylon\n  - guest\n---\n```\n\n## Author Configuration\n\n### Author Fields\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `name` | string | **Required** - Display name |\n| `role` | string | Simple role label (author, editor, etc.) |\n| `bio` | string | Short biography |\n| `avatar` | string | Avatar image URL or path |\n| `url` | string | Personal website URL |\n| `email` | string | Contact email |\n| `social` | map | Social media links |\n| `default` | bool | Default author for posts without explicit authors |\n| `guest` | bool | Guest author flag |\n| `active` | bool | Whether author is currently active |\n\n### Default Author\n\nSet `default = true` on one author. Posts without an explicit `authors` frontmatter field will automatically use this author:\n\n```toml\n[markata-go.authors.authors.waylon]\nname = \"Waylon Walker\"\ndefault = true\n```\n\n### Author Pages\n\nGenerate individual author profile pages:\n\n```toml\n[markata-go.authors]\ngenerate_pages = true\nurl_pattern = \"/authors/{id}/\"\n```\n\n## Frontmatter\n\n### Simple Format\n\nReference authors by ID:\n\n```yaml\n---\ntitle: My Post\nauthors:\n  - waylon\n  - guest\n---\n```\n\n### Extended Format\n\nSpecify per-post roles and details:\n\n```yaml\n---\ntitle: Collaborative Post\nauthors:\n  - id: waylon\n    role: author\n    details: wrote the introduction\n  - id: codex\n    role: pair programmer\n    details: wrote the code examples\n---\n```\n\n### Key Aliases\n\nUse convenient aliases for common keys:\n\n```yaml\n---\nauthors:\n  - name: waylon     # same as id: waylon\n    title: author    # same as role: author\n    description: wrote it  # same as details: ...\n---\n```\n\n### Legacy Format\n\nThe older single-author format still works:\n\n```yaml\n---\ntitle: My Post\nauthor: waylon\n---\n```\n\n## Template Access\n\nIn templates, access author data:\n\n```html\n{% for author in post.author_objects %}\n  \u003cspan\u003e{{ author.name }}\u003c/span\u003e\n  {% if author.role %}({{ author.role }}){% endif %}\n{% endfor %}\n```\n\nAvailable author properties:\n- `id`, `name`, `bio`, `email`, `avatar`, `url`\n- `role` - Simple role label\n- `role_display` - Pre-computed display string\n- `guest`, `active`, `default`\n- `social` - Map of platform -\u003e URL\n- `contributions` - CReDiT taxonomy roles\n- `details` - Per-post contribution details\n\n## Role System\n\n### Simple Roles\n\nUse the `role` field for blog-friendly roles:\n\n```toml\n[markata-go.authors.authors.waylon]\nname = \"Waylon Walker\"\nrole = \"author\"\n```\n\nCommon roles: `author`, `editor`, `reviewer`, `photographer`, `illustrator`, `translator`\n\n### CReDiT Roles\n\nFor academic-style contribution tracking, use `contributions`:\n\n```toml\n[markata-go.authors.authors.waylon]\nname = \"Waylon Walker\"\ncontributions = [\"Conceptualization\", \"Software\", \"Writing\"]\n```\n\n## Examples\n\n### Multiple Authors with Different Roles\n\n```yaml\n---\ntitle: Building a CLI Tool\nauthors:\n  - id: waylon\n    role: author\n    details: wrote the core implementation\n  - id: kimmi\n    role: reviewer\n    details: reviewed and tested\n---\n```\n\n### Mixed Author Types\n\n```yaml\n---\ntitle: Guest Post\nauthors:\n  - waylon  # uses default role from config\n  - id: guest-writer\n    role: guest author\n    details: wrote this guest post\n---\n```\n\n## Editorial credits and revision history\n\nThe default byline keeps writers prominent and groups editing/reviewing roles\nbelow them. The first editor is displayed by name; additional editors are\nstacked behind a disclosure with all contributor names and roles.\n\nUse [Editorial history](../editorial-history/) to show recorded reviews,\nGitHub file diffs, and lazily loaded inline source changes. Humans and agents\ncan use the [editorial authoring commands](../editorial-authoring/) to commit\nselected edits and record their attribution automatically.\n",
      "summary": "Configure multiple authors with roles, bios, and avatars for your blog",
      "date_published": "2026-02-12T00:00:00Z",
      "date_modified": "2026-02-12T00:00:00Z",
      "tags": [
        "authors",
        "configuration",
        "frontmatter"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/link-avatars/",
      "url": "https://markata.dev/docs/guides/link-avatars/",
      "title": "Link Avatars",
      "content_html": "\u003cp\u003eThe \u003ccode\u003elink_avatars\u003c/code\u003e plugin automatically adds small favicon icons next to external links in your content. This helps readers quickly identify link destinations before clicking.\u003c/p\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEnable link avatars with minimal configuration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elink_avatars\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis will add a 16x16 pixel favicon icon before each external link using DuckDuckGo\u0026rsquo;s icon service.\u003c/p\u003e\n\u003ch2 id=\"how-it-works\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow It Works\u003c/span\u003e \u003ca href=\"#how-it-works\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe plugin supports three modes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ejs\u003c/strong\u003e (default): client-side enhancement with runtime favicon fetch\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003elocal\u003c/strong\u003e: build-time caching, HTML points to site-relative icon URLs\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ehosted\u003c/strong\u003e: build-time caching, HTML points to a hosted base URL (CDN)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIn all modes, the plugin applies the same ignore rules and uses the same CSS for sizing and positioning.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"basic-options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Options\u003c/span\u003e \u003ca href=\"#basic-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elink_avatars\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# CSS selector for links to enhance (default: \u0026#34;a[href^=\u0026#39;http\u0026#39;]\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eselector\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;a[href^=\u0026#39;http\u0026#39;]\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Avatar size in pixels (default: 16)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esize\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Position: \u0026#34;before\u0026#34; or \u0026#34;after\u0026#34; the link text (default: \u0026#34;before\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;before\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Mode: \u0026#34;js\u0026#34;, \u0026#34;local\u0026#34;, or \u0026#34;hosted\u0026#34; (default: \u0026#34;js\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;js\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Hosted base URL for mode = \u0026#34;hosted\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# hosted_base_url = \u0026#34;https://cdn.example.com/markata/link-avatars\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"service-selection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eService Selection\u003c/span\u003e \u003ca href=\"#service-selection\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eChoose your favicon service provider:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elink_avatars\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Options: \u0026#34;duckduckgo\u0026#34;, \u0026#34;google\u0026#34;, \u0026#34;custom\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eservice\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;duckduckgo\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eService\u003c/th\u003e\n\u003cth\u003eURL Template\u003c/th\u003e\n\u003cth\u003eNotes\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003educkduckgo\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eicons.duckduckgo.com/ip3/{host}.ico\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault, privacy-focused\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egoogle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003egoogle.com/s2/favicons?domain={host}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReliable, supports size param\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecustom\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUser-provided template\u003c/td\u003e\n\u003ctd\u003eFor self-hosted services\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"custom-template\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Template\u003c/span\u003e \u003ca href=\"#custom-template\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse a custom favicon service:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elink_avatars\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eservice\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;custom\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://favicon.splitbee.io/?url={origin}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTemplate placeholders:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e{host}\u003c/code\u003e - Domain name (e.g., \u003ccode\u003egithub.com\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e{origin}\u003c/code\u003e - Full origin URL-encoded (e.g., \u003ccode\u003ehttps%3A%2F%2Fgithub.com\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ignore-rules\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIgnore Rules\u003c/span\u003e \u003ca href=\"#ignore-rules\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eExclude specific links from getting avatars. Links that wrap images are always skipped.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elink_avatars\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Skip links to these domains\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eignore_domains\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;localhost\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;127.0.0.1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Skip links to these exact origins\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eignore_origins\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://internal.example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Skip links matching these CSS selectors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eignore_selectors\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;nav a\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.footer a\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;a.plain-link\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Skip links with these classes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eignore_classes\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;no-avatar\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;internal\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Skip links inside elements with these IDs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eignore_ids\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;site-nav\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;footer\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"full-configuration-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFull Configuration Example\u003c/span\u003e \u003ca href=\"#full-configuration-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elink_avatars\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eselector\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;article a[href^=\u0026#39;http\u0026#39;]\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Only article links\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eservice\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;google\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esize\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e14\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;after\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eignore_domains\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;localhost\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;127.0.0.1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eignore_classes\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;no-avatar\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eignore_selectors\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;nav a\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.sidebar a\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"css-customization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCSS Customization\u003c/span\u003e \u003ca href=\"#css-customization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe plugin adds these classes to enhanced links:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e.has-avatar\u003c/code\u003e - Applied to all links with avatars\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.has-avatar-before\u003c/code\u003e - Avatar appears before text\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.has-avatar-after\u003c/code\u003e - Avatar appears after text\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"override-default-styles\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOverride Default Styles\u003c/span\u003e \u003ca href=\"#override-default-styles\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Change avatar appearance */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehas-avatar\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003ebefore\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehas-avatar\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eafter\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eopacity\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.7\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eborder-radius\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003emargin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.4\u003c/span\u003e\u003cspan class=\"kt\"\u003eem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Add hover effect */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehas-avatar\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003ehover\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003ebefore\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehas-avatar\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003ehover\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eafter\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eopacity\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003etransform\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003escale\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mf\"\u003e1.1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Hide avatars in specific contexts */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eprose\u003c/span\u003e \u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehas-avatar\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003ebefore\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eprose\u003c/span\u003e \u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehas-avatar\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eafter\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enone\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"dark-mode-considerations\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDark Mode Considerations\u003c/span\u003e \u003ca href=\"#dark-mode-considerations\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe CSS handles both light and dark modes automatically. For custom styling:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Dark mode avatar styling */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003emedia\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003eprefers-color-scheme\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nt\"\u003edark\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehas-avatar\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003ebefore\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehas-avatar\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eafter\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efilter\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003ebrightness\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mf\"\u003e1.2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"opt-out-per-link\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOpt-Out Per Link\u003c/span\u003e \u003ca href=\"#opt-out-per-link\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd the \u003ccode\u003eno-avatar\u003c/code\u003e class (or your configured ignore class) to skip specific links:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003eRegular link\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://github.com\u003c/span\u003e) gets an avatar.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003eNo avatar link\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://github.com\u003c/span\u003e){.no-avatar} is excluded.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr use inline HTML:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;no-avatar\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ePlain link\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"performance\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePerformance\u003c/span\u003e \u003ca href=\"#performance\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe plugin is designed for minimal performance impact:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ejs mode\u003c/strong\u003e: client-side, lazy favicon loading via Intersection Observer\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003elocal/hosted modes\u003c/strong\u003e: build-time caching, no runtime JS or external requests\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDeterministic builds\u003c/strong\u003e - Generated assets are stable between builds\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"generated-files\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGenerated Files\u003c/span\u003e \u003ca href=\"#generated-files\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen enabled, the plugin creates:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eoutput/\n├── css/\n│   └── link-avatars.css  # Styling\n├── js/\n│   └── link-avatars.js   # Client-side JavaScript (js mode only)\n└── assets/\n    └── markata/\n        └── link-avatars/     # Cached icons (local/hosted modes)\n            └── example.com.ico\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThese are automatically included in your page\u0026rsquo;s \u003ccode\u003e\u0026lt;head\u0026gt;\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"favicons-not-showing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFavicons Not Showing\u003c/span\u003e \u003ca href=\"#favicons-not-showing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eCheck browser console\u003c/strong\u003e for errors\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVerify links match selector\u003c/strong\u003e - Default is \u003ccode\u003ea[href^='http']\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCheck ignore rules\u003c/strong\u003e - Link might match an ignore pattern\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTest favicon service\u003c/strong\u003e - Try the URL directly in browser\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"favicon-service-blocked\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFavicon Service Blocked\u003c/span\u003e \u003ca href=\"#favicon-service-blocked\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSome ad blockers may block favicon services. Consider:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUsing a self-hosted favicon service\u003c/li\u003e\n\u003cli\u003eAdding exceptions for trusted services\u003c/li\u003e\n\u003cli\u003eProviding fallback styling\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"layout-shift\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLayout Shift\u003c/span\u003e \u003ca href=\"#layout-shift\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf avatars cause layout shift:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Reserve space for avatar */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehas-avatar\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003epadding-left\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e1.5\u003c/span\u003e\u003cspan class=\"kt\"\u003eem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eposition\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003erelative\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehas-avatar\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003ebefore\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eposition\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eabsolute\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfiguration Reference\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/plugin-development/\"\u003ePlugin Development\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/themes/\"\u003eThemes and Styling\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"build-time-modes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild-Time Modes\u003c/span\u003e \u003ca href=\"#build-time-modes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse build-time caching to avoid runtime JavaScript and third-party fetches:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elink_avatars\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;local\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eHosted mode uploads the cached icons to your CDN and points HTML to that base URL:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elink_avatars\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;hosted\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehosted_base_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://cdn.example.com/markata/link-avatars\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n\nThe `link_avatars` plugin automatically adds small favicon icons next to external links in your content. This helps readers quickly identify link destinations before clicking.\n\n## Quick Start\n\nEnable link avatars with minimal configuration:\n\n```toml\n[markata-go.link_avatars]\nenabled = true\n```\n\nThis will add a 16x16 pixel favicon icon before each external link using DuckDuckGo's icon service.\n\n## How It Works\n\nThe plugin supports three modes:\n\n- **js** (default): client-side enhancement with runtime favicon fetch\n- **local**: build-time caching, HTML points to site-relative icon URLs\n- **hosted**: build-time caching, HTML points to a hosted base URL (CDN)\n\nIn all modes, the plugin applies the same ignore rules and uses the same CSS for sizing and positioning.\n\n## Configuration\n\n### Basic Options\n\n```toml\n[markata-go.link_avatars]\nenabled = true\n\n# CSS selector for links to enhance (default: \"a[href^='http']\")\nselector = \"a[href^='http']\"\n\n# Avatar size in pixels (default: 16)\nsize = 16\n\n# Position: \"before\" or \"after\" the link text (default: \"before\")\nposition = \"before\"\n\n# Mode: \"js\", \"local\", or \"hosted\" (default: \"js\")\nmode = \"js\"\n\n# Hosted base URL for mode = \"hosted\"\n# hosted_base_url = \"https://cdn.example.com/markata/link-avatars\"\n```\n\n### Service Selection\n\nChoose your favicon service provider:\n\n```toml\n[markata-go.link_avatars]\nenabled = true\n\n# Options: \"duckduckgo\", \"google\", \"custom\"\nservice = \"duckduckgo\"\n```\n\n| Service | URL Template | Notes |\n|---------|--------------|-------|\n| `duckduckgo` | `icons.duckduckgo.com/ip3/{host}.ico` | Default, privacy-focused |\n| `google` | `google.com/s2/favicons?domain={host}` | Reliable, supports size param |\n| `custom` | User-provided template | For self-hosted services |\n\n### Custom Template\n\nUse a custom favicon service:\n\n```toml\n[markata-go.link_avatars]\nenabled = true\nservice = \"custom\"\ntemplate = \"https://favicon.splitbee.io/?url={origin}\"\n```\n\nTemplate placeholders:\n- `{host}` - Domain name (e.g., `github.com`)\n- `{origin}` - Full origin URL-encoded (e.g., `https%3A%2F%2Fgithub.com`)\n\n### Ignore Rules\n\nExclude specific links from getting avatars. Links that wrap images are always skipped.\n\n```toml\n[markata-go.link_avatars]\nenabled = true\n\n# Skip links to these domains\nignore_domains = [\"localhost\", \"127.0.0.1\", \"example.com\"]\n\n# Skip links to these exact origins\nignore_origins = [\"https://internal.example.com\"]\n\n# Skip links matching these CSS selectors\nignore_selectors = [\"nav a\", \".footer a\", \"a.plain-link\"]\n\n# Skip links with these classes\nignore_classes = [\"no-avatar\", \"internal\"]\n\n# Skip links inside elements with these IDs\nignore_ids = [\"site-nav\", \"footer\"]\n```\n\n## Full Configuration Example\n\n```toml\n[markata-go.link_avatars]\nenabled = true\nselector = \"article a[href^='http']\"  # Only article links\nservice = \"google\"\nsize = 14\nposition = \"after\"\nignore_domains = [\"localhost\", \"127.0.0.1\"]\nignore_classes = [\"no-avatar\"]\nignore_selectors = [\"nav a\", \".sidebar a\"]\n```\n\n## CSS Customization\n\nThe plugin adds these classes to enhanced links:\n\n- `.has-avatar` - Applied to all links with avatars\n- `.has-avatar-before` - Avatar appears before text\n- `.has-avatar-after` - Avatar appears after text\n\n### Override Default Styles\n\n```css\n/* Change avatar appearance */\na.has-avatar::before,\na.has-avatar::after {\n  opacity: 0.7;\n  border-radius: 2px;\n  margin: 0 0.4em;\n}\n\n/* Add hover effect */\na.has-avatar:hover::before,\na.has-avatar:hover::after {\n  opacity: 1;\n  transform: scale(1.1);\n}\n\n/* Hide avatars in specific contexts */\n.prose a.has-avatar::before,\n.prose a.has-avatar::after {\n  display: none;\n}\n```\n\n### Dark Mode Considerations\n\nThe CSS handles both light and dark modes automatically. For custom styling:\n\n```css\n/* Dark mode avatar styling */\n@media (prefers-color-scheme: dark) {\n  a.has-avatar::before,\n  a.has-avatar::after {\n    filter: brightness(1.2);\n  }\n}\n```\n\n## Opt-Out Per Link\n\nAdd the `no-avatar` class (or your configured ignore class) to skip specific links:\n\n```markdown\n[Regular link](https://github.com) gets an avatar.\n\n[No avatar link](https://github.com){.no-avatar} is excluded.\n```\n\nOr use inline HTML:\n\n```html\n\u003ca href=\"https://example.com\" class=\"no-avatar\"\u003ePlain link\u003c/a\u003e\n```\n\n## Performance\n\nThe plugin is designed for minimal performance impact:\n\n- **js mode**: client-side, lazy favicon loading via Intersection Observer\n- **local/hosted modes**: build-time caching, no runtime JS or external requests\n- **Deterministic builds** - Generated assets are stable between builds\n\n## Generated Files\n\nWhen enabled, the plugin creates:\n\n```\noutput/\n├── css/\n│   └── link-avatars.css  # Styling\n├── js/\n│   └── link-avatars.js   # Client-side JavaScript (js mode only)\n└── assets/\n    └── markata/\n        └── link-avatars/     # Cached icons (local/hosted modes)\n            └── example.com.ico\n```\n\nThese are automatically included in your page's `\u003chead\u003e`.\n\n## Troubleshooting\n\n### Favicons Not Showing\n\n1. **Check browser console** for errors\n2. **Verify links match selector** - Default is `a[href^='http']`\n3. **Check ignore rules** - Link might match an ignore pattern\n4. **Test favicon service** - Try the URL directly in browser\n\n### Favicon Service Blocked\n\nSome ad blockers may block favicon services. Consider:\n- Using a self-hosted favicon service\n- Adding exceptions for trusted services\n- Providing fallback styling\n\n### Layout Shift\n\nIf avatars cause layout shift:\n\n```css\n/* Reserve space for avatar */\na.has-avatar {\n  padding-left: 1.5em;\n  position: relative;\n}\n\na.has-avatar::before {\n  position: absolute;\n  left: 0;\n}\n```\n\n## See Also\n\n- [Configuration Reference](/docs/guides/configuration/)\n- [Plugin Development](/docs/guides/plugin-development/)\n- [Themes and Styling](/docs/guides/themes/)\n### Build-Time Modes\n\nUse build-time caching to avoid runtime JavaScript and third-party fetches:\n\n```toml\n[markata-go.link_avatars]\nenabled = true\nmode = \"local\"\n```\n\nHosted mode uploads the cached icons to your CDN and points HTML to that base URL:\n\n```toml\n[markata-go.link_avatars]\nenabled = true\nmode = \"hosted\"\nhosted_base_url = \"https://cdn.example.com/markata/link-avatars\"\n```\n",
      "summary": "Add favicon icons next to external links for better visual identification",
      "date_published": "2026-02-09T00:00:00Z",
      "date_modified": "2026-02-09T00:00:00Z",
      "tags": [
        "plugins",
        "links",
        "customization"
      ]
    },
    {
      "id": "https://markata.dev/docs/reference/view-transitions-config/",
      "url": "https://markata.dev/docs/reference/view-transitions-config/",
      "title": "View Transitions Configuration",
      "content_html": "\u003cp\u003eComplete reference for configuring the View Transitions API behavior in markata-go.\u003c/p\u003e\n\u003ch2 id=\"overview\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOverview\u003c/span\u003e \u003ca href=\"#overview\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eView Transitions can be configured via your \u003ccode\u003emarkata.toml\u003c/code\u003e or YAML config file. All settings are optional - sensible defaults are provided.\u003c/p\u003e\n\u003ch2 id=\"configuration-options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration Options\u003c/span\u003e \u003ca href=\"#configuration-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd a \u003ccode\u003e[markata-go.view_transitions]\u003c/code\u003e section to your config:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Enable/disable view transitions globally\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edebug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e               \u003cspan class=\"c\"\u003e# Log debug messages to console\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eduration\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e120\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Default transition duration in ms\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eupdate_meta\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Update meta tags on navigation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escroll_to_top\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Scroll to top on navigation (unless hash present)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eskip_classes\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e           \u003cspan class=\"c\"\u003e# Additional CSS classes to skip\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eskip_selectors\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e         \u003cspan class=\"c\"\u003e# Additional selectors to skip\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIn TOML, nest this under \u003ccode\u003e[markata-go.view_transitions]\u003c/code\u003e because markata-go loads site config from the top-level \u003ccode\u003e[markata-go]\u003c/code\u003e table.\u003c/p\u003e\n\u003ch2 id=\"quick-examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Examples\u003c/span\u003e \u003ca href=\"#quick-examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"toml-markata-toml\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTOML (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003emarkata.toml\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#toml-markata-toml\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edebug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eduration\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e120\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eupdate_meta\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escroll_to_top\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eskip_classes\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;no-transition\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;external-link\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eskip_selectors\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;[data-skip-transition]\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.modal a\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"yaml-markata-yaml\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eYAML (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003emarkata.yaml\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#yaml-markata-yaml\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenabled\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edebug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eduration\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e120\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eupdate_meta\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003escroll_to_top\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eskip_classes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"kc\"\u003eno\u003c/span\u003e-\u003cspan class=\"l\"\u003etransition\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003eexternal-link\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eskip_selectors\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;[data-skip-transition]\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;.modal a\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"option-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOption Reference\u003c/span\u003e \u003ca href=\"#option-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"enabled\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003eenabled\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#enabled\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eType\u003c/strong\u003e: Boolean\u003cbr\u003e\n\u003cstrong\u003eDefault\u003c/strong\u003e: \u003ccode\u003etrue\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eEnable or disable view transitions globally.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Disable view transitions completely\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen disabled, all navigation uses standard browser behavior (no transitions).\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eUse case\u003c/strong\u003e: Temporarily disable for testing or performance debugging.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"debug\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003edebug\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#debug\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eType\u003c/strong\u003e: Boolean\u003cbr\u003e\n\u003cstrong\u003eDefault\u003c/strong\u003e: \u003ccode\u003efalse\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eEnable debug logging to browser console.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edebug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eConsole output when enabled:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eView Transitions API initialized\nStarting view transition to: /blog/my-post/\nPrefetching URL: /blog/next-post/\n\\[view-transitions\\] timing { fetchMs: 18.4, parseMs: 4.2, swapMs: 7.3, reinitMs: 5.1, totalMs: 42.6 }\nView transition completed\nSkipping link with class: no-transition\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eUseful for:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDebugging transition issues\u003c/li\u003e\n\u003cli\u003eSeeing which links are being intercepted\u003c/li\u003e\n\u003cli\u003eInspecting fetch/parse/swap/reinit timing in the browser console\u003c/li\u003e\n\u003cli\u003eUnderstanding why certain links are skipped\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"duration\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003eduration\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#duration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eType\u003c/strong\u003e: Integer (milliseconds)\u003cbr\u003e\n\u003cstrong\u003eDefault\u003c/strong\u003e: \u003ccode\u003e120\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eDefault transition duration in milliseconds. Used as a reference value.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eduration\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e220\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Slower transitions\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eNote\u003c/strong\u003e: The actual animation duration is controlled by CSS:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-old\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003emain-content\u003c/span\u003e\u003cspan class=\"o\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-new\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003emain-content\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eanimation-duration\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \u003cspan class=\"c\"\u003e/* Match config.duration / 1000 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"update_meta\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003eupdate_meta\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#update_meta\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eType\u003c/strong\u003e: Boolean\u003cbr\u003e\n\u003cstrong\u003eDefault\u003c/strong\u003e: \u003ccode\u003etrue\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eUpdate meta tags (description, Open Graph, Twitter cards, canonical links) when navigating.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eupdate_meta\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Skip meta tag updates\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eWhen \u003ccode\u003etrue\u003c/code\u003e\u003c/strong\u003e, updates:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e\u0026lt;meta name=\u0026quot;description\u0026quot;\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e\u0026lt;meta property=\u0026quot;og:*\u0026quot;\u0026gt;\u003c/code\u003e (Open Graph tags)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e\u0026lt;meta name=\u0026quot;twitter:*\u0026quot;\u0026gt;\u003c/code\u003e (Twitter Card tags)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e\u0026lt;link rel=\u0026quot;canonical\u0026quot;\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eWhen \u003ccode\u003efalse\u003c/code\u003e\u003c/strong\u003e, only updates:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePage title\u003c/li\u003e\n\u003cli\u003eBody content\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eUse case\u003c/strong\u003e: Set to \u003ccode\u003efalse\u003c/code\u003e for slightly better performance if you don\u0026rsquo;t rely on meta tags changing.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"scroll_to_top\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003escroll_to_top\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#scroll_to_top\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eType\u003c/strong\u003e: Boolean\u003cbr\u003e\n\u003cstrong\u003eDefault\u003c/strong\u003e: \u003ccode\u003etrue\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eAutomatically scroll to top of page after navigation (unless URL has a hash).\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escroll_to_top\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Keep scroll position\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWhen \u003ccode\u003etrue\u003c/code\u003e: Scrolls to top (\u003ccode\u003ewindow.scrollTo(0, 0)\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eIf URL has hash (\u003ccode\u003e#section\u003c/code\u003e): Smooth scrolls to that element (ignores this setting)\u003c/li\u003e\n\u003cli\u003eWhen \u003ccode\u003efalse\u003c/code\u003e: Maintains current scroll position\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eUse case\u003c/strong\u003e: Set to \u003ccode\u003efalse\u003c/code\u003e for documentation sites where users may want to maintain context.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"skip_classes\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003eskip_classes\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#skip_classes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eType\u003c/strong\u003e: Array of strings\u003cbr\u003e\n\u003cstrong\u003eDefault\u003c/strong\u003e: \u003ccode\u003e[]\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eAdditional CSS classes to skip (won\u0026rsquo;t trigger view transitions).\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eskip_classes\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;no-transition\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;instant-nav\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;legacy-link\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eUsage in HTML:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/page/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;no-transition\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eSkip transition\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/instant/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;instant-nav\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eInstant navigation\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBuilt-in skip classes\u003c/strong\u003e (always skipped):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e.toc-link\u003c/code\u003e - Table of Contents links (use smooth scroll instead)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"skip_selectors\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003eskip_selectors\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#skip_selectors\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eType\u003c/strong\u003e: Array of strings\u003cbr\u003e\n\u003cstrong\u003eDefault\u003c/strong\u003e: \u003ccode\u003e[]\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eAdditional CSS selectors to skip using \u003ccode\u003eelement.matches()\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eskip_selectors\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;[data-no-transition]\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;.modal a\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;#sidebar nav a\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;[rel~=\u0026#39;nofollow\u0026#39;]\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eUsage in HTML:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/page/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003edata-no-transition\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eNo transition\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;modal\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/help/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eWon\u0026#39;t transition (inside modal)\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;sidebar\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/nav/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eWon\u0026#39;t transition (in sidebar)\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBuilt-in skip selectors\u003c/strong\u003e (always skipped):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ea[target=\u0026quot;_blank\u0026quot;]\u003c/code\u003e - External links\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ea[download]\u003c/code\u003e - Download links\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ea[rel~=\u0026quot;external\u0026quot;]\u003c/code\u003e - External rel links\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ea[hx-get]\u003c/code\u003e, \u003ccode\u003ea[hx-post]\u003c/code\u003e - HTMX-managed links\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ea[data-no-transition]\u003c/code\u003e - Explicit opt-out\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eBuilt-in skip behavior\u003c/strong\u003e (always skipped):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNon-HTML resources (any URL with a non-HTML file extension), including \u003ccode\u003e.md\u003c/code\u003e, \u003ccode\u003e.txt\u003c/code\u003e, \u003ccode\u003e.xml\u003c/code\u003e, \u003ccode\u003e.json\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"common-use-cases\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Use Cases\u003c/span\u003e \u003ca href=\"#common-use-cases\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"development-mode\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDevelopment Mode\u003c/span\u003e \u003ca href=\"#development-mode\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnable detailed logging during development:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edebug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"skip-modal-overlay-links\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSkip Modal/Overlay Links\u003c/span\u003e \u003ca href=\"#skip-modal-overlay-links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePrevent transitions for links inside modals:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eskip_selectors\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;.modal a\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;.overlay a\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;[role=\u0026#39;dialog\u0026#39;] a\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"disable-meta-updates-for-performance\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDisable Meta Updates for Performance\u003c/span\u003e \u003ca href=\"#disable-meta-updates-for-performance\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSkip meta tag updates for slightly faster transitions:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eupdate_meta\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"keep-scroll-position-documentation-sites\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKeep Scroll Position (Documentation Sites)\u003c/span\u003e \u003ca href=\"#keep-scroll-position-documentation-sites\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eMaintain scroll position when navigating docs:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escroll_to_top\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"skip-transitions-for-external-looking-links\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSkip Transitions for External-Looking Links\u003c/span\u003e \u003ca href=\"#skip-transitions-for-external-looking-links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eskip_classes\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;external\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;outbound\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eskip_selectors\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;[rel~=\u0026#39;external\u0026#39;]\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;[target=\u0026#39;_blank\u0026#39;]\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"runtime-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRuntime Configuration\u003c/span\u003e \u003ca href=\"#runtime-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eInspect or modify configuration at runtime via browser console:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// View current config\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eVIEW_TRANSITIONS_CONFIG\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Temporarily disable\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eVIEW_TRANSITIONS_CONFIG\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Enable debug mode\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eVIEW_TRANSITIONS_CONFIG\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edebug\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Add skip class\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eVIEW_TRANSITIONS_CONFIG\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eskipClasses\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;my-class\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eNote\u003c/strong\u003e: Runtime changes only affect the current page. Reload to reset.\u003c/p\u003e\n\u003ch2 id=\"per-link-opt-out\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePer-Link Opt-Out\u003c/span\u003e \u003ca href=\"#per-link-opt-out\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDisable transitions for individual links without changing config:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- Using data attribute (always works) --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/page/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003edata-no-transition\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eNo transition\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- Using CSS class (requires config) --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/page/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;no-transition\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eNo transition\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"disabling-temporarily\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDisabling Temporarily\u003c/span\u003e \u003ca href=\"#disabling-temporarily\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor testing or debugging, disable in browser console:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Option 1: Disable via config\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eVIEW_TRANSITIONS_CONFIG\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Option 2: Undefine the API\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estartViewTransition\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003eundefined\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Option 3: Reload page\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elocation\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ereload\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"default-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDefault Behavior\u003c/span\u003e \u003ca href=\"#default-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf you don\u0026rsquo;t add \u003ccode\u003e[view_transitions]\u003c/code\u003e to your config, these defaults apply:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e              \u003cspan class=\"c\"\u003e# View transitions ON by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edebug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e               \u003cspan class=\"c\"\u003e# No console logging\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eduration\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e120\u003c/span\u003e              \u003cspan class=\"c\"\u003e# 120ms reference duration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eupdate_meta\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Update meta tags\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escroll_to_top\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Scroll to top on navigation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eskip_classes\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e           \u003cspan class=\"c\"\u003e# No custom skip classes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eskip_selectors\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e         \u003cspan class=\"c\"\u003e# No custom skip selectors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"minimal-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMinimal Configuration\u003c/span\u003e \u003ca href=\"#minimal-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe simplest valid config (uses all defaults):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr just omit the section entirely - view transitions are enabled by default!\u003c/p\u003e\n\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"view-transitions-not-working\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e“View Transitions not working”\u003c/span\u003e \u003ca href=\"#view-transitions-not-working\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eCheck browser support (Chrome 111+, Safari 18+, Edge 111+)\u003c/li\u003e\n\u003cli\u003eCheck console for errors with \u003ccode\u003edebug = true\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eVerify \u003ccode\u003eenabled = true\u003c/code\u003e in config\u003c/li\u003e\n\u003cli\u003eCheck \u003ccode\u003ewindow.VIEW_TRANSITIONS_CONFIG\u003c/code\u003e in console\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"specific-links-not-transitioning\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e“Specific links not transitioning”\u003c/span\u003e \u003ca href=\"#specific-links-not-transitioning\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eCheck if link matches \u003ccode\u003eskip_selectors\u003c/code\u003e or \u003ccode\u003eskip_classes\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eCheck if link is external (\u003ccode\u003etarget=\u0026quot;_blank\u0026quot;\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eCheck if link has HTMX attributes (\u003ccode\u003ehx-get\u003c/code\u003e, etc.)\u003c/li\u003e\n\u003cli\u003eEnable \u003ccode\u003edebug = true\u003c/code\u003e to see why link is skipped\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"navigation-feels-sluggish\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e“Navigation feels sluggish”\u003c/span\u003e \u003ca href=\"#navigation-feels-sluggish\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eEnable \u003ccode\u003edebug = true\u003c/code\u003e and watch the \u003ccode\u003efetchMs\u003c/code\u003e, \u003ccode\u003eparseMs\u003c/code\u003e, \u003ccode\u003eswapMs\u003c/code\u003e, and \u003ccode\u003ereinitMs\u003c/code\u003e timing log\u003c/li\u003e\n\u003cli\u003eCheck whether the transition was prefetched (\u003ccode\u003eprefetched: true\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eUse the browser Network tab to confirm HTML responses are served from cache when expected\u003c/li\u003e\n\u003cli\u003eProfile re-initialization listeners after \u003ccode\u003eview-transition-complete\u003c/code\u003e if \u003ccode\u003ereinitMs\u003c/code\u003e is consistently high\u003c/li\u003e\n\u003cli\u003eIf \u003ccode\u003eswapMs\u003c/code\u003e is high, check whether the page is replacing more DOM than necessary\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"scripts-not-working-after-transition\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e“Scripts not working after transition”\u003c/span\u003e \u003ca href=\"#scripts-not-working-after-transition\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eMake sure scripts expose init functions and listen for \u003ccode\u003eview-transition-complete\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003einit\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e// Your initialization\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einit\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e \u003cspan class=\"c1\"\u003e// Initial load\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;view-transition-complete\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003einit\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"c1\"\u003e// After transitions\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"css-animation-customization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCSS Animation Customization\u003c/span\u003e \u003ca href=\"#css-animation-customization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhile config controls behavior, CSS controls visual appearance:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Faster transitions */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-old\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003emain-content\u003c/span\u003e\u003cspan class=\"o\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-new\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003emain-content\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eanimation-duration\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.2\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Different animation per element */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-new\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003emain-content\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eanimation\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003efade-in\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.3\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eslide-up\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.3\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-new\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003esite-nav\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eanimation\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enone\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \u003cspan class=\"c\"\u003e/* Nav doesn\u0026#39;t animate */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSee [[view-transitions|View Transitions Guide]] for CSS customization examples.\u003c/p\u003e\n\u003ch2 id=\"related-documentation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRelated Documentation\u003c/span\u003e \u003ca href=\"#related-documentation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[[view-transitions|View Transitions Guide]] - Main documentation\u003c/li\u003e\n\u003cli\u003e[[performance|Performance]] - Performance tips\u003c/li\u003e\n\u003cli\u003e[[configuration|Configuration]] - General markata-go configuration\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"example-configurations\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample Configurations\u003c/span\u003e \u003ca href=\"#example-configurations\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"minimal-all-defaults\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMinimal (All Defaults)\u003c/span\u003e \u003ca href=\"#minimal-all-defaults\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# No config needed - view transitions enabled by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"development\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDevelopment\u003c/span\u003e \u003ca href=\"#development\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edebug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"production-performance-optimized\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProduction (Performance Optimized)\u003c/span\u003e \u003ca href=\"#production-performance-optimized\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edebug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eupdate_meta\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eduration\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e250\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"documentation-site\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocumentation Site\u003c/span\u003e \u003ca href=\"#documentation-site\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escroll_to_top\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eskip_selectors\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;.toc a\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.sidebar a\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"with-skip-rules\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWith Skip Rules\u003c/span\u003e \u003ca href=\"#with-skip-rules\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eskip_classes\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;instant\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;no-anim\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eskip_selectors\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;.modal a\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;[data-external]\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;#admin-nav a\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"disabled\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDisabled\u003c/span\u003e \u003ca href=\"#disabled\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n\nComplete reference for configuring the View Transitions API behavior in markata-go.\n\n## Overview\n\nView Transitions can be configured via your `markata.toml` or YAML config file. All settings are optional - sensible defaults are provided.\n\n## Configuration Options\n\nAdd a `[markata-go.view_transitions]` section to your config:\n\n```toml\n[markata-go.view_transitions]\nenabled = true              # Enable/disable view transitions globally\ndebug = false               # Log debug messages to console\nduration = 120              # Default transition duration in ms\nupdate_meta = true          # Update meta tags on navigation\nscroll_to_top = true        # Scroll to top on navigation (unless hash present)\nskip_classes = []           # Additional CSS classes to skip\nskip_selectors = []         # Additional selectors to skip\n```\n\nIn TOML, nest this under `[markata-go.view_transitions]` because markata-go loads site config from the top-level `[markata-go]` table.\n\n## Quick Examples\n\n### TOML (`markata.toml`)\n\n```toml\n[markata-go.view_transitions]\nenabled = true\ndebug = false\nduration = 120\nupdate_meta = true\nscroll_to_top = true\nskip_classes = [\"no-transition\", \"external-link\"]\nskip_selectors = [\"[data-skip-transition]\", \".modal a\"]\n```\n\n### YAML (`markata.yaml`)\n\n```yaml\nmarkata-go:\n  view_transitions:\n    enabled: true\n    debug: false\n    duration: 120\n    update_meta: true\n    scroll_to_top: true\n    skip_classes:\n      - no-transition\n      - external-link\n    skip_selectors:\n      - \"[data-skip-transition]\"\n      - \".modal a\"\n```\n\n## Option Reference\n\n### `enabled`\n\n**Type**: Boolean  \n**Default**: `true`\n\nEnable or disable view transitions globally.\n\n```toml\n[markata-go.view_transitions]\nenabled = false  # Disable view transitions completely\n```\n\nWhen disabled, all navigation uses standard browser behavior (no transitions).\n\n**Use case**: Temporarily disable for testing or performance debugging.\n\n---\n\n### `debug`\n\n**Type**: Boolean  \n**Default**: `false`\n\nEnable debug logging to browser console.\n\n```toml\n[markata-go.view_transitions]\ndebug = true\n```\n\n**Console output when enabled:**\n\n```\nView Transitions API initialized\nStarting view transition to: /blog/my-post/\nPrefetching URL: /blog/next-post/\n\\[view-transitions\\] timing { fetchMs: 18.4, parseMs: 4.2, swapMs: 7.3, reinitMs: 5.1, totalMs: 42.6 }\nView transition completed\nSkipping link with class: no-transition\n```\n\n**Useful for:**\n- Debugging transition issues\n- Seeing which links are being intercepted\n- Inspecting fetch/parse/swap/reinit timing in the browser console\n- Understanding why certain links are skipped\n\n---\n\n### `duration`\n\n**Type**: Integer (milliseconds)  \n**Default**: `120`\n\nDefault transition duration in milliseconds. Used as a reference value.\n\n```toml\n[markata-go.view_transitions]\nduration = 220  # Slower transitions\n```\n\n**Note**: The actual animation duration is controlled by CSS:\n\n```css\n::view-transition-old(main-content),\n::view-transition-new(main-content) {\n  animation-duration: 0.5s;  /* Match config.duration / 1000 */\n}\n```\n\n---\n\n### `update_meta`\n\n**Type**: Boolean  \n**Default**: `true`\n\nUpdate meta tags (description, Open Graph, Twitter cards, canonical links) when navigating.\n\n```toml\n[view_transitions]\nupdate_meta = false  # Skip meta tag updates\n```\n\n**When `true`**, updates:\n- `\u003cmeta name=\"description\"\u003e`\n- `\u003cmeta property=\"og:*\"\u003e` (Open Graph tags)\n- `\u003cmeta name=\"twitter:*\"\u003e` (Twitter Card tags)\n- `\u003clink rel=\"canonical\"\u003e`\n\n**When `false`**, only updates:\n- Page title\n- Body content\n\n**Use case**: Set to `false` for slightly better performance if you don't rely on meta tags changing.\n\n---\n\n### `scroll_to_top`\n\n**Type**: Boolean  \n**Default**: `true`\n\nAutomatically scroll to top of page after navigation (unless URL has a hash).\n\n```toml\n[view_transitions]\nscroll_to_top = false  # Keep scroll position\n```\n\n**Behavior:**\n- When `true`: Scrolls to top (`window.scrollTo(0, 0)`)\n- If URL has hash (`#section`): Smooth scrolls to that element (ignores this setting)\n- When `false`: Maintains current scroll position\n\n**Use case**: Set to `false` for documentation sites where users may want to maintain context.\n\n---\n\n### `skip_classes`\n\n**Type**: Array of strings  \n**Default**: `[]`\n\nAdditional CSS classes to skip (won't trigger view transitions).\n\n```toml\n[view_transitions]\nskip_classes = [\"no-transition\", \"instant-nav\", \"legacy-link\"]\n```\n\n**Usage in HTML:**\n\n```html\n\u003ca href=\"/page/\" class=\"no-transition\"\u003eSkip transition\u003c/a\u003e\n\u003ca href=\"/instant/\" class=\"instant-nav\"\u003eInstant navigation\u003c/a\u003e\n```\n\n**Built-in skip classes** (always skipped):\n- `.toc-link` - Table of Contents links (use smooth scroll instead)\n\n---\n\n### `skip_selectors`\n\n**Type**: Array of strings  \n**Default**: `[]`\n\nAdditional CSS selectors to skip using `element.matches()`.\n\n```toml\n[view_transitions]\nskip_selectors = [\n  \"[data-no-transition]\",\n  \".modal a\",\n  \"#sidebar nav a\",\n  \"[rel~='nofollow']\"\n]\n```\n\n**Usage in HTML:**\n\n```html\n\u003ca href=\"/page/\" data-no-transition\u003eNo transition\u003c/a\u003e\n\n\u003cdiv class=\"modal\"\u003e\n  \u003ca href=\"/help/\"\u003eWon't transition (inside modal)\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cnav id=\"sidebar\"\u003e\n  \u003ca href=\"/nav/\"\u003eWon't transition (in sidebar)\u003c/a\u003e\n\u003c/nav\u003e\n```\n\n**Built-in skip selectors** (always skipped):\n- `a[target=\"_blank\"]` - External links\n- `a[download]` - Download links\n- `a[rel~=\"external\"]` - External rel links\n- `a[hx-get]`, `a[hx-post]` - HTMX-managed links\n- `a[data-no-transition]` - Explicit opt-out\n\n**Built-in skip behavior** (always skipped):\n- Non-HTML resources (any URL with a non-HTML file extension), including `.md`, `.txt`, `.xml`, `.json`\n\n---\n\n## Common Use Cases\n\n### Development Mode\n\nEnable detailed logging during development:\n\n```toml\n[view_transitions]\nenabled = true\ndebug = true\n```\n\n### Skip Modal/Overlay Links\n\nPrevent transitions for links inside modals:\n\n```toml\n[view_transitions]\nskip_selectors = [\n  \".modal a\",\n  \".overlay a\",\n  \"[role='dialog'] a\"\n]\n```\n\n### Disable Meta Updates for Performance\n\nSkip meta tag updates for slightly faster transitions:\n\n```toml\n[view_transitions]\nupdate_meta = false\n```\n\n### Keep Scroll Position (Documentation Sites)\n\nMaintain scroll position when navigating docs:\n\n```toml\n[view_transitions]\nscroll_to_top = false\n```\n\n### Skip Transitions for External-Looking Links\n\n```toml\n[view_transitions]\nskip_classes = [\"external\", \"outbound\"]\nskip_selectors = [\"[rel~='external']\", \"[target='_blank']\"]\n```\n\n## Runtime Configuration\n\nInspect or modify configuration at runtime via browser console:\n\n```javascript\n// View current config\nconsole.log(window.VIEW_TRANSITIONS_CONFIG);\n\n// Temporarily disable\nwindow.VIEW_TRANSITIONS_CONFIG.enabled = false;\n\n// Enable debug mode\nwindow.VIEW_TRANSITIONS_CONFIG.debug = true;\n\n// Add skip class\nwindow.VIEW_TRANSITIONS_CONFIG.skipClasses.push('my-class');\n```\n\n**Note**: Runtime changes only affect the current page. Reload to reset.\n\n## Per-Link Opt-Out\n\nDisable transitions for individual links without changing config:\n\n```html\n\u003c!-- Using data attribute (always works) --\u003e\n\u003ca href=\"/page/\" data-no-transition\u003eNo transition\u003c/a\u003e\n\n\u003c!-- Using CSS class (requires config) --\u003e\n\u003ca href=\"/page/\" class=\"no-transition\"\u003eNo transition\u003c/a\u003e\n```\n\n## Disabling Temporarily\n\nFor testing or debugging, disable in browser console:\n\n```javascript\n// Option 1: Disable via config\nwindow.VIEW_TRANSITIONS_CONFIG.enabled = false;\n\n// Option 2: Undefine the API\ndocument.startViewTransition = undefined;\n\n// Option 3: Reload page\nlocation.reload();\n```\n\n## Default Behavior\n\nIf you don't add `[view_transitions]` to your config, these defaults apply:\n\n```toml\n[markata-go.view_transitions]\nenabled = true              # View transitions ON by default\ndebug = false               # No console logging\nduration = 120              # 120ms reference duration\nupdate_meta = true          # Update meta tags\nscroll_to_top = true        # Scroll to top on navigation\nskip_classes = []           # No custom skip classes\nskip_selectors = []         # No custom skip selectors\n```\n\n## Minimal Configuration\n\nThe simplest valid config (uses all defaults):\n\n```toml\n[view_transitions]\nenabled = true\n```\n\nOr just omit the section entirely - view transitions are enabled by default!\n\n## Troubleshooting\n\n### \"View Transitions not working\"\n\n1. Check browser support (Chrome 111+, Safari 18+, Edge 111+)\n2. Check console for errors with `debug = true`\n3. Verify `enabled = true` in config\n4. Check `window.VIEW_TRANSITIONS_CONFIG` in console\n\n### \"Specific links not transitioning\"\n\n1. Check if link matches `skip_selectors` or `skip_classes`\n2. Check if link is external (`target=\"_blank\"`)\n3. Check if link has HTMX attributes (`hx-get`, etc.)\n4. Enable `debug = true` to see why link is skipped\n\n### \"Navigation feels sluggish\"\n\n1. Enable `debug = true` and watch the `fetchMs`, `parseMs`, `swapMs`, and `reinitMs` timing log\n2. Check whether the transition was prefetched (`prefetched: true`)\n3. Use the browser Network tab to confirm HTML responses are served from cache when expected\n4. Profile re-initialization listeners after `view-transition-complete` if `reinitMs` is consistently high\n5. If `swapMs` is high, check whether the page is replacing more DOM than necessary\n\n### \"Scripts not working after transition\"\n\nMake sure scripts expose init functions and listen for `view-transition-complete`:\n\n```javascript\nfunction init() {\n  // Your initialization\n}\n\ninit(); // Initial load\nwindow.addEventListener('view-transition-complete', init); // After transitions\n```\n\n## CSS Animation Customization\n\nWhile config controls behavior, CSS controls visual appearance:\n\n```css\n/* Faster transitions */\n::view-transition-old(main-content),\n::view-transition-new(main-content) {\n  animation-duration: 0.2s;\n}\n\n/* Different animation per element */\n::view-transition-new(main-content) {\n  animation: fade-in 0.3s, slide-up 0.3s;\n}\n\n::view-transition-new(site-nav) {\n  animation: none;  /* Nav doesn't animate */\n}\n```\n\nSee [[view-transitions|View Transitions Guide]] for CSS customization examples.\n\n## Related Documentation\n\n- [[view-transitions|View Transitions Guide]] - Main documentation\n- [[performance|Performance]] - Performance tips\n- [[configuration|Configuration]] - General markata-go configuration\n\n## Example Configurations\n\n### Minimal (All Defaults)\n\n```toml\n# No config needed - view transitions enabled by default\n```\n\n### Development\n\n```toml\n[view_transitions]\nenabled = true\ndebug = true\n```\n\n### Production (Performance Optimized)\n\n```toml\n[view_transitions]\nenabled = true\ndebug = false\nupdate_meta = false\nduration = 250\n```\n\n### Documentation Site\n\n```toml\n[view_transitions]\nenabled = true\nscroll_to_top = false\nskip_selectors = [\".toc a\", \".sidebar a\"]\n```\n\n### With Skip Rules\n\n```toml\n[view_transitions]\nenabled = true\nskip_classes = [\"instant\", \"no-anim\"]\nskip_selectors = [\n  \".modal a\",\n  \"[data-external]\",\n  \"#admin-nav a\"\n]\n```\n\n### Disabled\n\n```toml\n[view_transitions]\nenabled = false\n```\n",
      "summary": "Complete configuration reference for View Transitions API settings",
      "date_published": "2026-02-02T00:00:00Z",
      "date_modified": "2026-02-02T00:00:00Z",
      "tags": [
        "view-transitions",
        "configuration",
        "reference"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/view-transitions/",
      "url": "https://markata.dev/docs/guides/view-transitions/",
      "title": "View Transitions API",
      "content_html": "\u003cp\u003eSmooth, animated transitions between pages and views using the modern View Transitions API. This implementation provides a polished user experience with automatic transitions for all internal navigation.\u003c/p\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eView Transitions are \u003cstrong\u003eenabled by default\u003c/strong\u003e. No configuration required!\u003c/p\u003e\n\u003cp\u003eTo customize behavior, add to your \u003ccode\u003emarkata.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edebug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSee [[view-transitions-config|Configuration Reference]] for all options.\u003c/p\u003e\n\u003ch2 id=\"what-it-does\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat It Does\u003c/span\u003e \u003ca href=\"#what-it-does\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe View Transitions API automatically adds smooth animations when users navigate between pages:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eWikilinks\u003c/strong\u003e (\u003ccode\u003e[[slug]]\u003c/code\u003e) - Smooth transitions between related content\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCard clicks\u003c/strong\u003e - Polished navigation from feeds to full posts\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNavigation links\u003c/strong\u003e - Stable header/footer during transitions\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePost navigation\u003c/strong\u003e - Smooth prev/next post transitions\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBreadcrumbs\u003c/strong\u003e - Contextual navigation animations\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAll internal links\u003c/strong\u003e - Any \u003ccode\u003e\u0026lt;a href\u0026gt;\u003c/code\u003e to same-origin pages\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"smart-exclusions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSmart Exclusions\u003c/span\u003e \u003ca href=\"#smart-exclusions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThese link types are automatically skipped (use normal navigation):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eExternal links (\u003ccode\u003etarget=\u0026quot;_blank\u0026quot;\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eDownload links\u003c/li\u003e\n\u003cli\u003eTOC/anchor links (use smooth scroll instead)\u003c/li\u003e\n\u003cli\u003eHTMX links (handle their own updates)\u003c/li\u003e\n\u003cli\u003eLinks with \u003ccode\u003edata-no-transition\u003c/code\u003e attribute\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"how-it-works\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow It Works\u003c/span\u003e \u003ca href=\"#how-it-works\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"1-link-interception\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e1. Link Interception\u003c/span\u003e \u003ca href=\"#1-link-interception\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eA global event listener intercepts clicks on internal links:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// User clicks an internal link\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;click\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003elink\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eclosest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eshouldTransition\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003elink\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epreventDefault\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e// Start view transition...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"2-content-fetching\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e2. Content Fetching\u003c/span\u003e \u003ca href=\"#2-content-fetching\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe new page is fetched and parsed before the transition starts so the current view stays responsive while network work happens:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003eresponse\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kr\"\u003eawait\u003c/span\u003e \u003cspan class=\"nx\"\u003efetch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kr\"\u003eawait\u003c/span\u003e \u003cspan class=\"nx\"\u003eresponse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003enewDoc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eDOMParser\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eparseFromString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;text/html\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"3-transition-animation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e3. Transition Animation\u003c/span\u003e \u003ca href=\"#3-transition-animation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe browser animates between old and new content:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estartViewTransition\u003c/span\u003e\u003cspan class=\"p\"\u003e(()\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e// Update only the changing layout regions.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003equerySelector\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;#view-transition-page\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003ereplaceWith\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003enewDoc\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003equerySelector\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;#view-transition-page\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003ecloneNode\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003enewDoc\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003ehistory\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epushState\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"4-script-re-initialization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e4. Script Re-initialization\u003c/span\u003e \u003ca href=\"#4-script-re-initialization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAfter transition, page scripts are re-initialized:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Dispatch event for scripts to listen to\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edispatchEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eCustomEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;view-transition-complete\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Scripts automatically re-initialize\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003einitTooltips\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003einitTooltips\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003einitScrollSpy\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003einitScrollSpy\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"browser-support\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBrowser Support\u003c/span\u003e \u003ca href=\"#browser-support\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e✅ \u003cstrong\u003eChrome/Edge 111+\u003c/strong\u003e - Full support\u003c/li\u003e\n\u003cli\u003e✅ \u003cstrong\u003eSafari 18+\u003c/strong\u003e (macOS 15+, iOS 18+) - Full support\u003c/li\u003e\n\u003cli\u003e✅ \u003cstrong\u003eOpera 97+\u003c/strong\u003e - Full support\u003c/li\u003e\n\u003cli\u003e⚠️ \u003cstrong\u003eFirefox\u003c/strong\u003e - In development\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eGraceful degradation:\u003c/strong\u003e On unsupported browsers, navigation works normally without transitions.\u003c/p\u003e\n\u003ch2 id=\"default-animation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDefault Animation\u003c/span\u003e \u003ca href=\"#default-animation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe default transition is a \u003cstrong\u003efade + slide-up\u003c/strong\u003e effect:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eOld content\u003c/strong\u003e: Fades out (250ms)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNew content\u003c/strong\u003e: Fades in + slides up from 20px below (300ms)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNavigation\u003c/strong\u003e: Stays stable (200ms minimal animation)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"css-implementation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCSS Implementation\u003c/span\u003e \u003ca href=\"#css-implementation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Assign transition names */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003epost-content\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eposts-list\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eview-transition-name\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003emain-content\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Animate old content out */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-old\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003emain-content\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eanimation\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003efade-out\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.25\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e \u003cspan class=\"kc\"\u003eease-out\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Animate new content in */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-new\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003emain-content\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eanimation\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003efade-in\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.3\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e \u003cspan class=\"kc\"\u003eease-in\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eslide-up\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.3\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e \u003cspan class=\"kc\"\u003eease-out\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ekeyframes\u003c/span\u003e \u003cspan class=\"nt\"\u003efade-out\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003eto\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eopacity\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ekeyframes\u003c/span\u003e \u003cspan class=\"nt\"\u003efade-in\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003efrom\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eopacity\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ekeyframes\u003c/span\u003e \u003cspan class=\"nt\"\u003eslide-up\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003efrom\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003etransform\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003etranslateY\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e20\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"customization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustomization\u003c/span\u003e \u003ca href=\"#customization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSee [[view-transitions-config|Configuration Reference]] for complete customization options.\u003c/p\u003e\n\u003ch3 id=\"quick-examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Examples\u003c/span\u003e \u003ca href=\"#quick-examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eEnable debug logging:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edebug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eSkip transitions for specific classes:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eskip_classes\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;instant-nav\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;no-animation\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eDisable globally:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePer-link opt-out:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/page/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003edata-no-transition\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eSkip transition\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"custom-css-animations\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom CSS Animations\u003c/span\u003e \u003ca href=\"#custom-css-animations\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOverride the default animations in your custom CSS:\u003c/p\u003e\n\u003ch3 id=\"different-animation-style\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDifferent Animation Style\u003c/span\u003e \u003ca href=\"#different-animation-style\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Slide from right instead of bottom */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-new\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003emain-content\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eanimation\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003efade-in\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.3\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eslide-from-right\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.3\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ekeyframes\u003c/span\u003e \u003cspan class=\"nt\"\u003eslide-from-right\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003efrom\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eopacity\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003etransform\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003etranslateX\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e30\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"faster-transitions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFaster Transitions\u003c/span\u003e \u003ca href=\"#faster-transitions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-old\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003emain-content\u003c/span\u003e\u003cspan class=\"o\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-new\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003emain-content\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eanimation-duration\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.2\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"per-element-transitions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePer-Element Transitions\u003c/span\u003e \u003ca href=\"#per-element-transitions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Different animation for post titles */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003epost-title\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eview-transition-name\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003epost-title\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-new\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003epost-title\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eanimation\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003efade-in\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.3\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003escale-up\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.3\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ekeyframes\u003c/span\u003e \u003cspan class=\"nt\"\u003escale-up\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003efrom\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003etransform\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003escale\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.95\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"individual-card-morphing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIndividual Card Morphing\u003c/span\u003e \u003ca href=\"#individual-card-morphing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGive each card a unique transition name:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;view-transition-name: card-{{ post.slug }};\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow cards will morph smoothly when navigating!\u003c/p\u003e\n\u003ch2 id=\"performance\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePerformance\u003c/span\u003e \u003ca href=\"#performance\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eBundle size\u003c/strong\u003e: ~8KB unminified JavaScript\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOverhead\u003c/strong\u003e: Near-zero (exits early on unsupported browsers)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAnimation\u003c/strong\u003e: GPU-accelerated\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNetwork\u003c/strong\u003e: Uses standard \u003ccode\u003efetch()\u003c/code\u003e API\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMemory\u003c/strong\u003e: One active navigation at a time with a small bounded prefetch cache\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"performance-tips\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePerformance Tips\u003c/span\u003e \u003ca href=\"#performance-tips\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eKeep pages small\u003c/strong\u003e - Large HTML takes longer to parse\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOptimize images\u003c/strong\u003e - Images in new content delay transition\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMinimize inline scripts\u003c/strong\u003e - Scripts need re-initialization\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUse caching\u003c/strong\u003e - Browser caches reduce fetch time\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSwap smaller regions\u003c/strong\u003e - Replacing the page wrapper is usually cheaper than replacing the entire \u003ccode\u003ebody\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAvoid broad named snapshots\u003c/strong\u003e - Prefer shared element names on small cards, titles, or headers rather than whole articles or sidebars\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"accessibility\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAccessibility\u003c/span\u003e \u003ca href=\"#accessibility\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eView Transitions respect user preferences:\u003c/p\u003e\n\u003ch3 id=\"reduced-motion\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReduced Motion\u003c/span\u003e \u003ca href=\"#reduced-motion\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUsers who prefer reduced motion automatically get instant transitions:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003emedia\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003eprefers-reduced-motion\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nt\"\u003ereduce\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-group\u003c/span\u003e\u003cspan class=\"o\"\u003e(*),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-old\u003c/span\u003e\u003cspan class=\"o\"\u003e(*),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-new\u003c/span\u003e\u003cspan class=\"o\"\u003e(*)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eanimation\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enone\u003c/span\u003e \u003cspan class=\"cp\"\u003e!important\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"screen-readers\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eScreen Readers\u003c/span\u003e \u003ca href=\"#screen-readers\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003ePage title updates immediately\u003c/li\u003e\n\u003cli\u003eMain content landmark is preserved\u003c/li\u003e\n\u003cli\u003eFocus management handled automatically\u003c/li\u003e\n\u003cli\u003eNo ARIA changes needed\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"transitions-not-working\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTransitions Not Working\u003c/span\u003e \u003ca href=\"#transitions-not-working\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eCheck browser support\u003c/strong\u003e - Only Chrome 111+, Safari 18+, Opera 97+\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCheck console\u003c/strong\u003e - Look for errors or warnings\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eEnable debug mode\u003c/strong\u003e - Set \u003ccode\u003edebug = true\u003c/code\u003e in config\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVerify enabled\u003c/strong\u003e - Check \u003ccode\u003ewindow.VIEW_TRANSITIONS_CONFIG.enabled\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"specific-links-not-transitioning\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSpecific Links Not Transitioning\u003c/span\u003e \u003ca href=\"#specific-links-not-transitioning\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eExternal link?\u003c/strong\u003e - Links with \u003ccode\u003etarget=\u0026quot;_blank\u0026quot;\u003c/code\u003e are skipped\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHTMX link?\u003c/strong\u003e - Links with \u003ccode\u003ehx-get\u003c/code\u003e are skipped\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTOC link?\u003c/strong\u003e - Anchor links use smooth scroll\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCustom skip rule?\u003c/strong\u003e - Check \u003ccode\u003eskip_classes\u003c/code\u003e and \u003ccode\u003eskip_selectors\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNon-HTML file?\u003c/strong\u003e - URLs like \u003ccode\u003e.md\u003c/code\u003e, \u003ccode\u003e.txt\u003c/code\u003e, \u003ccode\u003e.xml\u003c/code\u003e, \u003ccode\u003e.json\u003c/code\u003e use native browser navigation\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eEnable debug mode to see why links are skipped:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edebug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen check browser console when clicking links.\u003c/p\u003e\n\u003ch3 id=\"scripts-not-working-after-transition\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eScripts Not Working After Transition\u003c/span\u003e \u003ca href=\"#scripts-not-working-after-transition\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eMake sure your custom scripts listen for the re-initialization event:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003emyInit\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e// Your initialization code\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Run on initial page load\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emyInit\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Re-run after view transitions\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;view-transition-complete\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003emyInit\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003emarkata-go dispatches this event after the browser transition finishes. That keeps expensive script hydration out of the critical transition snapshot and makes animations less likely to stutter.\u003c/p\u003e\n\u003ch3 id=\"janky-transitions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJanky Transitions\u003c/span\u003e \u003ca href=\"#janky-transitions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf transitions stutter, enable debug mode and inspect the timing payload logged to the console:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edebug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eHigh \u003ccode\u003efetchMs\u003c/code\u003e or \u003ccode\u003eparseMs\u003c/code\u003e points to network or page size. High \u003ccode\u003eswapMs\u003c/code\u003e points to expensive DOM/head changes. High \u003ccode\u003ereinitMs\u003c/code\u003e points to custom scripts doing too much work after navigation.\u003c/p\u003e\n\u003ch3 id=\"transition-too-fast-slow\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTransition Too Fast/Slow\u003c/span\u003e \u003ca href=\"#transition-too-fast-slow\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdjust animation duration in CSS:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-old\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003emain-content\u003c/span\u003e\u003cspan class=\"o\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-new\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003emain-content\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eanimation-duration\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Slower */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"advanced-usage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdvanced Usage\u003c/span\u003e \u003ca href=\"#advanced-usage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"transition-types\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTransition Types\u003c/span\u003e \u003ca href=\"#transition-types\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd custom data attributes to control transitions per-route:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Future enhancement - not yet implemented\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elink\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edataset\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etransitionType\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;slide\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"prefetching\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrefetching\u003c/span\u003e \u003ca href=\"#prefetching\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go prefetches transition-managed links on hover/focus and can eagerly warm nearby pagination targets so \u003ccode\u003e[\u003c/code\u003e and \u003ccode\u003e]\u003c/code\u003e navigation feels more immediate. Prefetching is debounced and bounded to avoid excessive fetch/parse work when a user moves across a dense sidebar or feed.\u003c/p\u003e\n\u003cp\u003ePrefetched documents are reused for five seconds after they finish loading. Expired entries are evicted before the bounded cache admits new work; navigating to an older entry fetches it again with HTTP cache revalidation, so a published update can replace an older in-memory page. HTTP caches can use retained ETag and Last-Modified validators; servers that mark responses \u003ccode\u003eno-store\u003c/code\u003e may require a full response. If revalidation fails, navigation falls back to the ordinary static page request.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;mouseover\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003elink\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eclosest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003elink\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprefetchViewTransitionUrl\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003elink\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehref\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"loading-states\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLoading States\u003c/span\u003e \u003ca href=\"#loading-states\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eShow loading indicator during fetch:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Future enhancement - not yet implemented\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;htmx:beforeRequest\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eshowLoadingSpinner\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"simple-fade\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSimple Fade\u003c/span\u003e \u003ca href=\"#simple-fade\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-old\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003emain-content\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eanimation\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003efade-out\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.3\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-new\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003emain-content\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eanimation\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003efade-in\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.3\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"scale-transition\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eScale Transition\u003c/span\u003e \u003ca href=\"#scale-transition\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-old\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003emain-content\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eanimation\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003escale-down\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.3\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-new\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003emain-content\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eanimation\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003escale-up\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.3\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ekeyframes\u003c/span\u003e \u003cspan class=\"nt\"\u003escale-down\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003eto\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003etransform\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003escale\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.95\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"k\"\u003eopacity\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ekeyframes\u003c/span\u003e \u003cspan class=\"nt\"\u003escale-up\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003efrom\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003etransform\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003escale\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.95\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"k\"\u003eopacity\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"slide-transition\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSlide Transition\u003c/span\u003e \u003ca href=\"#slide-transition\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-old\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003emain-content\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eanimation\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eslide-out-left\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.3\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eview-transition-new\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003emain-content\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eanimation\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eslide-in-right\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.3\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ekeyframes\u003c/span\u003e \u003cspan class=\"nt\"\u003eslide-out-left\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003eto\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003etransform\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003etranslateX\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e-100\u003c/span\u003e\u003cspan class=\"kt\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"k\"\u003eopacity\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ekeyframes\u003c/span\u003e \u003cspan class=\"nt\"\u003eslide-in-right\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003efrom\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003etransform\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003etranslateX\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"kt\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"k\"\u003eopacity\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"related-documentation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRelated Documentation\u003c/span\u003e \u003ca href=\"#related-documentation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[[view-transitions-config|Configuration Reference]] - All configuration options\u003c/li\u003e\n\u003cli\u003e[[performance|Performance]] - Performance optimization guide\u003c/li\u003e\n\u003cli\u003e[[keyboard-navigation|Keyboard Navigation]] - Accessibility features\u003c/li\u003e\n\u003cli\u003e[[themes|Themes]] - Customizing appearance\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"resources\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eResources\u003c/span\u003e \u003ca href=\"#resources\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API\"\u003eMDN: View Transitions API\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://developer.chrome.com/docs/web-platform/view-transitions/\"\u003eChrome Developers: View Transitions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://view-transitions.chrome.dev/\"\u003eView Transitions Demos\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"implementation-files\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eImplementation Files\u003c/span\u003e \u003ca href=\"#implementation-files\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eJavaScript\u003c/strong\u003e: \u003ccode\u003epkg/themes/default/static/js/view-transitions.js\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCSS\u003c/strong\u003e: \u003ccode\u003epkg/themes/default/static/css/components.css\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTemplate\u003c/strong\u003e: \u003ccode\u003epkg/themes/default/templates/base.html\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nSmooth, animated transitions between pages and views using the modern View Transitions API. This implementation provides a polished user experience with automatic transitions for all internal navigation.\n\n## Quick Start\n\nView Transitions are **enabled by default**. No configuration required!\n\nTo customize behavior, add to your `markata.toml`:\n\n```toml\n[view_transitions]\nenabled = true\ndebug = false\n```\n\nSee [[view-transitions-config|Configuration Reference]] for all options.\n\n## What It Does\n\nThe View Transitions API automatically adds smooth animations when users navigate between pages:\n\n- **Wikilinks** (`[[slug]]`) - Smooth transitions between related content\n- **Card clicks** - Polished navigation from feeds to full posts\n- **Navigation links** - Stable header/footer during transitions\n- **Post navigation** - Smooth prev/next post transitions\n- **Breadcrumbs** - Contextual navigation animations\n- **All internal links** - Any `\u003ca href\u003e` to same-origin pages\n\n### Smart Exclusions\n\nThese link types are automatically skipped (use normal navigation):\n\n- External links (`target=\"_blank\"`)\n- Download links\n- TOC/anchor links (use smooth scroll instead)\n- HTMX links (handle their own updates)\n- Links with `data-no-transition` attribute\n\n## How It Works\n\n### 1. Link Interception\n\nA global event listener intercepts clicks on internal links:\n\n```javascript\n// User clicks an internal link\ndocument.addEventListener('click', (e) =\u003e {\n  const link = e.target.closest('a');\n  if (shouldTransition(link)) {\n    e.preventDefault();\n    // Start view transition...\n  }\n});\n```\n\n### 2. Content Fetching\n\nThe new page is fetched and parsed before the transition starts so the current view stays responsive while network work happens:\n\n```javascript\nconst response = await fetch(url);\nconst html = await response.text();\nconst newDoc = new DOMParser().parseFromString(html, 'text/html');\n```\n\n### 3. Transition Animation\n\nThe browser animates between old and new content:\n\n```javascript\ndocument.startViewTransition(() =\u003e {\n  // Update only the changing layout regions.\n  document.querySelector('#view-transition-page').replaceWith(\n    newDoc.querySelector('#view-transition-page').cloneNode(true),\n  );\n  document.title = newDoc.title;\n  history.pushState(null, '', url);\n});\n```\n\n### 4. Script Re-initialization\n\nAfter transition, page scripts are re-initialized:\n\n```javascript\n// Dispatch event for scripts to listen to\nwindow.dispatchEvent(new CustomEvent('view-transition-complete'));\n\n// Scripts automatically re-initialize\nif (window.initTooltips) window.initTooltips();\nif (window.initScrollSpy) window.initScrollSpy();\n```\n\n## Browser Support\n\n- ✅ **Chrome/Edge 111+** - Full support\n- ✅ **Safari 18+** (macOS 15+, iOS 18+) - Full support\n- ✅ **Opera 97+** - Full support\n- ⚠️ **Firefox** - In development\n\n**Graceful degradation:** On unsupported browsers, navigation works normally without transitions.\n\n## Default Animation\n\nThe default transition is a **fade + slide-up** effect:\n\n- **Old content**: Fades out (250ms)\n- **New content**: Fades in + slides up from 20px below (300ms)\n- **Navigation**: Stays stable (200ms minimal animation)\n\n### CSS Implementation\n\n```css\n/* Assign transition names */\n.post-content,\n.posts-list {\n  view-transition-name: main-content;\n}\n\n/* Animate old content out */\n::view-transition-old(main-content) {\n  animation: fade-out 0.25s ease-out;\n}\n\n/* Animate new content in */\n::view-transition-new(main-content) {\n  animation: fade-in 0.3s ease-in, slide-up 0.3s ease-out;\n}\n\n@keyframes fade-out {\n  to { opacity: 0; }\n}\n\n@keyframes fade-in {\n  from { opacity: 0; }\n}\n\n@keyframes slide-up {\n  from { transform: translateY(20px); }\n}\n```\n\n## Customization\n\nSee [[view-transitions-config|Configuration Reference]] for complete customization options.\n\n### Quick Examples\n\n**Enable debug logging:**\n\n```toml\n[view_transitions]\ndebug = true\n```\n\n**Skip transitions for specific classes:**\n\n```toml\n[view_transitions]\nskip_classes = [\"instant-nav\", \"no-animation\"]\n```\n\n**Disable globally:**\n\n```toml\n[view_transitions]\nenabled = false\n```\n\n**Per-link opt-out:**\n\n```html\n\u003ca href=\"/page/\" data-no-transition\u003eSkip transition\u003c/a\u003e\n```\n\n## Custom CSS Animations\n\nOverride the default animations in your custom CSS:\n\n### Different Animation Style\n\n```css\n/* Slide from right instead of bottom */\n::view-transition-new(main-content) {\n  animation: fade-in 0.3s, slide-from-right 0.3s;\n}\n\n@keyframes slide-from-right {\n  from {\n    opacity: 0;\n    transform: translateX(30px);\n  }\n}\n```\n\n### Faster Transitions\n\n```css\n::view-transition-old(main-content),\n::view-transition-new(main-content) {\n  animation-duration: 0.2s;\n}\n```\n\n### Per-Element Transitions\n\n```css\n/* Different animation for post titles */\n.post-title {\n  view-transition-name: post-title;\n}\n\n::view-transition-new(post-title) {\n  animation: fade-in 0.3s, scale-up 0.3s;\n}\n\n@keyframes scale-up {\n  from { transform: scale(0.95); }\n}\n```\n\n### Individual Card Morphing\n\nGive each card a unique transition name:\n\n```html\n\u003carticle class=\"card\" style=\"view-transition-name: card-{{ post.slug }};\"\u003e\n  ...\n\u003c/article\u003e\n```\n\nNow cards will morph smoothly when navigating!\n\n## Performance\n\n- **Bundle size**: ~8KB unminified JavaScript\n- **Overhead**: Near-zero (exits early on unsupported browsers)\n- **Animation**: GPU-accelerated\n- **Network**: Uses standard `fetch()` API\n- **Memory**: One active navigation at a time with a small bounded prefetch cache\n\n### Performance Tips\n\n1. **Keep pages small** - Large HTML takes longer to parse\n2. **Optimize images** - Images in new content delay transition\n3. **Minimize inline scripts** - Scripts need re-initialization\n4. **Use caching** - Browser caches reduce fetch time\n5. **Swap smaller regions** - Replacing the page wrapper is usually cheaper than replacing the entire `body`\n6. **Avoid broad named snapshots** - Prefer shared element names on small cards, titles, or headers rather than whole articles or sidebars\n\n## Accessibility\n\nView Transitions respect user preferences:\n\n### Reduced Motion\n\nUsers who prefer reduced motion automatically get instant transitions:\n\n```css\n@media (prefers-reduced-motion: reduce) {\n  ::view-transition-group(*),\n  ::view-transition-old(*),\n  ::view-transition-new(*) {\n    animation: none !important;\n  }\n}\n```\n\n### Screen Readers\n\n- Page title updates immediately\n- Main content landmark is preserved\n- Focus management handled automatically\n- No ARIA changes needed\n\n## Troubleshooting\n\n### Transitions Not Working\n\n1. **Check browser support** - Only Chrome 111+, Safari 18+, Opera 97+\n2. **Check console** - Look for errors or warnings\n3. **Enable debug mode** - Set `debug = true` in config\n4. **Verify enabled** - Check `window.VIEW_TRANSITIONS_CONFIG.enabled`\n\n### Specific Links Not Transitioning\n\n1. **External link?** - Links with `target=\"_blank\"` are skipped\n2. **HTMX link?** - Links with `hx-get` are skipped\n3. **TOC link?** - Anchor links use smooth scroll\n4. **Custom skip rule?** - Check `skip_classes` and `skip_selectors`\n5. **Non-HTML file?** - URLs like `.md`, `.txt`, `.xml`, `.json` use native browser navigation\n\nEnable debug mode to see why links are skipped:\n\n```toml\n[view_transitions]\ndebug = true\n```\n\nThen check browser console when clicking links.\n\n### Scripts Not Working After Transition\n\nMake sure your custom scripts listen for the re-initialization event:\n\n```javascript\nfunction myInit() {\n  // Your initialization code\n}\n\n// Run on initial page load\nmyInit();\n\n// Re-run after view transitions\nwindow.addEventListener('view-transition-complete', myInit);\n```\n\nmarkata-go dispatches this event after the browser transition finishes. That keeps expensive script hydration out of the critical transition snapshot and makes animations less likely to stutter.\n\n### Janky Transitions\n\nIf transitions stutter, enable debug mode and inspect the timing payload logged to the console:\n\n```toml\n[view_transitions]\ndebug = true\n```\n\nHigh `fetchMs` or `parseMs` points to network or page size. High `swapMs` points to expensive DOM/head changes. High `reinitMs` points to custom scripts doing too much work after navigation.\n\n### Transition Too Fast/Slow\n\nAdjust animation duration in CSS:\n\n```css\n::view-transition-old(main-content),\n::view-transition-new(main-content) {\n  animation-duration: 0.5s; /* Slower */\n}\n```\n\n## Advanced Usage\n\n### Transition Types\n\nAdd custom data attributes to control transitions per-route:\n\n```javascript\n// Future enhancement - not yet implemented\nlink.dataset.transitionType = 'slide';\n```\n\n### Prefetching\n\nmarkata-go prefetches transition-managed links on hover/focus and can eagerly warm nearby pagination targets so `[` and `]` navigation feels more immediate. Prefetching is debounced and bounded to avoid excessive fetch/parse work when a user moves across a dense sidebar or feed.\n\nPrefetched documents are reused for five seconds after they finish loading. Expired entries are evicted before the bounded cache admits new work; navigating to an older entry fetches it again with HTTP cache revalidation, so a published update can replace an older in-memory page. HTTP caches can use retained ETag and Last-Modified validators; servers that mark responses `no-store` may require a full response. If revalidation fails, navigation falls back to the ordinary static page request.\n\n```javascript\ndocument.addEventListener('mouseover', (event) =\u003e {\n  const link = event.target.closest('a');\n  if (link) {\n    window.prefetchViewTransitionUrl(link.href);\n  }\n});\n```\n\n### Loading States\n\nShow loading indicator during fetch:\n\n```javascript\n// Future enhancement - not yet implemented\ndocument.addEventListener('htmx:beforeRequest', () =\u003e {\n  showLoadingSpinner();\n});\n```\n\n## Examples\n\n### Simple Fade\n\n```css\n::view-transition-old(main-content) {\n  animation: fade-out 0.3s;\n}\n\n::view-transition-new(main-content) {\n  animation: fade-in 0.3s;\n}\n```\n\n### Scale Transition\n\n```css\n::view-transition-old(main-content) {\n  animation: scale-down 0.3s;\n}\n\n::view-transition-new(main-content) {\n  animation: scale-up 0.3s;\n}\n\n@keyframes scale-down {\n  to { transform: scale(0.95); opacity: 0; }\n}\n\n@keyframes scale-up {\n  from { transform: scale(0.95); opacity: 0; }\n}\n```\n\n### Slide Transition\n\n```css\n::view-transition-old(main-content) {\n  animation: slide-out-left 0.3s;\n}\n\n::view-transition-new(main-content) {\n  animation: slide-in-right 0.3s;\n}\n\n@keyframes slide-out-left {\n  to { transform: translateX(-100%); opacity: 0; }\n}\n\n@keyframes slide-in-right {\n  from { transform: translateX(100%); opacity: 0; }\n}\n```\n\n## Related Documentation\n\n- [[view-transitions-config|Configuration Reference]] - All configuration options\n- [[performance|Performance]] - Performance optimization guide\n- [[keyboard-navigation|Keyboard Navigation]] - Accessibility features\n- [[themes|Themes]] - Customizing appearance\n\n## Resources\n\n- [MDN: View Transitions API](https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API)\n- [Chrome Developers: View Transitions](https://developer.chrome.com/docs/web-platform/view-transitions/)\n- [View Transitions Demos](https://view-transitions.chrome.dev/)\n\n## Implementation Files\n\n- **JavaScript**: `pkg/themes/default/static/js/view-transitions.js`\n- **CSS**: `pkg/themes/default/static/css/components.css`\n- **Template**: `pkg/themes/default/templates/base.html`\n",
      "summary": "Smooth, animated page transitions for improved user experience and visual continuity",
      "date_published": "2026-02-02T00:00:00Z",
      "date_modified": "2026-02-02T00:00:00Z",
      "tags": [
        "view-transitions",
        "animations",
        "javascript",
        "performance"
      ]
    },
    {
      "id": "https://markata.dev/docs/troubleshooting/build-inconsistencies/",
      "url": "https://markata.dev/docs/troubleshooting/build-inconsistencies/",
      "title": "Troubleshooting Build Inconsistencies",
      "content_html": "\u003cp\u003eIf you\u0026rsquo;re getting different build results on different machines, follow this diagnostic guide.\u003c/p\u003e\n\u003ch2 id=\"quick-fix\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Fix\u003c/span\u003e \u003ca href=\"#quick-fix\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOn the machine with issues, run:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e ~/git/markata-go  \u003cspan class=\"c1\"\u003e# or your repo location\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./scripts/clean-rebuild.sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"root-causes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRoot Causes\u003c/span\u003e \u003ca href=\"#root-causes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"1-go-build-cache-most-common\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e1. Go Build Cache (Most Common)\u003c/span\u003e \u003ca href=\"#1-go-build-cache-most-common\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eProblem\u003c/strong\u003e: Templates are embedded into the binary at compile time via \u003ccode\u003e//go:embed\u003c/code\u003e. Go\u0026rsquo;s build cache can serve stale compiled objects even after template files change.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSymptoms\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOld templates appear in output\u003c/li\u003e\n\u003cli\u003eChanges to \u003ccode\u003epkg/themes/default/templates/\u003c/code\u003e don\u0026rsquo;t take effect\u003c/li\u003e\n\u003cli\u003eRebuilding with \u003ccode\u003ego build\u003c/code\u003e doesn\u0026rsquo;t help\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eSolution\u003c/strong\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego clean -cache\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego install -a ./cmd/markata-go\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe \u003ccode\u003e-a\u003c/code\u003e flag forces Go to rebuild \u003cstrong\u003eall\u003c/strong\u003e packages, ignoring the cache.\u003c/p\u003e\n\u003ch3 id=\"2-markata-build-cache\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e2. Markata Build Cache\u003c/span\u003e \u003ca href=\"#2-markata-build-cache\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eProblem\u003c/strong\u003e: The \u003ccode\u003e.markata/\u003c/code\u003e directory caches rendered HTML to speed up incremental builds.\u003c/p\u003e\n\u003cp\u003eUnchanged pages, including published frontmatter-only pages, restore their\ncached full-page HTML before the write stage. If you recreate the output\ndirectory while keeping \u003ccode\u003e.markata/\u003c/code\u003e, a normal or \u003ccode\u003e--fast\u003c/code\u003e build can materialize\nthose pages again without clearing the build cache.\u003c/p\u003e\n\u003cp\u003eThe cache also hashes the embedded default theme templates. A new builder image\nthat changes those templates invalidates cached pages on its next build.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSymptoms\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRemoving templates but still seeing cached output\u003c/li\u003e\n\u003cli\u003eTemplate changes not reflected in output\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eSolution\u003c/strong\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erm -rf .markata\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCurrent releases should still detect moved or deleted content files during \u003ccode\u003emarkata-go build --fast\u003c/code\u003e.\nIf a moved-file error only goes away after clearing \u003ccode\u003e.markata/\u003c/code\u003e, you are likely hitting an older\nbuild-cache bug rather than expected behavior.\u003c/p\u003e\n\u003ch3 id=\"3-config-file-differences\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e3. Config File Differences\u003c/span\u003e \u003ca href=\"#3-config-file-differences\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eProblem\u003c/strong\u003e: \u003ccode\u003emarkata-go.toml\u003c/code\u003e points to wrong templates or has different settings.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eExample Issue\u003c/strong\u003e: Config pointed to old \u003ccode\u003epartials/card.html\u003c/code\u003e instead of new \u003ccode\u003epartials/cards/card-router.html\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCheck git status: \u003ccode\u003egit status\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eCompare configs: \u003ccode\u003ediff markata-go.toml \u0026lt;(git show HEAD:markata-go.toml)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse diagnostic script: \u003ccode\u003e./scripts/diagnose-build.sh\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"4-different-git-commits\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e4. Different Git Commits\u003c/span\u003e \u003ca href=\"#4-different-git-commits\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eProblem\u003c/strong\u003e: Machines are on different branches or commits.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSymptoms\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBinary checksums differ\u003c/li\u003e\n\u003cli\u003eTemplate checksums differ\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eSolution\u003c/strong\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit status\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit log -1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit pull origin main  \u003cspan class=\"c1\"\u003e# or your branch\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"diagnostic-tools\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDiagnostic Tools\u003c/span\u003e \u003ca href=\"#diagnostic-tools\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"full-diagnostic\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFull Diagnostic\u003c/span\u003e \u003ca href=\"#full-diagnostic\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eRun this on both machines and compare output:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./scripts/diagnose-build.sh \u0026gt; ~/diagnostic.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecat ~/diagnostic.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eKey things to compare\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eGit commit hash\u003c/li\u003e\n\u003cli\u003eBinary SHA256 checksum\u003c/li\u003e\n\u003cli\u003eTemplate checksums (embedded vs project overrides)\u003c/li\u003e\n\u003cli\u003eConfig file checksum\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"clean-rebuild\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eClean Rebuild\u003c/span\u003e \u003ca href=\"#clean-rebuild\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse the automated clean rebuild script:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./scripts/clean-rebuild.sh\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis script:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eChecks git status\u003c/li\u003e\n\u003cli\u003eCleans Go cache\u003c/li\u003e\n\u003cli\u003eRemoves old binaries\u003c/li\u003e\n\u003cli\u003eRemoves markata caches\u003c/li\u003e\n\u003cli\u003eShows template checksums\u003c/li\u003e\n\u003cli\u003eRebuilds and installs binary\u003c/li\u003e\n\u003cli\u003eVerifies installation\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"expected-checksums-as-of-commit-bfa19d0\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExpected Checksums (as of commit bfa19d0)\u003c/span\u003e \u003ca href=\"#expected-checksums-as-of-commit-bfa19d0\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eBinary\u003c/strong\u003e:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eSHA256: 72393651937484c022ced092a80f5171353d8bc49320453a58a187ed1b168bcb\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eKey Templates\u003c/strong\u003e (embedded in \u003ccode\u003epkg/themes/default/templates/\u003c/code\u003e):\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003earticle-card.html: b9a26a3dbbec42e00aaea791772de29c4c1060cb1cd6047b4a8bf9e30e158d23\nfeed.html:         b4a5cab1c989446d62240e9e98126dc2dfc62accadc86775a2757c69788ad63a\ncard-router.html:  12c02e186b2ca95f9c65187f91661a2da994984895bcaf4d2cfea89658835627\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eConfig\u003c/strong\u003e:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emarkata-go.toml: a01e140d4788d732dddc1eb90f57b183781ebcbcbda78c90389eadf3e0691c9d\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"card-system\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCard System\u003c/span\u003e \u003ca href=\"#card-system\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"why-no-card-types-appear\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhy No Card Types Appear\u003c/span\u003e \u003ca href=\"#why-no-card-types-appear\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe card router (\u003ccode\u003epartials/cards/card-router.html\u003c/code\u003e) selects card templates based on the post\u0026rsquo;s \u003ccode\u003etemplate\u003c/code\u003e field:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eMy Note\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enote \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# This determines the card type!\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCard types\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003earticle\u003c/code\u003e, \u003ccode\u003eblog-post\u003c/code\u003e, \u003ccode\u003epost\u003c/code\u003e, \u003ccode\u003eessay\u003c/code\u003e, \u003ccode\u003etutorial\u003c/code\u003e → article-card.html\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enote\u003c/code\u003e, \u003ccode\u003eping\u003c/code\u003e, \u003ccode\u003ethought\u003c/code\u003e, \u003ccode\u003estatus\u003c/code\u003e, \u003ccode\u003etweet\u003c/code\u003e → note-card.html\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ephoto\u003c/code\u003e, \u003ccode\u003eshot\u003c/code\u003e, \u003ccode\u003eshots\u003c/code\u003e, \u003ccode\u003eimage\u003c/code\u003e, \u003ccode\u003egallery\u003c/code\u003e → photo-card.html\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evideo\u003c/code\u003e, \u003ccode\u003eclip\u003c/code\u003e, \u003ccode\u003ecast\u003c/code\u003e, \u003ccode\u003estream\u003c/code\u003e → video-card.html\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elink\u003c/code\u003e, \u003ccode\u003ebookmark\u003c/code\u003e, \u003ccode\u003estars\u003c/code\u003e → link-card.html\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003equote\u003c/code\u003e, \u003ccode\u003equotation\u003c/code\u003e → quote-card.html\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eguide\u003c/code\u003e, \u003ccode\u003eseries\u003c/code\u003e, \u003ccode\u003estep\u003c/code\u003e, \u003ccode\u003echapter\u003c/code\u003e → guide-card.html\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egratitude\u003c/code\u003e, \u003ccode\u003einline\u003c/code\u003e, \u003ccode\u003emicro\u003c/code\u003e, \u003ccode\u003etil\u003c/code\u003e → inline-card.html\u003c/li\u003e\n\u003cli\u003e(no template field) → default-card.html\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eTo get different card types\u003c/strong\u003e, add \u003ccode\u003etemplate:\u003c/code\u003e to your post frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Quick Thought\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enote\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2026-01-30\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"workflow-for-updates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWorkflow for Updates\u003c/span\u003e \u003ca href=\"#workflow-for-updates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen you update templates:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 1. Edit templates in pkg/themes/default/templates/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evim pkg/themes/default/templates/feed.html\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 2. Force rebuild to pick up embedded file changes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego clean -cache\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego install -a ./cmd/markata-go\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 3. Clean build\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erm -rf .markata public\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"related-files\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRelated Files\u003c/span\u003e \u003ca href=\"#related-files\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003epkg/themes/embed.go\u003c/code\u003e - Embeds default templates into binary\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epkg/templates/engine.go\u003c/code\u003e - Template loading order\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go.toml\u003c/code\u003e - Config including feed card template\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etemplates/partials/cards/card-router.html\u003c/code\u003e - Card type router\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/templates/\"\u003eTemplates Guide\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/feeds/\"\u003eFeeds Guide\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/frontmatter/\"\u003eFrontmatter Reference\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nIf you're getting different build results on different machines, follow this diagnostic guide.\n\n## Quick Fix\n\nOn the machine with issues, run:\n\n```bash\ncd ~/git/markata-go  # or your repo location\n./scripts/clean-rebuild.sh\nmarkata-go build --clean\n```\n\n## Root Causes\n\n### 1. Go Build Cache (Most Common)\n\n**Problem**: Templates are embedded into the binary at compile time via `//go:embed`. Go's build cache can serve stale compiled objects even after template files change.\n\n**Symptoms**:\n- Old templates appear in output\n- Changes to `pkg/themes/default/templates/` don't take effect\n- Rebuilding with `go build` doesn't help\n\n**Solution**:\n```bash\ngo clean -cache\ngo install -a ./cmd/markata-go\n```\n\nThe `-a` flag forces Go to rebuild **all** packages, ignoring the cache.\n\n### 2. Markata Build Cache\n\n**Problem**: The `.markata/` directory caches rendered HTML to speed up incremental builds.\n\nUnchanged pages, including published frontmatter-only pages, restore their\ncached full-page HTML before the write stage. If you recreate the output\ndirectory while keeping `.markata/`, a normal or `--fast` build can materialize\nthose pages again without clearing the build cache.\n\nThe cache also hashes the embedded default theme templates. A new builder image\nthat changes those templates invalidates cached pages on its next build.\n\n**Symptoms**:\n- Removing templates but still seeing cached output\n- Template changes not reflected in output\n\n**Solution**:\n```bash\nrm -rf .markata\nmarkata-go build --clean\n```\n\nCurrent releases should still detect moved or deleted content files during `markata-go build --fast`.\nIf a moved-file error only goes away after clearing `.markata/`, you are likely hitting an older\nbuild-cache bug rather than expected behavior.\n\n### 3. Config File Differences\n\n**Problem**: `markata-go.toml` points to wrong templates or has different settings.\n\n**Example Issue**: Config pointed to old `partials/card.html` instead of new `partials/cards/card-router.html`.\n\n**Solution**:\n- Check git status: `git status`\n- Compare configs: `diff markata-go.toml \u003c(git show HEAD:markata-go.toml)`\n- Use diagnostic script: `./scripts/diagnose-build.sh`\n\n### 4. Different Git Commits\n\n**Problem**: Machines are on different branches or commits.\n\n**Symptoms**:\n- Binary checksums differ\n- Template checksums differ\n\n**Solution**:\n```bash\ngit status\ngit log -1\ngit pull origin main  # or your branch\n```\n\n## Diagnostic Tools\n\n### Full Diagnostic\n\nRun this on both machines and compare output:\n\n```bash\n./scripts/diagnose-build.sh \u003e ~/diagnostic.txt\ncat ~/diagnostic.txt\n```\n\n**Key things to compare**:\n- Git commit hash\n- Binary SHA256 checksum\n- Template checksums (embedded vs project overrides)\n- Config file checksum\n\n### Clean Rebuild\n\nUse the automated clean rebuild script:\n\n```bash\n./scripts/clean-rebuild.sh\n```\n\nThis script:\n1. Checks git status\n2. Cleans Go cache\n3. Removes old binaries\n4. Removes markata caches\n5. Shows template checksums\n6. Rebuilds and installs binary\n7. Verifies installation\n\n## Expected Checksums (as of commit bfa19d0)\n\n**Binary**:\n```\nSHA256: 72393651937484c022ced092a80f5171353d8bc49320453a58a187ed1b168bcb\n```\n\n**Key Templates** (embedded in `pkg/themes/default/templates/`):\n```\narticle-card.html: b9a26a3dbbec42e00aaea791772de29c4c1060cb1cd6047b4a8bf9e30e158d23\nfeed.html:         b4a5cab1c989446d62240e9e98126dc2dfc62accadc86775a2757c69788ad63a\ncard-router.html:  12c02e186b2ca95f9c65187f91661a2da994984895bcaf4d2cfea89658835627\n```\n\n**Config**:\n```\nmarkata-go.toml: a01e140d4788d732dddc1eb90f57b183781ebcbcbda78c90389eadf3e0691c9d\n```\n\n## Card System\n\n### Why No Card Types Appear\n\nThe card router (`partials/cards/card-router.html`) selects card templates based on the post's `template` field:\n\n```yaml\n---\ntitle: My Note\ntemplate: note  # This determines the card type!\n---\n```\n\n**Card types**:\n- `article`, `blog-post`, `post`, `essay`, `tutorial` → article-card.html\n- `note`, `ping`, `thought`, `status`, `tweet` → note-card.html\n- `photo`, `shot`, `shots`, `image`, `gallery` → photo-card.html\n- `video`, `clip`, `cast`, `stream` → video-card.html\n- `link`, `bookmark`, `stars` → link-card.html\n- `quote`, `quotation` → quote-card.html\n- `guide`, `series`, `step`, `chapter` → guide-card.html\n- `gratitude`, `inline`, `micro`, `til` → inline-card.html\n- (no template field) → default-card.html\n\n**To get different card types**, add `template:` to your post frontmatter:\n\n```yaml\n---\ntitle: \"Quick Thought\"\ntemplate: note\ndate: 2026-01-30\n---\n```\n\n## Workflow for Updates\n\nWhen you update templates:\n\n```bash\n# 1. Edit templates in pkg/themes/default/templates/\nvim pkg/themes/default/templates/feed.html\n\n# 2. Force rebuild to pick up embedded file changes\ngo clean -cache\ngo install -a ./cmd/markata-go\n\n# 3. Clean build\nrm -rf .markata public\nmarkata-go build --clean\n```\n\n## Related Files\n\n- `pkg/themes/embed.go` - Embeds default templates into binary\n- `pkg/templates/engine.go` - Template loading order\n- `markata-go.toml` - Config including feed card template\n- `templates/partials/cards/card-router.html` - Card type router\n\n## See Also\n\n- [Templates Guide](/docs/guides/templates/)\n- [Feeds Guide](/docs/guides/feeds/)\n- [Frontmatter Reference](/docs/guides/frontmatter/)\n",
      "summary": "How to fix issues when builds produce different results on different machines",
      "date_published": "2026-01-30T00:00:00Z",
      "date_modified": "2026-01-30T00:00:00Z",
      "tags": [
        "troubleshooting",
        "build",
        "cache"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/cards/",
      "url": "https://markata.dev/docs/guides/cards/",
      "title": "Card Types",
      "content_html": "\u003cp\u003eCards are how posts appear in feed listings. Different types of content benefit from different visual treatments - a photo post should emphasize the image, while a blog post should show the title and excerpt.\u003c/p\u003e\n\u003ch2 id=\"how-cards-are-selected\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow Cards Are Selected\u003c/span\u003e \u003ca href=\"#how-cards-are-selected\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCards are selected based on the \u003ccode\u003etemplate\u003c/code\u003e frontmatter field:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Photo\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ephoto\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eNote:\u003c/strong\u003e \u003ccode\u003etemplateKey\u003c/code\u003e is supported as an alias for backwards compatibility with Python markata.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe \u003ccode\u003etemplate\u003c/code\u003e field determines:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eWhich \u003cstrong\u003ecard template\u003c/strong\u003e renders the post in feeds\u003c/li\u003e\n\u003cli\u003eWhich \u003cstrong\u003epage template\u003c/strong\u003e renders the full post (if defined)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"field-name-comparison\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eField Name Comparison\u003c/span\u003e \u003ca href=\"#field-name-comparison\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go uses \u003ccode\u003etemplate\u003c/code\u003e as the primary field, following Zola and Pelican conventions:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSSG\u003c/th\u003e\n\u003cth\u003eField Name\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eHugo, Jekyll, Eleventy, Astro\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003elayout\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eZola, Pelican, \u003cstrong\u003emarkata-go\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etemplate\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eBoth \u003ccode\u003etemplate\u003c/code\u003e and \u003ccode\u003etemplateKey\u003c/code\u003e work in markata-go frontmatter.\u003c/p\u003e\n\u003ch2 id=\"card-types\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCard Types\u003c/span\u003e \u003ca href=\"#card-types\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCard Type\u003c/th\u003e\n\u003cth\u003etemplate Values\u003c/th\u003e\n\u003cth\u003eBest For\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003earticle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eblog-post\u003c/code\u003e, \u003ccode\u003earticle\u003c/code\u003e, \u003ccode\u003epost\u003c/code\u003e, \u003ccode\u003eessay\u003c/code\u003e, \u003ccode\u003etutorial\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLong-form content with title, excerpt, tags\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enote\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003enote\u003c/code\u003e, \u003ccode\u003eping\u003c/code\u003e, \u003ccode\u003ethought\u003c/code\u003e, \u003ccode\u003estatus\u003c/code\u003e, \u003ccode\u003etweet\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShort thoughts, micro-posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ephoto\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ephoto\u003c/code\u003e, \u003ccode\u003eshot\u003c/code\u003e, \u003ccode\u003eshots\u003c/code\u003e, \u003ccode\u003eimage\u003c/code\u003e, \u003ccode\u003egallery\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eImage-focused posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003evideo\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003evideo\u003c/code\u003e, \u003ccode\u003eclip\u003c/code\u003e, \u003ccode\u003ecast\u003c/code\u003e, \u003ccode\u003estream\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eVideo content with thumbnail\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elink\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003elink\u003c/code\u003e, \u003ccode\u003ebookmark\u003c/code\u003e, \u003ccode\u003estars\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eExternal links, bookmarks\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003equote\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003equote\u003c/code\u003e, \u003ccode\u003equotation\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eQuoted text with attribution\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eguide\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eguide\u003c/code\u003e, \u003ccode\u003eseries\u003c/code\u003e, \u003ccode\u003estep\u003c/code\u003e, \u003ccode\u003echapter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMulti-part tutorials\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einline\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003egratitude\u003c/code\u003e, \u003ccode\u003einline\u003c/code\u003e, \u003ccode\u003emicro\u003c/code\u003e, \u003ccode\u003etil\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFull content shown in feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econtact\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003econtact\u003c/code\u003e, \u003ccode\u003echaracter\u003c/code\u003e, \u003ccode\u003eperson\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePerson/character profile cards\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edefault\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e(any other value)\u003c/td\u003e\n\u003ctd\u003eFallback for unmapped types\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"linked-posts-and-source-previews\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLinked posts and source previews\u003c/span\u003e \u003ca href=\"#linked-posts-and-source-previews\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA \u003ccode\u003elink\u003c/code\u003e, \u003ccode\u003ebookmark\u003c/code\u003e, \u003ccode\u003estars\u003c/code\u003e, or \u003ccode\u003etil\u003c/code\u003e post with a \u003ccode\u003elink\u003c/code\u003e or \u003ccode\u003eurl\u003c/code\u003e\nfrontmatter destination preserves its local permalink and shows a visible\n\u003cstrong\u003eSource\u003c/strong\u003e link on the post page. Feed cards also link to the external domain.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Worth watching\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elink\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://www.youtube.com/watch?v=R_uf5OfMGio\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003eMy thoughts on the video.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe destination is automatically embedded before your commentary through\nthe normal external embed system. YouTube uses the site\u0026rsquo;s Lite YouTube\nrenderer; other URLs use cached oEmbed/Open Graph previews and fall back to\na clickable source card when metadata is unavailable. No new Markdown is\nrequired. Explicit \u003ccode\u003e![embed](url)\u003c/code\u003e or \u003ccode\u003e\u0026lt;!-- embed not found: url --\u0026gt; ![[url]]\u003c/code\u003e in the body is not\nduplicated. Leave the \u003ccode\u003elink\u003c/code\u003e/\u003ccode\u003eurl\u003c/code\u003e field unset if the post is not sharing\nan external destination.\u003c/p\u003e\n\u003ch2 id=\"card-anatomy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCard Anatomy\u003c/span\u003e \u003ca href=\"#card-anatomy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEach card type has different visual elements:\u003c/p\u003e\n\u003ch3 id=\"article-card\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eArticle Card\u003c/span\u003e \u003ca href=\"#article-card\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLarge title (linked)\u003c/li\u003e\n\u003cli\u003eContent excerpt (first 3 paragraphs or 1500 characters)\u003c/li\u003e\n\u003cli\u003eDate, reading time\u003c/li\u003e\n\u003cli\u003eTags\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"note-card\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNote Card\u003c/span\u003e \u003ca href=\"#note-card\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eCompact layout with left accent border\u003c/li\u003e\n\u003cli\u003eTitle (optional)\u003c/li\u003e\n\u003cli\u003eShort text content\u003c/li\u003e\n\u003cli\u003eDate\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"photo-card\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePhoto Card\u003c/span\u003e \u003ca href=\"#photo-card\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLarge image (16:9 aspect ratio)\u003c/li\u003e\n\u003cli\u003eCaption below\u003c/li\u003e\n\u003cli\u003eDate\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"inline-card\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInline Card\u003c/span\u003e \u003ca href=\"#inline-card\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFull \u003ccode\u003earticle_html\u003c/code\u003e content rendered in the feed\u003c/li\u003e\n\u003cli\u003eNo \u0026ldquo;read more\u0026rdquo; - everything is visible\u003c/li\u003e\n\u003cli\u003eUseful for gratitude journals, micro-posts\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"link-card\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLink Card\u003c/span\u003e \u003ca href=\"#link-card\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDomain indicator\u003c/li\u003e\n\u003cli\u003eTitle and description\u003c/li\u003e\n\u003cli\u003eExternal link styling\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"contact-card\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContact Card\u003c/span\u003e \u003ca href=\"#contact-card\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAvatar (from \u003ccode\u003eavatar\u003c/code\u003e, \u003ccode\u003eimage\u003c/code\u003e, or \u003ccode\u003eicon\u003c/code\u003e frontmatter fields)\u003c/li\u003e\n\u003cli\u003eName (post title)\u003c/li\u003e\n\u003cli\u003eHandle (\u003ccode\u003e@handle\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eShort bio (description)\u003c/li\u003e\n\u003cli\u003eExternal site link (from \u003ccode\u003eurl\u003c/code\u003e frontmatter field, if set)\u003c/li\u003e\n\u003cli\u003eTags\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"default-card-images\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDefault Card Images\u003c/span\u003e \u003ca href=\"#default-card-images\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePosts without a mapped \u003ccode\u003etemplate\u003c/code\u003e use the default card. If the frontmatter\ncontains \u003ccode\u003eimage\u003c/code\u003e, \u003ccode\u003ecover\u003c/code\u003e, \u003ccode\u003ecover_image\u003c/code\u003e, or \u003ccode\u003eog_image\u003c/code\u003e, the card displays that\nmedia in a cinematic 12:5 frame. The source uses width-only sizing so the CDN\ndoes not distort the image; CSS crops it with \u003ccode\u003eobject-fit: cover\u003c/code\u003e so portrait\nimages do not make daily note cards too tall.\u003c/p\u003e\n\u003ch2 id=\"examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"blog-post-article-card\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBlog Post (article card)\u003c/span\u003e \u003ca href=\"#blog-post-article-card\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Understanding Go Interfaces\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eblog-post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ego\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003eprogramming\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003eYour article content here. The first three paragraphs (or up to 1500 characters) will automatically be shown as the excerpt in feed listings.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"quick-thought-note-card\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Thought (note card)\u003c/span\u003e \u003ca href=\"#quick-thought-note-card\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Ping 42\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eping\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003eJust discovered that vim has a built-in terminal. Mind blown.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"photo-photo-card\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePhoto (photo card)\u003c/span\u003e \u003ca href=\"#photo-photo-card\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Sunset at the Beach\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eshots\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/images/sunset.jpg\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"gratitude-entry-inline-card\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGratitude Entry (inline card)\u003c/span\u003e \u003ca href=\"#gratitude-entry-inline-card\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egratitude\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003eToday I\u0026#39;m grateful for good coffee and working CI pipelines.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"configuring-excerpts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguring Excerpts\u003c/span\u003e \u003ca href=\"#configuring-excerpts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eArticle cards automatically show an excerpt from your content - the first 3 paragraphs or 1500 characters, whichever is shorter.\u003c/p\u003e\n\u003ch3 id=\"default-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDefault Behavior\u003c/span\u003e \u003ca href=\"#default-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBy default, article cards extract:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eUp to 3 paragraphs\u003c/strong\u003e from your rendered HTML content\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOR up to 1500 characters\u003c/strong\u003e (whichever comes first)\u003c/li\u003e\n\u003cli\u003eWith intelligent truncation at word boundaries\u003c/li\u003e\n\u003cli\u003eAn ellipsis (\u003ccode\u003e...\u003c/code\u003e) is added when content is truncated\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"how-it-works\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow It Works\u003c/span\u003e \u003ca href=\"#how-it-works\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eThe \u003ccode\u003eexcerpt\u003c/code\u003e filter extracts \u003ccode\u003e\u0026lt;p\u0026gt;\u003c/code\u003e tags from your rendered \u003ccode\u003earticle_html\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eIt collects paragraphs until reaching 3 paragraphs OR 1500 characters\u003c/li\u003e\n\u003cli\u003eIt strips inner HTML tags but preserves text\u003c/li\u003e\n\u003cli\u003eIt adds ellipsis (\u003ccode\u003e...\u003c/code\u003e) if content was truncated\u003c/li\u003e\n\u003cli\u003eOutput is safe HTML ready to render\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"tips\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTips\u003c/span\u003e \u003ca href=\"#tips\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eShort posts:\u003c/strong\u003e If your post is shorter than the limit, the entire post shows (no ellipsis)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNo paragraphs:\u003c/strong\u003e If content has no \u003ccode\u003e\u0026lt;p\u0026gt;\u003c/code\u003e tags, the filter falls back to plain text truncation\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRemoval of description:\u003c/strong\u003e The old \u003ccode\u003edescription\u003c/code\u003e frontmatter field is no longer used for article cards - excerpts are auto-generated from content\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"customizing-cards\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustomizing Cards\u003c/span\u003e \u003ca href=\"#customizing-cards\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTo override a built-in card, create a file in your site\u0026rsquo;s \u003ccode\u003etemplates/partials/cards/\u003c/code\u003e directory:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003etemplates/\n  partials/\n    cards/\n      article-card.html   # Overrides built-in article card\n      my-custom-card.html # New card type\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eTo add a new card type, create a custom \u003ccode\u003ecard-router.html\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% elif post.template == \u0026#34;my-type\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% include \u0026#34;partials/cards/my-custom-card.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"card-css\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCard CSS\u003c/span\u003e \u003ca href=\"#card-css\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCard styles are in \u003ccode\u003ethemes/default/static/css/cards.css\u003c/code\u003e. Each card has a class:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e.card-article\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.card-note\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.card-photo\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.card-video\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.card-link\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.card-quote\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.card-guide\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.card-inline\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.card-contact\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.card-default\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"how-it-works-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow It Works\u003c/span\u003e \u003ca href=\"#how-it-works-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eFeed template (\u003ccode\u003efeed.html\u003c/code\u003e) loops through posts\u003c/li\u003e\n\u003cli\u003eFor each post, includes \u003ccode\u003epartials/cards/card-router.html\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eCard router checks \u003ccode\u003epost.template\u003c/code\u003e and includes the matching card template\u003c/li\u003e\n\u003cli\u003eCard template renders the post with appropriate HTML structure\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- feed.html --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for post in page.posts %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% include \u0026#34;partials/cards/card-router.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- card-router.html --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.template == \u0026#34;blog-post\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% include \u0026#34;partials/cards/article-card.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% elif post.template == \u0026#34;ping\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% include \u0026#34;partials/cards/note-card.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"template-access-in-custom-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Access in Custom Templates\u003c/span\u003e \u003ca href=\"#template-access-in-custom-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIn your templates, you can access the template value via either name:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# Both work - template is preferred #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ post.template }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ post.templateKey }}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n\nCards are how posts appear in feed listings. Different types of content benefit from different visual treatments - a photo post should emphasize the image, while a blog post should show the title and excerpt.\n\n## How Cards Are Selected\n\nCards are selected based on the `template` frontmatter field:\n\n```yaml\n---\ntitle: \"My Photo\"\ntemplate: photo\n---\n```\n\n\u003e **Note:** `templateKey` is supported as an alias for backwards compatibility with Python markata.\n\nThe `template` field determines:\n1. Which **card template** renders the post in feeds\n2. Which **page template** renders the full post (if defined)\n\n## Field Name Comparison\n\nmarkata-go uses `template` as the primary field, following Zola and Pelican conventions:\n\n| SSG | Field Name |\n|-----|------------|\n| Hugo, Jekyll, Eleventy, Astro | `layout` |\n| Zola, Pelican, **markata-go** | `template` |\n\nBoth `template` and `templateKey` work in markata-go frontmatter.\n\n## Card Types\n\n| Card Type | template Values | Best For |\n|-----------|-----------------|----------|\n| `article` | `blog-post`, `article`, `post`, `essay`, `tutorial` | Long-form content with title, excerpt, tags |\n| `note` | `note`, `ping`, `thought`, `status`, `tweet` | Short thoughts, micro-posts |\n| `photo` | `photo`, `shot`, `shots`, `image`, `gallery` | Image-focused posts |\n| `video` | `video`, `clip`, `cast`, `stream` | Video content with thumbnail |\n| `link` | `link`, `bookmark`, `stars` | External links, bookmarks |\n| `quote` | `quote`, `quotation` | Quoted text with attribution |\n| `guide` | `guide`, `series`, `step`, `chapter` | Multi-part tutorials |\n| `inline` | `gratitude`, `inline`, `micro`, `til` | Full content shown in feed |\n| `contact` | `contact`, `character`, `person` | Person/character profile cards |\n| `default` | (any other value) | Fallback for unmapped types |\n\n## Linked posts and source previews\n\nA `link`, `bookmark`, `stars`, or `til` post with a `link` or `url`\nfrontmatter destination preserves its local permalink and shows a visible\n**Source** link on the post page. Feed cards also link to the external domain.\n\n```yaml\n---\ntitle: \"Worth watching\"\ntemplate: link\nlink: \"https://www.youtube.com/watch?v=R_uf5OfMGio\"\npublished: true\n---\n\nMy thoughts on the video.\n```\n\nThe destination is automatically embedded before your commentary through\nthe normal external embed system. YouTube uses the site's Lite YouTube\nrenderer; other URLs use cached oEmbed/Open Graph previews and fall back to\na clickable source card when metadata is unavailable. No new Markdown is\nrequired. Explicit `![embed](url)` or `\u003c!-- embed not found: url --\u003e\n![[url]]` in the body is not\nduplicated. Leave the `link`/`url` field unset if the post is not sharing\nan external destination.\n\n## Card Anatomy\n\nEach card type has different visual elements:\n\n### Article Card\n- Large title (linked)\n- Content excerpt (first 3 paragraphs or 1500 characters)\n- Date, reading time\n- Tags\n\n### Note Card\n- Compact layout with left accent border\n- Title (optional)\n- Short text content\n- Date\n\n### Photo Card\n- Large image (16:9 aspect ratio)\n- Caption below\n- Date\n\n### Inline Card\n- Full `article_html` content rendered in the feed\n- No \"read more\" - everything is visible\n- Useful for gratitude journals, micro-posts\n\n### Link Card\n- Domain indicator\n- Title and description\n- External link styling\n\n### Contact Card\n- Avatar (from `avatar`, `image`, or `icon` frontmatter fields)\n- Name (post title)\n- Handle (`@handle`)\n- Short bio (description)\n- External site link (from `url` frontmatter field, if set)\n- Tags\n\n### Default Card Images\n\nPosts without a mapped `template` use the default card. If the frontmatter\ncontains `image`, `cover`, `cover_image`, or `og_image`, the card displays that\nmedia in a cinematic 12:5 frame. The source uses width-only sizing so the CDN\ndoes not distort the image; CSS crops it with `object-fit: cover` so portrait\nimages do not make daily note cards too tall.\n\n## Examples\n\n### Blog Post (article card)\n```yaml\n---\ntitle: \"Understanding Go Interfaces\"\ntemplate: blog-post\ntags:\n  - go\n  - programming\n---\n\nYour article content here. The first three paragraphs (or up to 1500 characters) will automatically be shown as the excerpt in feed listings.\n```\n\n### Quick Thought (note card)\n```yaml\n---\ntitle: \"Ping 42\"\ntemplate: ping\n---\n\nJust discovered that vim has a built-in terminal. Mind blown.\n```\n\n### Photo (photo card)\n```yaml\n---\ntitle: \"Sunset at the Beach\"\ntemplate: shots\nimage: /images/sunset.jpg\n---\n```\n\n### Gratitude Entry (inline card)\n```yaml\n---\ntemplate: gratitude\n---\n\nToday I'm grateful for good coffee and working CI pipelines.\n```\n\n## Configuring Excerpts\n\nArticle cards automatically show an excerpt from your content - the first 3 paragraphs or 1500 characters, whichever is shorter.\n\n### Default Behavior\n\nBy default, article cards extract:\n- **Up to 3 paragraphs** from your rendered HTML content\n- **OR up to 1500 characters** (whichever comes first)\n- With intelligent truncation at word boundaries\n- An ellipsis (`...`) is added when content is truncated\n\n### How It Works\n\n1. The `excerpt` filter extracts `\u003cp\u003e` tags from your rendered `article_html`\n2. It collects paragraphs until reaching 3 paragraphs OR 1500 characters\n3. It strips inner HTML tags but preserves text\n4. It adds ellipsis (`...`) if content was truncated\n5. Output is safe HTML ready to render\n\n### Tips\n\n- **Short posts:** If your post is shorter than the limit, the entire post shows (no ellipsis)\n- **No paragraphs:** If content has no `\u003cp\u003e` tags, the filter falls back to plain text truncation\n- **Removal of description:** The old `description` frontmatter field is no longer used for article cards - excerpts are auto-generated from content\n\n## Customizing Cards\n\nTo override a built-in card, create a file in your site's `templates/partials/cards/` directory:\n\n```\ntemplates/\n  partials/\n    cards/\n      article-card.html   # Overrides built-in article card\n      my-custom-card.html # New card type\n```\n\nTo add a new card type, create a custom `card-router.html`:\n\n```html\n{% elif post.template == \"my-type\" %}\n{% include \"partials/cards/my-custom-card.html\" %}\n```\n\n## Card CSS\n\nCard styles are in `themes/default/static/css/cards.css`. Each card has a class:\n\n- `.card-article`\n- `.card-note`\n- `.card-photo`\n- `.card-video`\n- `.card-link`\n- `.card-quote`\n- `.card-guide`\n- `.card-inline`\n- `.card-contact`\n- `.card-default`\n\n## How It Works\n\n1. Feed template (`feed.html`) loops through posts\n2. For each post, includes `partials/cards/card-router.html`\n3. Card router checks `post.template` and includes the matching card template\n4. Card template renders the post with appropriate HTML structure\n\n```html\n\u003c!-- feed.html --\u003e\n{% for post in page.posts %}\n{% include \"partials/cards/card-router.html\" %}\n{% endfor %}\n```\n\n```html\n\u003c!-- card-router.html --\u003e\n{% if post.template == \"blog-post\" %}\n{% include \"partials/cards/article-card.html\" %}\n{% elif post.template == \"ping\" %}\n{% include \"partials/cards/note-card.html\" %}\n...\n{% endif %}\n```\n\n## Template Access in Custom Templates\n\nIn your templates, you can access the template value via either name:\n\n```html\n{# Both work - template is preferred #}\n{{ post.template }}\n{{ post.templateKey }}\n```\n",
      "summary": "How posts are displayed differently in feeds based on their template type",
      "date_published": "2026-01-29T00:00:00Z",
      "date_modified": "2026-01-29T00:00:00Z",
      "tags": [
        "templates",
        "feeds",
        "cards"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/standard-txt-files/",
      "url": "https://markata.dev/docs/guides/standard-txt-files/",
      "title": "Standard Web Txt Files",
      "content_html": "\u003cp\u003emarkata-go supports generating standard web txt files at their expected canonical URLs. This enables creating files like \u003ccode\u003erobots.txt\u003c/code\u003e, \u003ccode\u003ellms.txt\u003c/code\u003e, and \u003ccode\u003ehumans.txt\u003c/code\u003e that web crawlers, AI models, and humans expect to find at the root of your site.\u003c/p\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eText format is enabled by default\u003c/strong\u003e - no configuration needed\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCreate a markdown file\u003c/strong\u003e for your txt content:\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!-- robots.md --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etitle: \u0026#34;Robots\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eslug: robots\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublished: true\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUser-agent: *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAllow: /\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDisallow: /private/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e\u003cstrong\u003eBuild your site\u003c/strong\u003e - markata-go generates:\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/robots.txt\u003c/code\u003e - The canonical robots.txt file\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/robots/index.txt\u003c/code\u003e - Redirect for backwards compatibility\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/robots/index.txt/index.html\u003c/code\u003e - HTML redirect for static hosts\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"common-txt-files\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Txt Files\u003c/span\u003e \u003ca href=\"#common-txt-files\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"robots-txt\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003erobots.txt\u003c/span\u003e \u003ca href=\"#robots-txt\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe robot exclusion standard for web crawlers:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Robots\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003erobots\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUser-agent: *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAllow: /\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUser-agent: GPTBot\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDisallow: /\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSitemap: https://example.com/sitemap.xml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"llms-txt\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ellms.txt\u003c/span\u003e \u003ca href=\"#llms-txt\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBy default, a full-site build automatically creates \u003cstrong\u003e/llms.txt\u003c/strong\u003e using the\nsite title and description, links to selected published documentation and\nrecent posts, and a link to the sitemap when available. The index is capped\nat 30 pages (configurable) to keep it concise. Private, draft, skipped,\nunpublished, and \u003ccode\u003enoindex\u003c/code\u003e posts are not included. The generated links\nprefer the post\u0026rsquo;s \u003ccode\u003e.md\u003c/code\u003e version when that output format is enabled.\u003c/p\u003e\n\u003cp\u003eThis follows the \u003ca href=\"https://llmstxt.org\"\u003ellms.txt v2 proposal\u003c/a\u003e: a Markdown H1,\noptional blockquote summary, and H2 sections with Markdown links. It is a\n\u003cstrong\u003ediscovery aid\u003c/strong\u003e, not an instruction granting AI crawlers permission to\ntrain on content. Access rules belong in robots.txt and other applicable\npolicies.\u003c/p\u003e\n\u003cp\u003eExample generated output:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Example Site\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\u0026gt; \u003c/span\u003e\u003cspan class=\"ge\"\u003eNotes on software, homelabs, and photography.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Site\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eHome\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://example.com/\u003c/span\u003e): Site homepage\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Recent Content\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eA recent post\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://example.com/recent-post.md\u003c/span\u003e): A brief introduction.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Optional\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eSitemap\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://example.com/sitemap.xml\u003c/span\u003e): Complete index of publicly accessible pages\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo configure the generated index:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ellms_txt\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e       \u003cspan class=\"c\"\u003e# default; set false to disable automatic generation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_pages\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e30\u003c/span\u003e       \u003cspan class=\"c\"\u003e# default; accepted range 1-100\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eA published Markdown post with \u003ccode\u003eslug: llms\u003c/code\u003e (and text output enabled), a\n\u003ccode\u003estatic/llms.txt\u003c/code\u003e file, or an existing manually managed\n\u003ccode\u003eoutput/llms.txt\u003c/code\u003e overrides the automatic content. This preserves the\nability to write a curated index yourself. If you disable auto-generation,\nmarkata-go removes only its own previously generated file when no authored\nsource exists. Private posts with \u003ccode\u003eslug: llms\u003c/code\u003e do not override the public\nindex. Absolute links use the configured site URL only when it has no\ncredentials, query, or fragment; otherwise generated links are relative.\u003c/p\u003e\n\u003ch3 id=\"humans-txt\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ehumans.txt\u003c/span\u003e \u003ca href=\"#humans-txt\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eHuman-readable site credits (\u003ca href=\"https://humanstxt.org\"\u003ehumanstxt.org\u003c/a\u003e):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Humans\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehumans\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/* TEAM */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDeveloper: Jane Doe\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContact: jane\u003cspan class=\"ni\"\u003e@example\u003c/span\u003e.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTwitter: \u003cspan class=\"ni\"\u003e@janedoe\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLocation: San Francisco, CA\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/* SITE */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLast update: 2026/01/26\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eStandards: HTML5, CSS3\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSoftware: markata-go\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"security-txt\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003esecurity.txt\u003c/span\u003e \u003ca href=\"#security-txt\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSecurity contact information (\u003ca href=\"https://securitytxt.org\"\u003esecuritytxt.org\u003c/a\u003e):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Security\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e.well-known/security\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContact: security\u003cspan class=\"ni\"\u003e@example\u003c/span\u003e.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExpires: 2027-01-01T00:00:00.000Z\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePreferred-Languages: en\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCanonical: https://example.com/.well-known/security.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"auto-generated-well-known-entries\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuto-Generated .well-known Entries\u003c/span\u003e \u003ca href=\"#auto-generated-well-known-entries\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go can generate additional \u003ccode\u003e.well-known\u003c/code\u003e endpoints directly from your site metadata. These do not require markdown source files.\u003c/p\u003e\n\u003ch3 id=\"default-auto-generated-entries\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDefault Auto-Generated Entries\u003c/span\u003e \u003ca href=\"#default-auto-generated-entries\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/host-meta\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/host-meta.json\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/webfinger\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/nodeinfo\u003c/code\u003e and \u003ccode\u003e/nodeinfo/2.0\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/time\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewell_known\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_generate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;host-meta\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;host-meta.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;webfinger\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;nodeinfo\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Optional entries requiring config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003essh_fingerprint\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;SHA256:abcdef...\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ekeybase_username\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;username\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eNotes:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIf you set \u003ccode\u003eauto_generate = []\u003c/code\u003e, only optional entries with explicit config are generated.\u003c/li\u003e\n\u003cli\u003eTemplates live under \u003ccode\u003etemplates/well-known/\u003c/code\u003e and can be overridden.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"how-it-works\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow It Works\u003c/span\u003e \u003ca href=\"#how-it-works\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"reversed-redirects\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReversed Redirects\u003c/span\u003e \u003ca href=\"#reversed-redirects\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor \u003ccode\u003e.txt\u003c/code\u003e and \u003ccode\u003e.md\u003c/code\u003e formats, markata-go uses \u003cstrong\u003ereversed redirects\u003c/strong\u003e:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCanonical Location\u003c/th\u003e\n\u003cth\u003eRedirect From\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/robots.txt\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/robots/index.txt\u003c/code\u003e, \u003ccode\u003e/robots/index.txt/index.html\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/llms.txt\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/llms/index.txt\u003c/code\u003e, \u003ccode\u003e/llms/index.txt/index.html\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThis ensures:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eStandard files work at their expected URLs\u003c/li\u003e\n\u003cli\u003eBackwards compatibility with directory-based URLs\u003c/li\u003e\n\u003cli\u003eBoth URL styles are accessible\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"file-structure\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFile Structure\u003c/span\u003e \u003ca href=\"#file-structure\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAfter building, your output directory contains:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eoutput/\n├── robots.txt                   ← Canonical content\n├── robots/\n│   └── index.txt/\n│       └── index.html           ← HTML redirect to /robots.txt\n├── llms.txt                     ← Canonical content\n├── llms/\n│   └── index.txt/\n│       └── index.html           ← HTML redirect to /llms.txt\n└── humans.txt                   ← Canonical content\n    humans/\n    └── index.txt/\n        └── index.html           ← HTML redirect to /humans.txt\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"configuration-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eText output is enabled by default. To customize:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epost_formats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e       \u003cspan class=\"c\"\u003e# Standard HTML (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e   \u003cspan class=\"c\"\u003e# Raw markdown at /slug.md (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e       \u003cspan class=\"c\"\u003e# Plain text at /slug.txt (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eog\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e         \u003cspan class=\"c\"\u003e# OpenGraph cards (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo disable text output:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epost_formats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"text-file-format\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eText File Format\u003c/span\u003e \u003ca href=\"#text-file-format\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe plain text output includes:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eTitle\u003c/strong\u003e (underlined with \u003ccode\u003e=\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDescription\u003c/strong\u003e (if present)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDate\u003c/strong\u003e (if present)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRaw content\u003c/strong\u003e (no markdown processing)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eExample output for a post:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eMy Post Title\n=============\n\nA description of the post.\n\nDate: January 26, 2026\n\nThe actual content of the post...\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eFor standard txt files like \u003ccode\u003erobots.txt\u003c/code\u003e, keep the content minimal:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Robots\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003erobots\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUser-agent: *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAllow: /\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis generates clean output without the title/description header:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eRobots\n======\n\nUser-agent: *\nAllow: /\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"testing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTesting\u003c/span\u003e \u003ca href=\"#testing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eVerify your txt files work:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build and serve locally\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Test in another terminal\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl http://localhost:8000/robots.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl http://localhost:8000/llms.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl http://localhost:8000/humans.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Test redirects\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -L http://localhost:8000/robots/index.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/post-formats/\"\u003ePost Output Formats\u003c/a\u003e - Full guide to all output formats\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfiguration Guide\u003c/a\u003e - Complete configuration reference\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/structured-data/\"\u003eSEO Guide\u003c/a\u003e - Search engine optimization\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nmarkata-go supports generating standard web txt files at their expected canonical URLs. This enables creating files like `robots.txt`, `llms.txt`, and `humans.txt` that web crawlers, AI models, and humans expect to find at the root of your site.\n\n## Quick Start\n\n1. **Text format is enabled by default** - no configuration needed\n\n2. **Create a markdown file** for your txt content:\n\n```markdown\n\u003c!-- robots.md --\u003e\n---\ntitle: \"Robots\"\nslug: robots\npublished: true\n---\n\nUser-agent: *\nAllow: /\nDisallow: /private/\n```\n\n3. **Build your site** - markata-go generates:\n   - `/robots.txt` - The canonical robots.txt file\n   - `/robots/index.txt` - Redirect for backwards compatibility\n   - `/robots/index.txt/index.html` - HTML redirect for static hosts\n\n## Common Txt Files\n\n### robots.txt\n\nThe robot exclusion standard for web crawlers:\n\n```markdown\n---\ntitle: \"Robots\"\nslug: robots\npublished: true\n---\n\nUser-agent: *\nAllow: /\n\nUser-agent: GPTBot\nDisallow: /\n\nSitemap: https://example.com/sitemap.xml\n```\n\n### llms.txt\n\nBy default, a full-site build automatically creates **/llms.txt** using the\nsite title and description, links to selected published documentation and\nrecent posts, and a link to the sitemap when available. The index is capped\nat 30 pages (configurable) to keep it concise. Private, draft, skipped,\nunpublished, and `noindex` posts are not included. The generated links\nprefer the post's `.md` version when that output format is enabled.\n\nThis follows the [llms.txt v2 proposal](https://llmstxt.org): a Markdown H1,\noptional blockquote summary, and H2 sections with Markdown links. It is a\n**discovery aid**, not an instruction granting AI crawlers permission to\ntrain on content. Access rules belong in robots.txt and other applicable\npolicies.\n\nExample generated output:\n\n```markdown\n# Example Site\n\n\u003e Notes on software, homelabs, and photography.\n\n## Site\n\n- [Home](https://example.com/): Site homepage\n\n## Recent Content\n\n- [A recent post](https://example.com/recent-post.md): A brief introduction.\n\n## Optional\n\n- [Sitemap](https://example.com/sitemap.xml): Complete index of publicly accessible pages\n```\n\nTo configure the generated index:\n\n```toml\n[markata-go.llms_txt]\nenabled = true       # default; set false to disable automatic generation\nmax_pages = 30       # default; accepted range 1-100\n```\n\nA published Markdown post with `slug: llms` (and text output enabled), a\n`static/llms.txt` file, or an existing manually managed\n`output/llms.txt` overrides the automatic content. This preserves the\nability to write a curated index yourself. If you disable auto-generation,\nmarkata-go removes only its own previously generated file when no authored\nsource exists. Private posts with `slug: llms` do not override the public\nindex. Absolute links use the configured site URL only when it has no\ncredentials, query, or fragment; otherwise generated links are relative.\n\n### humans.txt\n\nHuman-readable site credits ([humanstxt.org](https://humanstxt.org)):\n\n```markdown\n---\ntitle: \"Humans\"\nslug: humans\npublished: true\n---\n\n/* TEAM */\nDeveloper: Jane Doe\nContact: jane@example.com\nTwitter: @janedoe\nLocation: San Francisco, CA\n\n/* SITE */\nLast update: 2026/01/26\nStandards: HTML5, CSS3\nSoftware: markata-go\n```\n\n### security.txt\n\nSecurity contact information ([securitytxt.org](https://securitytxt.org)):\n\n```markdown\n---\ntitle: \"Security\"\nslug: .well-known/security\npublished: true\n---\n\nContact: security@example.com\nExpires: 2027-01-01T00:00:00.000Z\nPreferred-Languages: en\nCanonical: https://example.com/.well-known/security.txt\n```\n\n## Auto-Generated .well-known Entries\n\nmarkata-go can generate additional `.well-known` endpoints directly from your site metadata. These do not require markdown source files.\n\n### Default Auto-Generated Entries\n\n- `/.well-known/host-meta`\n- `/.well-known/host-meta.json`\n- `/.well-known/webfinger`\n- `/.well-known/nodeinfo` and `/nodeinfo/2.0`\n- `/.well-known/time`\n\n### Configuration\n\n```toml\n[markata-go.well_known]\nenabled = true\nauto_generate = [\"host-meta\", \"host-meta.json\", \"webfinger\", \"nodeinfo\", \"time\"]\n\n# Optional entries requiring config\nssh_fingerprint = \"SHA256:abcdef...\"\nkeybase_username = \"username\"\n```\n\n**Notes:**\n- If you set `auto_generate = []`, only optional entries with explicit config are generated.\n- Templates live under `templates/well-known/` and can be overridden.\n\n## How It Works\n\n### Reversed Redirects\n\nFor `.txt` and `.md` formats, markata-go uses **reversed redirects**:\n\n| Canonical Location | Redirect From |\n|-------------------|---------------|\n| `/robots.txt` | `/robots/index.txt`, `/robots/index.txt/index.html` |\n| `/llms.txt` | `/llms/index.txt`, `/llms/index.txt/index.html` |\n\nThis ensures:\n- Standard files work at their expected URLs\n- Backwards compatibility with directory-based URLs\n- Both URL styles are accessible\n\n### File Structure\n\nAfter building, your output directory contains:\n\n```\noutput/\n├── robots.txt                   ← Canonical content\n├── robots/\n│   └── index.txt/\n│       └── index.html           ← HTML redirect to /robots.txt\n├── llms.txt                     ← Canonical content\n├── llms/\n│   └── index.txt/\n│       └── index.html           ← HTML redirect to /llms.txt\n└── humans.txt                   ← Canonical content\n    humans/\n    └── index.txt/\n        └── index.html           ← HTML redirect to /humans.txt\n```\n\n## Configuration\n\nText output is enabled by default. To customize:\n\n```toml\n[markata-go.post_formats]\nhtml = true       # Standard HTML (default: true)\nmarkdown = true   # Raw markdown at /slug.md (default: true)\ntext = true       # Plain text at /slug.txt (default: true)\nog = true         # OpenGraph cards (default: true)\n```\n\nTo disable text output:\n\n```toml\n[markata-go.post_formats]\ntext = false\n```\n\n## Text File Format\n\nThe plain text output includes:\n\n1. **Title** (underlined with `=`)\n2. **Description** (if present)\n3. **Date** (if present)\n4. **Raw content** (no markdown processing)\n\nExample output for a post:\n\n```\nMy Post Title\n=============\n\nA description of the post.\n\nDate: January 26, 2026\n\nThe actual content of the post...\n```\n\nFor standard txt files like `robots.txt`, keep the content minimal:\n\n```markdown\n---\ntitle: \"Robots\"\nslug: robots\npublished: true\n---\n\nUser-agent: *\nAllow: /\n```\n\nThis generates clean output without the title/description header:\n\n```\nRobots\n======\n\nUser-agent: *\nAllow: /\n```\n\n## Testing\n\nVerify your txt files work:\n\n```bash\n# Build and serve locally\nmarkata-go serve\n\n# Test in another terminal\ncurl http://localhost:8000/robots.txt\ncurl http://localhost:8000/llms.txt\ncurl http://localhost:8000/humans.txt\n\n# Test redirects\ncurl -L http://localhost:8000/robots/index.txt\n```\n\n## See Also\n\n- [Post Output Formats](/docs/guides/post-formats/) - Full guide to all output formats\n- [Configuration Guide](/docs/guides/configuration/) - Complete configuration reference\n- [SEO Guide](/docs/guides/structured-data/) - Search engine optimization\n",
      "summary": "Generate robots.txt, llms.txt, humans.txt and other standard web txt files at their canonical URLs",
      "date_published": "2026-01-26T00:00:00Z",
      "date_modified": "2026-01-26T00:00:00Z",
      "tags": [
        "configuration",
        "output",
        "seo",
        "standards"
      ]
    },
    {
      "id": "https://markata.dev/docs/webmentions/",
      "url": "https://markata.dev/docs/webmentions/",
      "title": "WebMentions \u0026 Social Bridging",
      "content_html": "\u003cp\u003emarkata-go supports the IndieWeb WebMention protocol for connecting your static site to the decentralized social web. This includes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eOutgoing WebMentions\u003c/strong\u003e: Automatically notify sites you link to\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSocial Media Bridging\u003c/strong\u003e: Receive likes, reposts, and replies from Twitter, Bluesky, Mastodon, and more\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEnable WebMentions in your \u003ccode\u003emarkata-go.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebmentions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# For outgoing mentions\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutgoing\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# For social media bridging\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebmentions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebridges\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebluesky\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etwitter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emastodon\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"outgoing-webmentions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOutgoing WebMentions\u003c/span\u003e \u003ca href=\"#outgoing-webmentions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen you link to external sites in your posts, markata-go can automatically send WebMentions to those sites (if they support the protocol).\u003c/p\u003e\n\u003ch3 id=\"how-it-works\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow It Works\u003c/span\u003e \u003ca href=\"#how-it-works\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eDuring build, markata-go scans your posts for external links\u003c/li\u003e\n\u003cli\u003eFor each link, it discovers the target site\u0026rsquo;s WebMention endpoint\u003c/li\u003e\n\u003cli\u003eIt sends a notification: \u0026ldquo;Hey, this URL linked to you!\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eThe target site can then display your link/comment\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebmentions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutgoing\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# HTTP request timeout\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etimeout\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;30s\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Max concurrent requests\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econcurrent_requests\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Cache directory to avoid re-sending\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.cache/webmentions\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Custom User-Agent string\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003euser_agent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;MySite/1.0 (WebMention; +https://mysite.com)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"caching\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCaching\u003c/span\u003e \u003ca href=\"#caching\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSent WebMentions are cached to avoid re-sending on every build. The cache is stored in the configured \u003ccode\u003ecache_dir\u003c/code\u003e as JSON.\u003c/p\u003e\n\u003ch2 id=\"social-media-bridging\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSocial Media Bridging\u003c/span\u003e \u003ca href=\"#social-media-bridging\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSocial media bridging allows you to receive interactions from Twitter, Bluesky, Mastodon, and other platforms as WebMentions. This is powered by services like \u003ca href=\"https://fed.brid.gy/\"\u003eBridgy Fed\u003c/a\u003e.\u003c/p\u003e\n\u003ch3 id=\"supported-platforms\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSupported Platforms\u003c/span\u003e \u003ca href=\"#supported-platforms\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePlatform\u003c/th\u003e\n\u003cth\u003eInteractions\u003c/th\u003e\n\u003cth\u003eDetection\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eBluesky\u003c/td\u003e\n\u003ctd\u003eLikes, reposts, replies\u003c/td\u003e\n\u003ctd\u003ebsky.app URLs, Bridgy\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTwitter/X\u003c/td\u003e\n\u003ctd\u003eLikes, retweets, replies\u003c/td\u003e\n\u003ctd\u003etwitter.com/x.com URLs\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMastodon\u003c/td\u003e\n\u003ctd\u003eFavorites, boosts, replies\u003c/td\u003e\n\u003ctd\u003eFediverse patterns\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGitHub\u003c/td\u003e\n\u003ctd\u003eStars, comments, issues\u003c/td\u003e\n\u003ctd\u003egithub.com URLs\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFlickr\u003c/td\u003e\n\u003ctd\u003eFavorites, comments\u003c/td\u003e\n\u003ctd\u003eflickr.com URLs\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"setting-up-bridging\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSetting Up Bridging\u003c/span\u003e \u003ca href=\"#setting-up-bridging\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eSign up for webmention.io\u003c/strong\u003e to receive incoming mentions\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eConnect Bridgy Fed\u003c/strong\u003e to your social accounts at \u003ca href=\"https://fed.brid.gy/\"\u003efed.brid.gy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eConfigure markata-go\u003c/strong\u003e:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebmentions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewebmention_io_token\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;your_token_here\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebmentions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebridges\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebridgy_fediverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Enable specific platforms\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebluesky\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etwitter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emastodon\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egithub\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eflickr\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"platform-detection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlatform Detection\u003c/span\u003e \u003ca href=\"#platform-detection\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go automatically detects the source platform of incoming WebMentions by analyzing:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eURL patterns\u003c/strong\u003e: \u003ccode\u003ebrid.gy/publish/bluesky\u003c/code\u003e, \u003ccode\u003ebsky.app\u003c/code\u003e, etc.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDomain matching\u003c/strong\u003e: Known Mastodon instances, GitHub, etc.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eContent patterns\u003c/strong\u003e: Platform-specific indicators in mention content\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eEach detected mention is enriched with:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ePlatform name\u003c/strong\u003e: \u0026ldquo;bluesky\u0026rdquo;, \u0026ldquo;twitter\u0026rdquo;, \u0026ldquo;mastodon\u0026rdquo;, etc.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHandle\u003c/strong\u003e: Platform-specific username (e.g., \u003ccode\u003e@alice.bsky.social\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOriginal URL\u003c/strong\u003e: Link back to the original interaction\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"filtering-bridged-mentions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFiltering Bridged Mentions\u003c/span\u003e \u003ca href=\"#filtering-bridged-mentions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eYou can filter incoming mentions by platform, interaction type, or content:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebmentions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebridges\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efilters\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Only accept from these platforms\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eplatforms\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;bluesky\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;mastodon\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Only accept these interaction types\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Options: \u0026#34;like\u0026#34;, \u0026#34;repost\u0026#34;, \u0026#34;reply\u0026#34;, \u0026#34;bookmark\u0026#34;, \u0026#34;mention\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einteraction_types\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;like\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;repost\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;reply\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Minimum content length for replies\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emin_content_length\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Block specific domains\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eblocked_domains\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;spam-site.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;bad-actor.net\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"template-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Integration\u003c/span\u003e \u003ca href=\"#template-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDisplay WebMentions in your templates:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.webmentions %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;webmentions\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eReactions\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% for mention in post.webmentions %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;webmention webmention--{{ mention.platform }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c\"\u003e\u0026lt;!-- Platform badge --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if mention.platform != \u0026#34;web\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;platform-badge\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {% if mention.platform == \u0026#34;bluesky\u0026#34; %}Bluesky\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {% elif mention.platform == \u0026#34;twitter\u0026#34; %}Twitter\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {% elif mention.platform == \u0026#34;mastodon\u0026#34; %}Mastodon\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {% elif mention.platform == \u0026#34;github\u0026#34; %}GitHub\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c\"\u003e\u0026lt;!-- Author info --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;author\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {% if mention.author.photo %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ mention.author.photo }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ mention.author.name }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ mention.author.url }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {{ mention.handle | default(mention.author.name) }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c\"\u003e\u0026lt;!-- Interaction type --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if mention.wm_property == \u0026#34;like-of\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eLiked this post\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% elif mention.wm_property == \u0026#34;repost-of\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eReposted this post\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% elif mention.wm_property == \u0026#34;in-reply-to\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eblockquote\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ mention.content.text }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eblockquote\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c\"\u003e\u0026lt;!-- Link to original --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if mention.original_url %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ mention.original_url }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eView on {{ mention.platform }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"platform-specific-styling\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlatform-Specific Styling\u003c/span\u003e \u003ca href=\"#platform-specific-styling\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Platform colors */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eplatform-badge--bluesky\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#0085ff\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eplatform-badge--twitter\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#1da1f2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eplatform-badge--mastodon\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#6364ff\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eplatform-badge--github\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#333\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Platform borders */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ewebmention--bluesky\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eborder-left\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"kc\"\u003esolid\u003c/span\u003e \u003cspan class=\"mh\"\u003e#0085ff\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ewebmention--twitter\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eborder-left\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"kc\"\u003esolid\u003c/span\u003e \u003cspan class=\"mh\"\u003e#1da1f2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ewebmention--mastodon\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eborder-left\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"kc\"\u003esolid\u003c/span\u003e \u003cspan class=\"mh\"\u003e#6364ff\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ewebmention--github\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eborder-left\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"kc\"\u003esolid\u003c/span\u003e \u003cspan class=\"mh\"\u003e#333\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"fetching-webmentions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFetching WebMentions\u003c/span\u003e \u003ca href=\"#fetching-webmentions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWebMentions are fetched from webmention.io and cached locally. The build process reads from the cache, so you need to periodically fetch fresh mentions.\u003c/p\u003e\n\u003ch3 id=\"fetching-with-cli\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFetching with CLI\u003c/span\u003e \u003ca href=\"#fetching-with-cli\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Fetch all webmentions for your site\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go webmentions fetch\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# The mentions are saved to .cache/webmentions/received_mentions.json\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"environment-variable\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment Variable\u003c/span\u003e \u003ca href=\"#environment-variable\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eYou can set your webmention.io token via environment variable instead of config:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eWEBMENTION_IO_TOKEN\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;your_token_here\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go webmentions fetch\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"automated-fetching\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAutomated Fetching\u003c/span\u003e \u003ca href=\"#automated-fetching\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSet up a cron job or CI workflow to fetch mentions regularly:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .github/workflows/fetch-webmentions.yml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eFetch WebMentions\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eschedule\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003ecron\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;0 */6 * * *\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Every 6 hours\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eworkflow_dispatch\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003efetch\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eFetch webmentions\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go webmentions fetch\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eWEBMENTION_IO_TOKEN\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.WEBMENTION_IO_TOKEN }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCommit cache\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git config user.name github-actions\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git config user.email github-actions@github.com\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git add .cache/webmentions/\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git diff --staged --quiet || git commit -m \u0026#34;chore: update webmention cache\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git push\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"displaying-counts-on-post-cards\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDisplaying Counts on Post Cards\u003c/span\u003e \u003ca href=\"#displaying-counts-on-post-cards\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe default theme includes a webmention counts partial that shows like/repost/reply counts on post cards.\u003c/p\u003e\n\u003ch3 id=\"including-the-partial\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIncluding the Partial\u003c/span\u003e \u003ca href=\"#including-the-partial\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd to your card templates (e.g., \u003ccode\u003earticle-card.html\u003c/code\u003e):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;article-card\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Href }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Description }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Date.Format \u0026#34;Jan 2, 2006\u0026#34; }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% include \u0026#34;partials/webmention-counts.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"the-counts-partial\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Counts Partial\u003c/span\u003e \u003ca href=\"#the-counts-partial\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe \u003ccode\u003epartials/webmention-counts.html\u003c/code\u003e partial renders compact counts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.Extra.webmentions %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% set likes = post.Extra.webmentions|selectattr(\u0026#34;WMProperty\u0026#34;, \u0026#34;equalto\u0026#34;, \u0026#34;like-of\u0026#34;)|list|length %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% set reposts = post.Extra.webmentions|selectattr(\u0026#34;WMProperty\u0026#34;, \u0026#34;equalto\u0026#34;, \u0026#34;repost-of\u0026#34;)|list|length %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% set replies = post.Extra.webmentions|selectattr(\u0026#34;WMProperty\u0026#34;, \u0026#34;equalto\u0026#34;, \u0026#34;in-reply-to\u0026#34;)|list|length %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if likes \u0026gt; 0 or reposts \u0026gt; 0 or replies \u0026gt; 0 %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;webmention-counts\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% if likes \u0026gt; 0 %}\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;wm-count wm-likes\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Likes\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ likes }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% if reposts \u0026gt; 0 %}\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;wm-count wm-reposts\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Reposts\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ reposts }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% if replies \u0026gt; 0 %}\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;wm-count wm-replies\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Replies\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ replies }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"styling-counts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStyling Counts\u003c/span\u003e \u003ca href=\"#styling-counts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe default theme uses semantic color variables:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ewebmention-counts\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eflex\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003egap\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.75\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003efont-size\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.875\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ewm-count\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003einline-flex\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ealign-items\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ecenter\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003egap\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.25\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ewm-count\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003ebefore\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003efont-size\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ewm-likes\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003ebefore\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ewm-reposts\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003ebefore\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003esuccess\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ewm-replies\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003ebefore\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eprimary\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"engagement-leaderboard\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEngagement Leaderboard\u003c/span\u003e \u003ca href=\"#engagement-leaderboard\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ccode\u003ewebmentions_leaderboard\u003c/code\u003e plugin calculates top posts by engagement and makes the data available for analytics pages.\u003c/p\u003e\n\u003ch3 id=\"enabling-the-leaderboard\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnabling the Leaderboard\u003c/span\u003e \u003ca href=\"#enabling-the-leaderboard\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe leaderboard plugin runs automatically when webmentions are present. No additional configuration needed.\u003c/p\u003e\n\u003ch3 id=\"accessing-leaderboard-data\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAccessing Leaderboard Data\u003c/span\u003e \u003ca href=\"#accessing-leaderboard-data\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIn any Jinja-enabled page, access the leaderboard via \u003ccode\u003econfig.Extra.webmention_leaderboard\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Site Analytics\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Content Analytics\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if config.Extra.webmention_leaderboard %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Most Liked Posts\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Likes | Post |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|------:|------|\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for entry in config.Extra.webmention_leaderboard.TopLiked %}| {{ entry.Likes }} | [\u003cspan class=\"nt\"\u003e{{ entry.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ entry.Href }}\u003c/span\u003e) |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Most Discussed Posts\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Replies | Post |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|--------:|------|\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for entry in config.Extra.webmention_leaderboard.TopReplied %}| {{ entry.Replies }} | [\u003cspan class=\"nt\"\u003e{{ entry.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ entry.Href }}\u003c/span\u003e) |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Most Shared Posts\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Reposts | Post |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|--------:|------|\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for entry in config.Extra.webmention_leaderboard.TopReposted %}| {{ entry.Reposts }} | [\u003cspan class=\"nt\"\u003e{{ entry.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ entry.Href }}\u003c/span\u003e) |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Top Engaged Posts (Total)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Total | Likes | Reposts | Replies | Post |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|------:|------:|--------:|--------:|------|\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for entry in config.Extra.webmention_leaderboard.TopTotal %}| {{ entry.Total }} | {{ entry.Likes }} | {{ entry.Reposts }} | {{ entry.Replies }} | [\u003cspan class=\"nt\"\u003e{{ entry.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ entry.Href }}\u003c/span\u003e) |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Site Totals\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e **Total Likes:** {{ config.Extra.webmention_leaderboard.TotalLikes }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e **Total Reposts:** {{ config.Extra.webmention_leaderboard.TotalReposts }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e **Total Replies:** {{ config.Extra.webmention_leaderboard.TotalReplies }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e **Total Mentions:** {{ config.Extra.webmention_leaderboard.TotalMentions }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ge\"\u003e*No webmention data available.*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"leaderboard-data-structure\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLeaderboard Data Structure\u003c/span\u003e \u003ca href=\"#leaderboard-data-structure\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eTopLiked\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]LeaderboardEntry\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTop 20 posts by likes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eTopReposted\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]LeaderboardEntry\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTop 20 posts by reposts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eTopReplied\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]LeaderboardEntry\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTop 20 posts by replies\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eTopTotal\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]LeaderboardEntry\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTop 20 posts by total engagement\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eTotalLikes\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite-wide total likes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eTotalReposts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite-wide total reposts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eTotalReplies\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite-wide total replies\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eTotalMentions\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite-wide total mentions\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eEach \u003ccode\u003eLeaderboardEntry\u003c/code\u003e contains:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eHref\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePost URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eTitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePost title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eLikes\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNumber of likes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eReposts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNumber of reposts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eReplies\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNumber of replies\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eBookmarks\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNumber of bookmarks\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMentions\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNumber of generic mentions\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eTotal\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTotal engagement\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"full-configuration-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFull Configuration Reference\u003c/span\u003e \u003ca href=\"#full-configuration-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebmentions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Enable the webmentions plugin\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Send outgoing webmentions when linking to external sites\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutgoing\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# HTTP request timeout for sending/receiving\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etimeout\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;30s\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Directory to cache sent webmentions (avoids re-sending)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.cache/webmentions\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Maximum concurrent HTTP requests\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econcurrent_requests\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# User-Agent string for HTTP requests\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003euser_agent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;markata-go/1.0 (WebMention; +https://github.com/WaylonWalker/markata-go)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# API token for webmention.io (for receiving mentions)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewebmention_io_token\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebmentions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebridges\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Enable social media bridging detection\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Use Bridgy Fediverse for bridging\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebridgy_fediverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Platform toggles\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebluesky\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etwitter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emastodon\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egithub\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eflickr\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebmentions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebridges\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efilters\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Limit to specific platforms (empty = all enabled)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eplatforms\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Limit to specific interaction types (empty = all)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Options: \u0026#34;like\u0026#34;, \u0026#34;repost\u0026#34;, \u0026#34;reply\u0026#34;, \u0026#34;bookmark\u0026#34;, \u0026#34;mention\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einteraction_types\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Minimum content length for replies\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emin_content_length\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Block mentions from these domains\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eblocked_domains\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"webmentions-not-being-sent\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWebMentions not being sent\u003c/span\u003e \u003ca href=\"#webmentions-not-being-sent\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eEnsure \u003ccode\u003eenabled = true\u003c/code\u003e and \u003ccode\u003eoutgoing = true\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eCheck that target sites have WebMention endpoints\u003c/li\u003e\n\u003cli\u003eReview the cache directory for sent status\u003c/li\u003e\n\u003cli\u003eCheck HTTP timeout settings\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"bridged-mentions-not-appearing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBridged mentions not appearing\u003c/span\u003e \u003ca href=\"#bridged-mentions-not-appearing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eVerify your webmention.io token is correct\u003c/li\u003e\n\u003cli\u003eCheck that Bridgy is connected to your social accounts\u003c/li\u003e\n\u003cli\u003eEnsure the platform is enabled in \u003ccode\u003ebridges\u003c/code\u003e config\u003c/li\u003e\n\u003cli\u003eCheck filters aren\u0026rsquo;t blocking the mentions\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"platform-not-detected-correctly\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlatform not detected correctly\u003c/span\u003e \u003ca href=\"#platform-not-detected-correctly\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe platform detection uses URL patterns. If a mention isn\u0026rsquo;t being detected:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCheck the source URL in the raw WebMention data\u003c/li\u003e\n\u003cli\u003eEnsure the platform is enabled in config\u003c/li\u003e\n\u003cli\u003eFile an issue if detection should be improved\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"resources\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eResources\u003c/span\u003e \u003ca href=\"#resources\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.w3.org/TR/webmention/\"\u003eWebMention Spec\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://fed.brid.gy/\"\u003eBridgy Fed\u003c/a\u003e - Social media bridging\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://webmention.io/\"\u003ewebmention.io\u003c/a\u003e - Hosted WebMention receiver\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://indieweb.org/Webmention\"\u003eIndieWeb Wiki\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nmarkata-go supports the IndieWeb WebMention protocol for connecting your static site to the decentralized social web. This includes:\n\n- **Outgoing WebMentions**: Automatically notify sites you link to\n- **Social Media Bridging**: Receive likes, reposts, and replies from Twitter, Bluesky, Mastodon, and more\n\n## Quick Start\n\nEnable WebMentions in your `markata-go.toml`:\n\n```toml\n[markata-go.webmentions]\nenabled = true\n\n# For outgoing mentions\noutgoing = true\n\n# For social media bridging\n[markata-go.webmentions.bridges]\nenabled = true\nbluesky = true\ntwitter = true\nmastodon = true\n```\n\n## Outgoing WebMentions\n\nWhen you link to external sites in your posts, markata-go can automatically send WebMentions to those sites (if they support the protocol).\n\n### How It Works\n\n1. During build, markata-go scans your posts for external links\n2. For each link, it discovers the target site's WebMention endpoint\n3. It sends a notification: \"Hey, this URL linked to you!\"\n4. The target site can then display your link/comment\n\n### Configuration\n\n```toml\n[markata-go.webmentions]\nenabled = true\noutgoing = true\n\n# HTTP request timeout\ntimeout = \"30s\"\n\n# Max concurrent requests\nconcurrent_requests = 5\n\n# Cache directory to avoid re-sending\ncache_dir = \".cache/webmentions\"\n\n# Custom User-Agent string\nuser_agent = \"MySite/1.0 (WebMention; +https://mysite.com)\"\n```\n\n### Caching\n\nSent WebMentions are cached to avoid re-sending on every build. The cache is stored in the configured `cache_dir` as JSON.\n\n## Social Media Bridging\n\nSocial media bridging allows you to receive interactions from Twitter, Bluesky, Mastodon, and other platforms as WebMentions. This is powered by services like [Bridgy Fed](https://fed.brid.gy/).\n\n### Supported Platforms\n\n| Platform | Interactions | Detection |\n|----------|-------------|-----------|\n| Bluesky | Likes, reposts, replies | bsky.app URLs, Bridgy |\n| Twitter/X | Likes, retweets, replies | twitter.com/x.com URLs |\n| Mastodon | Favorites, boosts, replies | Fediverse patterns |\n| GitHub | Stars, comments, issues | github.com URLs |\n| Flickr | Favorites, comments | flickr.com URLs |\n\n### Setting Up Bridging\n\n1. **Sign up for webmention.io** to receive incoming mentions\n2. **Connect Bridgy Fed** to your social accounts at [fed.brid.gy](https://fed.brid.gy/)\n3. **Configure markata-go**:\n\n```toml\n[markata-go.webmentions]\nenabled = true\nwebmention_io_token = \"your_token_here\"\n\n[markata-go.webmentions.bridges]\nenabled = true\nbridgy_fediverse = true\n\n# Enable specific platforms\nbluesky = true\ntwitter = true\nmastodon = true\ngithub = true\nflickr = false\n```\n\n### Platform Detection\n\nmarkata-go automatically detects the source platform of incoming WebMentions by analyzing:\n\n1. **URL patterns**: `brid.gy/publish/bluesky`, `bsky.app`, etc.\n2. **Domain matching**: Known Mastodon instances, GitHub, etc.\n3. **Content patterns**: Platform-specific indicators in mention content\n\nEach detected mention is enriched with:\n- **Platform name**: \"bluesky\", \"twitter\", \"mastodon\", etc.\n- **Handle**: Platform-specific username (e.g., `@alice.bsky.social`)\n- **Original URL**: Link back to the original interaction\n\n### Filtering Bridged Mentions\n\nYou can filter incoming mentions by platform, interaction type, or content:\n\n```toml\n[markata-go.webmentions.bridges.filters]\n# Only accept from these platforms\nplatforms = [\"bluesky\", \"mastodon\"]\n\n# Only accept these interaction types\n# Options: \"like\", \"repost\", \"reply\", \"bookmark\", \"mention\"\ninteraction_types = [\"like\", \"repost\", \"reply\"]\n\n# Minimum content length for replies\nmin_content_length = 10\n\n# Block specific domains\nblocked_domains = [\"spam-site.com\", \"bad-actor.net\"]\n```\n\n## Template Integration\n\nDisplay WebMentions in your templates:\n\n```html\n{% if post.webmentions %}\n\u003csection class=\"webmentions\"\u003e\n  \u003ch3\u003eReactions\u003c/h3\u003e\n\n  {% for mention in post.webmentions %}\n  \u003carticle class=\"webmention webmention--{{ mention.platform }}\"\u003e\n    \u003c!-- Platform badge --\u003e\n    {% if mention.platform != \"web\" %}\n    \u003cspan class=\"platform-badge\"\u003e\n      {% if mention.platform == \"bluesky\" %}Bluesky\n      {% elif mention.platform == \"twitter\" %}Twitter\n      {% elif mention.platform == \"mastodon\" %}Mastodon\n      {% elif mention.platform == \"github\" %}GitHub\n      {% endif %}\n    \u003c/span\u003e\n    {% endif %}\n\n    \u003c!-- Author info --\u003e\n    \u003cdiv class=\"author\"\u003e\n      {% if mention.author.photo %}\n      \u003cimg src=\"{{ mention.author.photo }}\" alt=\"{{ mention.author.name }}\"\u003e\n      {% endif %}\n      \u003ca href=\"{{ mention.author.url }}\"\u003e\n        {{ mention.handle | default(mention.author.name) }}\n      \u003c/a\u003e\n    \u003c/div\u003e\n\n    \u003c!-- Interaction type --\u003e\n    {% if mention.wm_property == \"like-of\" %}\n      \u003cp\u003eLiked this post\u003c/p\u003e\n    {% elif mention.wm_property == \"repost-of\" %}\n      \u003cp\u003eReposted this post\u003c/p\u003e\n    {% elif mention.wm_property == \"in-reply-to\" %}\n      \u003cblockquote\u003e{{ mention.content.text }}\u003c/blockquote\u003e\n    {% endif %}\n\n    \u003c!-- Link to original --\u003e\n    {% if mention.original_url %}\n    \u003ca href=\"{{ mention.original_url }}\"\u003eView on {{ mention.platform }}\u003c/a\u003e\n    {% endif %}\n  \u003c/article\u003e\n  {% endfor %}\n\u003c/section\u003e\n{% endif %}\n```\n\n### Platform-Specific Styling\n\n```css\n/* Platform colors */\n.platform-badge--bluesky { background: #0085ff; }\n.platform-badge--twitter { background: #1da1f2; }\n.platform-badge--mastodon { background: #6364ff; }\n.platform-badge--github { background: #333; }\n\n/* Platform borders */\n.webmention--bluesky { border-left: 3px solid #0085ff; }\n.webmention--twitter { border-left: 3px solid #1da1f2; }\n.webmention--mastodon { border-left: 3px solid #6364ff; }\n.webmention--github { border-left: 3px solid #333; }\n```\n\n## Fetching WebMentions\n\nWebMentions are fetched from webmention.io and cached locally. The build process reads from the cache, so you need to periodically fetch fresh mentions.\n\n### Fetching with CLI\n\n```bash\n# Fetch all webmentions for your site\nmarkata-go webmentions fetch\n\n# The mentions are saved to .cache/webmentions/received_mentions.json\n```\n\n### Environment Variable\n\nYou can set your webmention.io token via environment variable instead of config:\n\n```bash\nexport WEBMENTION_IO_TOKEN=\"your_token_here\"\nmarkata-go webmentions fetch\n```\n\n### Automated Fetching\n\nSet up a cron job or CI workflow to fetch mentions regularly:\n\n```yaml\n# .github/workflows/fetch-webmentions.yml\nname: Fetch WebMentions\non:\n  schedule:\n    - cron: '0 */6 * * *'  # Every 6 hours\n  workflow_dispatch:\n\njobs:\n  fetch:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - name: Fetch webmentions\n        run: markata-go webmentions fetch\n        env:\n          WEBMENTION_IO_TOKEN: ${{ secrets.WEBMENTION_IO_TOKEN }}\n      - name: Commit cache\n        run: |\n          git config user.name github-actions\n          git config user.email github-actions@github.com\n          git add .cache/webmentions/\n          git diff --staged --quiet || git commit -m \"chore: update webmention cache\"\n          git push\n```\n\n## Displaying Counts on Post Cards\n\nThe default theme includes a webmention counts partial that shows like/repost/reply counts on post cards.\n\n### Including the Partial\n\nAdd to your card templates (e.g., `article-card.html`):\n\n```html\n\u003carticle class=\"article-card\"\u003e\n  \u003ca href=\"{{ post.Href }}\"\u003e\n    \u003ch3\u003e{{ post.Title }}\u003c/h3\u003e\n    \u003cp\u003e{{ post.Description }}\u003c/p\u003e\n  \u003c/a\u003e\n  \u003cfooter\u003e\n    \u003ctime\u003e{{ post.Date.Format \"Jan 2, 2006\" }}\u003c/time\u003e\n    {% include \"partials/webmention-counts.html\" %}\n  \u003c/footer\u003e\n\u003c/article\u003e\n```\n\n### The Counts Partial\n\nThe `partials/webmention-counts.html` partial renders compact counts:\n\n```html\n{% if post.Extra.webmentions %}\n{% set likes = post.Extra.webmentions|selectattr(\"WMProperty\", \"equalto\", \"like-of\")|list|length %}\n{% set reposts = post.Extra.webmentions|selectattr(\"WMProperty\", \"equalto\", \"repost-of\")|list|length %}\n{% set replies = post.Extra.webmentions|selectattr(\"WMProperty\", \"equalto\", \"in-reply-to\")|list|length %}\n\n{% if likes \u003e 0 or reposts \u003e 0 or replies \u003e 0 %}\n\u003cdiv class=\"webmention-counts\"\u003e\n  {% if likes \u003e 0 %}\u003cspan class=\"wm-count wm-likes\" title=\"Likes\"\u003e{{ likes }}\u003c/span\u003e{% endif %}\n  {% if reposts \u003e 0 %}\u003cspan class=\"wm-count wm-reposts\" title=\"Reposts\"\u003e{{ reposts }}\u003c/span\u003e{% endif %}\n  {% if replies \u003e 0 %}\u003cspan class=\"wm-count wm-replies\" title=\"Replies\"\u003e{{ replies }}\u003c/span\u003e{% endif %}\n\u003c/div\u003e\n{% endif %}\n{% endif %}\n```\n\n### Styling Counts\n\nThe default theme uses semantic color variables:\n\n```css\n.webmention-counts {\n  display: flex;\n  gap: 0.75rem;\n  font-size: 0.875rem;\n}\n\n.wm-count {\n  display: inline-flex;\n  align-items: center;\n  gap: 0.25rem;\n}\n\n.wm-count::before {\n  font-size: 1rem;\n}\n\n.wm-likes::before { content: \"\"; color: var(--color-error); }\n.wm-reposts::before { content: \"\"; color: var(--color-success); }\n.wm-replies::before { content: \"\"; color: var(--color-primary); }\n```\n\n## Engagement Leaderboard\n\nThe `webmentions_leaderboard` plugin calculates top posts by engagement and makes the data available for analytics pages.\n\n### Enabling the Leaderboard\n\nThe leaderboard plugin runs automatically when webmentions are present. No additional configuration needed.\n\n### Accessing Leaderboard Data\n\nIn any Jinja-enabled page, access the leaderboard via `config.Extra.webmention_leaderboard`:\n\n```markdown\n---\ntitle: \"Site Analytics\"\njinja: true\n---\n\n# Content Analytics\n\n{% if config.Extra.webmention_leaderboard %}\n\n## Most Liked Posts\n\n| Likes | Post |\n|------:|------|\n{% for entry in config.Extra.webmention_leaderboard.TopLiked %}| {{ entry.Likes }} | [{{ entry.Title }}]({{ entry.Href }}) |\n{% endfor %}\n\n## Most Discussed Posts\n\n| Replies | Post |\n|--------:|------|\n{% for entry in config.Extra.webmention_leaderboard.TopReplied %}| {{ entry.Replies }} | [{{ entry.Title }}]({{ entry.Href }}) |\n{% endfor %}\n\n## Most Shared Posts\n\n| Reposts | Post |\n|--------:|------|\n{% for entry in config.Extra.webmention_leaderboard.TopReposted %}| {{ entry.Reposts }} | [{{ entry.Title }}]({{ entry.Href }}) |\n{% endfor %}\n\n## Top Engaged Posts (Total)\n\n| Total | Likes | Reposts | Replies | Post |\n|------:|------:|--------:|--------:|------|\n{% for entry in config.Extra.webmention_leaderboard.TopTotal %}| {{ entry.Total }} | {{ entry.Likes }} | {{ entry.Reposts }} | {{ entry.Replies }} | [{{ entry.Title }}]({{ entry.Href }}) |\n{% endfor %}\n\n---\n\n## Site Totals\n\n- **Total Likes:** {{ config.Extra.webmention_leaderboard.TotalLikes }}\n- **Total Reposts:** {{ config.Extra.webmention_leaderboard.TotalReposts }}\n- **Total Replies:** {{ config.Extra.webmention_leaderboard.TotalReplies }}\n- **Total Mentions:** {{ config.Extra.webmention_leaderboard.TotalMentions }}\n\n{% else %}\n*No webmention data available.*\n{% endif %}\n```\n\n### Leaderboard Data Structure\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `TopLiked` | `[]LeaderboardEntry` | Top 20 posts by likes |\n| `TopReposted` | `[]LeaderboardEntry` | Top 20 posts by reposts |\n| `TopReplied` | `[]LeaderboardEntry` | Top 20 posts by replies |\n| `TopTotal` | `[]LeaderboardEntry` | Top 20 posts by total engagement |\n| `TotalLikes` | `int` | Site-wide total likes |\n| `TotalReposts` | `int` | Site-wide total reposts |\n| `TotalReplies` | `int` | Site-wide total replies |\n| `TotalMentions` | `int` | Site-wide total mentions |\n\nEach `LeaderboardEntry` contains:\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `Href` | `string` | Post URL |\n| `Title` | `string` | Post title |\n| `Likes` | `int` | Number of likes |\n| `Reposts` | `int` | Number of reposts |\n| `Replies` | `int` | Number of replies |\n| `Bookmarks` | `int` | Number of bookmarks |\n| `Mentions` | `int` | Number of generic mentions |\n| `Total` | `int` | Total engagement |\n\n## Full Configuration Reference\n\n```toml\n[markata-go.webmentions]\n# Enable the webmentions plugin\nenabled = true\n\n# Send outgoing webmentions when linking to external sites\noutgoing = true\n\n# HTTP request timeout for sending/receiving\ntimeout = \"30s\"\n\n# Directory to cache sent webmentions (avoids re-sending)\ncache_dir = \".cache/webmentions\"\n\n# Maximum concurrent HTTP requests\nconcurrent_requests = 5\n\n# User-Agent string for HTTP requests\nuser_agent = \"markata-go/1.0 (WebMention; +https://github.com/WaylonWalker/markata-go)\"\n\n# API token for webmention.io (for receiving mentions)\nwebmention_io_token = \"\"\n\n[markata-go.webmentions.bridges]\n# Enable social media bridging detection\nenabled = false\n\n# Use Bridgy Fediverse for bridging\nbridgy_fediverse = true\n\n# Platform toggles\nbluesky = true\ntwitter = true\nmastodon = true\ngithub = true\nflickr = false\n\n[markata-go.webmentions.bridges.filters]\n# Limit to specific platforms (empty = all enabled)\nplatforms = []\n\n# Limit to specific interaction types (empty = all)\n# Options: \"like\", \"repost\", \"reply\", \"bookmark\", \"mention\"\ninteraction_types = []\n\n# Minimum content length for replies\nmin_content_length = 0\n\n# Block mentions from these domains\nblocked_domains = []\n```\n\n## Troubleshooting\n\n### WebMentions not being sent\n\n1. Ensure `enabled = true` and `outgoing = true`\n2. Check that target sites have WebMention endpoints\n3. Review the cache directory for sent status\n4. Check HTTP timeout settings\n\n### Bridged mentions not appearing\n\n1. Verify your webmention.io token is correct\n2. Check that Bridgy is connected to your social accounts\n3. Ensure the platform is enabled in `bridges` config\n4. Check filters aren't blocking the mentions\n\n### Platform not detected correctly\n\nThe platform detection uses URL patterns. If a mention isn't being detected:\n\n1. Check the source URL in the raw WebMention data\n2. Ensure the platform is enabled in config\n3. File an issue if detection should be improved\n\n## Resources\n\n- [WebMention Spec](https://www.w3.org/TR/webmention/)\n- [Bridgy Fed](https://fed.brid.gy/) - Social media bridging\n- [webmention.io](https://webmention.io/) - Hosted WebMention receiver\n- [IndieWeb Wiki](https://indieweb.org/Webmention)\n",
      "summary": "Connect your static site to the social web with WebMentions and cross-platform bridging",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "webmentions",
        "indieweb",
        "social",
        "bridging"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/quick-reference/",
      "url": "https://markata.dev/docs/guides/quick-reference/",
      "title": "Quick Reference",
      "content_html": "\u003cp\u003eA quick reference for common markata-go commands, configuration snippets, and troubleshooting tips.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"prerequisites\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrerequisites\u003c/span\u003e \u003ca href=\"#prerequisites\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBefore using this guide, you should have:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003emarkata-go installed ([Installation Guide](/docs/getting-started/\u003ca href=\"/tags/installation/\" class=\"hashtag-tag\" data-tag=\"installation\" data-count=1 data-reading-time=2 data-reading-time-text=\"2 minutes\"\u003e#installation\u003c/a\u003e))\u003c/li\u003e\n\u003cli\u003eA basic understanding of TOML configuration format\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"cli-commands\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCLI Commands\u003c/span\u003e \u003ca href=\"#cli-commands\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"build-and-serve\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild and Serve\u003c/span\u003e \u003ca href=\"#build-and-serve\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build site\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build with clean output directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build to custom output directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build -o dist\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Start development server with live reload\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Serve on custom port\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve -p \u003cspan class=\"m\"\u003e3000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Serve with verbose output\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"content-creation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContent Creation\u003c/span\u003e \u003ca href=\"#content-creation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create a new post\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new \u003cspan class=\"s2\"\u003e\u0026#34;My Post Title\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create with specific template\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new \u003cspan class=\"s2\"\u003e\u0026#34;Tutorial\u0026#34;\u003c/span\u003e -t tutorial\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create in specific directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new \u003cspan class=\"s2\"\u003e\u0026#34;About\u0026#34;\u003c/span\u003e --dir pages\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create as published (not draft)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new \u003cspan class=\"s2\"\u003e\u0026#34;Announcement\u0026#34;\u003c/span\u003e --draft\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List available templates\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new --list\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Initialize config file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config init\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Show resolved configuration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config show\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Show as JSON\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config show --json\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Get specific value\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config get output_dir\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config get glob.patterns\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Validate configuration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config validate\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"themes-and-palettes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThemes and Palettes\u003c/span\u003e \u003ca href=\"#themes-and-palettes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List available palettes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette list\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Show palette details\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette info catppuccin-mocha\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check accessibility\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette check catppuccin-mocha\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Export palette as CSS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette \u003cspan class=\"nb\"\u003eexport\u003c/span\u003e catppuccin-mocha --format css\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Clone a palette for customization\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette clone catppuccin-mocha --name \u003cspan class=\"s2\"\u003e\u0026#34;my-theme\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"rich-markdown-icon-shortcuts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRich Markdown icon shortcuts\u003c/span\u003e \u003ca href=\"#rich-markdown-icon-shortcuts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse the existing Lucide shortcode in any Markdown post:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:lucide-rocket: Deployment\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: md-feature\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-feature-icon\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:lucide-rocket:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-feature-body\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Verify production\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eConfirm the deployed image, with visible text for accessibility.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCombine \u003ccode\u003emd-icon\u003c/code\u003e with \u003ccode\u003emd-card\u003c/code\u003e for centered icon cards. See\n\u003ca href=\"/docs/guides/icons/\"\u003eIcon Shortcodes\u003c/a\u003e and\n\u003ca href=\"/docs/guides/markdown-containers/\"\u003eMarkdown Containers\u003c/a\u003e. Agents should read\nthe bundled skill\u0026rsquo;s \u003ccode\u003etopics/rich-markdown.md\u003c/code\u003e before inventing custom icon\ncode.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"configuration-snippets\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration Snippets\u003c/span\u003e \u003ca href=\"#configuration-snippets\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"minimal-site-config\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMinimal Site Config\u003c/span\u003e \u003ca href=\"#minimal-site-config\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;posts/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"blog-with-rss\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBlog with RSS\u003c/span\u003e \u003ca href=\"#blog-with-rss\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://myblog.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;posts/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pages/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"documentation-site\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocumentation Site\u003c/span\u003e \u003ca href=\"#documentation-site\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Project Docs\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://docs.example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;docs/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eextensions\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tables\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tasklist\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edoc_sidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;right\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emin_depth\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_depth\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;navbar\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"custom-theme\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Theme\u003c/span\u003e \u003ca href=\"#custom-theme\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-mocha\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecustom_css\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;custom.css\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--color-primary\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#8b5cf6\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--content-width\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;800px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"navigation-config\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNavigation Config\u003c/span\u003e \u003ca href=\"#navigation-config\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;header\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eitems\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elabel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Home\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eitems\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elabel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/blog/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eitems\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elabel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;GitHub\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://github.com/user\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexternal\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"frontmatter-snippets\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFrontmatter Snippets\u003c/span\u003e \u003ca href=\"#frontmatter-snippets\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"basic-post\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Post\u003c/span\u003e \u003ca href=\"#basic-post\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2026-01-24\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003etopic\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"full-post-with-custom-fields\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFull Post with Custom Fields\u003c/span\u003e \u003ca href=\"#full-post-with-custom-fields\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Complete Guide to X\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;guide-to-x\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2026-01-24\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003etutorial\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003eguide\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;A comprehensive guide covering everything about X.\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tutorial.html\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Custom fields (available via post.Extra)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Jane Doe\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ereading_time\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;10 min\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003efeatured\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;X Fundamentals\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries_order\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"draft-post\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDraft Post\u003c/span\u003e \u003ca href=\"#draft-post\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Work in Progress\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2026-01-24\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edraft\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"landing-page\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLanding Page\u003c/span\u003e \u003ca href=\"#landing-page\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Welcome\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;landing.html\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"filter-expressions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFilter Expressions\u003c/span\u003e \u003ca href=\"#filter-expressions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCommon filter expressions for feed configuration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Published posts only\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Exclude drafts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and draft == False\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Posts with specific tag\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;tutorial\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Multiple tags (OR)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;python\u0026#39; in tags or \u0026#39;go\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Date range\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date \u0026gt;= \u0026#39;2024-01-01\u0026#39; and date \u0026lt; \u0026#39;2025-01-01\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# No future posts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and date \u0026lt;= today\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Featured posts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and featured == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# By author (custom field)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;author == \u0026#39;Jane Doe\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Slug prefix (for sections)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;slug.startswith(\u0026#39;tutorials/\u0026#39;)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"template-snippets\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Snippets\u003c/span\u003e \u003ca href=\"#template-snippets\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"date-formatting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDate Formatting\u003c/span\u003e \u003ca href=\"#date-formatting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Date\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003edate_format\u003c/span\u003e\u003cspan class=\"s2\"\u003e:\u0026#34;January 2, 2006\u0026#34;\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Date\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003edate_format\u003c/span\u003e\u003cspan class=\"s2\"\u003e:\u0026#34;2006-01-02\u0026#34;\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Date\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003erss_date\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Date\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003eatom_date\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"conditional-content\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConditional Content\u003c/span\u003e \u003ca href=\"#conditional-content\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Tags\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e\u0026lt;ul class=\u0026#34;tags\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e  \u003c/span\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"nv\"\u003etag\u003c/span\u003e \u003cspan class=\"k\"\u003ein\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Tags\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e  \u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;/tags/\u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003etag\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003eslugify\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e/\u0026#34;\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003etag\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e  \u003c/span\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eendfor\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e\u0026lt;/ul\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eendif\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"custom-field-access\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Field Access\u003c/span\u003e \u003ca href=\"#custom-field-access\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Extra.featured\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e\u0026lt;span class=\u0026#34;badge\u0026#34;\u0026gt;Featured\u0026lt;/span\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eendif\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Extra.author\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e\u0026lt;p\u0026gt;By \u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Extra.author\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\u0026lt;/p\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eendif\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"pagination\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePagination\u003c/span\u003e \u003ca href=\"#pagination\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"nv\"\u003epage.HasPrev\u003c/span\u003e \u003cspan class=\"k\"\u003eor\u003c/span\u003e \u003cspan class=\"nv\"\u003epage.HasNext\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e\u0026lt;nav class=\u0026#34;pagination\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e  \u003c/span\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"nv\"\u003epage.HasPrev\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e  \u0026lt;a href=\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epage.PrevURL\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\u0026#34;\u0026gt;Previous\u0026lt;/a\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e  \u003c/span\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eendif\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e  \u0026lt;span\u0026gt;Page \u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epage.Number\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\u0026lt;/span\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e  \u003c/span\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"nv\"\u003epage.HasNext\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e  \u0026lt;a href=\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epage.NextURL\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\u0026#34;\u0026gt;Next\u0026lt;/a\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e  \u003c/span\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eendif\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e\u0026lt;/nav\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eendif\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"environment-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment Variables\u003c/span\u003e \u003ca href=\"#environment-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOverride any config with \u003ccode\u003eMARKATA_GO_\u003c/code\u003e prefix:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Core settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_OUTPUT_DIR\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003edist\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_TITLE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build with overrides\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://staging.example.com markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"quick-troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Troubleshooting\u003c/span\u003e \u003ca href=\"#quick-troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"site-not-updating\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSite Not Updating\u003c/span\u003e \u003ca href=\"#site-not-updating\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Clean build\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Clear browser cache or use incognito mode\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"posts-not-appearing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePosts Not Appearing\u003c/span\u003e \u003ca href=\"#posts-not-appearing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eCheck frontmatter: \u003ccode\u003epublished: true\u003c/code\u003e must be set\u003c/li\u003e\n\u003cli\u003eCheck filter: Ensure feed filter matches your posts\u003c/li\u003e\n\u003cli\u003eCheck date: Future dates won\u0026rsquo;t appear with \u003ccode\u003edate \u0026lt;= today\u003c/code\u003e filter\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Validate config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config validate\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check resolved config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config show\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"rss-feed-empty\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRSS Feed Empty\u003c/span\u003e \u003ca href=\"#rss-feed-empty\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eVerify RSS is enabled in feed formats:\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003eCheck that posts match the feed filter\u003c/li\u003e\n\u003cli\u003eEnsure \u003ccode\u003eurl\u003c/code\u003e is set in config (required for absolute URLs)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"template-not-found\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Not Found\u003c/span\u003e \u003ca href=\"#template-not-found\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eCheck template path in frontmatter matches file name\u003c/li\u003e\n\u003cli\u003eVerify file exists in \u003ccode\u003etemplates/\u003c/code\u003e directory\u003c/li\u003e\n\u003cli\u003eInclude \u003ccode\u003e.html\u003c/code\u003e extension: \u003ccode\u003etemplate: \u0026quot;custom.html\u0026quot;\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"styles-not-loading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStyles Not Loading\u003c/span\u003e \u003ca href=\"#styles-not-loading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eCheck \u003ccode\u003estatic/\u003c/code\u003e directory contains CSS files\u003c/li\u003e\n\u003cli\u003eVerify \u003ccode\u003eassets_dir\u003c/code\u003e setting if using custom location\u003c/li\u003e\n\u003cli\u003eCheck browser console for 404 errors\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"build-fails\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Fails\u003c/span\u003e \u003ca href=\"#build-fails\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Verbose output for debugging\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Validate configuration first\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config validate\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"common-file-locations\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon File Locations\u003c/span\u003e \u003ca href=\"#common-file-locations\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePurpose\u003c/th\u003e\n\u003cth\u003eDefault Location\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eConfiguration\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./markata-go.toml\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eContent\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./posts/**/*.md\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTemplates\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./templates/\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eStatic assets\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./static/\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuild output\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./public/\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCustom CSS\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./static/custom.css\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext Steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/docs/getting-started/\"\u003eGetting Started\u003c/a\u003e\u003c/strong\u003e - Full installation tutorial\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfiguration Guide\u003c/a\u003e\u003c/strong\u003e - Complete config reference\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/docs/troubleshooting/\"\u003eTroubleshooting\u003c/a\u003e\u003c/strong\u003e - Detailed problem solutions\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/docs/guides/\"\u003eGuides Hub\u003c/a\u003e\u003c/strong\u003e - Learning paths and all guides\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nA quick reference for common markata-go commands, configuration snippets, and troubleshooting tips.\n\n---\n\n## Prerequisites\n\nBefore using this guide, you should have:\n- markata-go installed ([Installation Guide](/docs/getting-started/\u003ca href=\"/tags/installation/\" class=\"hashtag-tag\" data-tag=\"installation\" data-count=1 data-reading-time=2 data-reading-time-text=\"2 minutes\"\u003e#installation\u003c/a\u003e))\n- A basic understanding of TOML configuration format\n\n---\n\n## CLI Commands\n\n### Build and Serve\n\n```bash\n# Build site\nmarkata-go build\n\n# Build with clean output directory\nmarkata-go build --clean\n\n# Build to custom output directory\nmarkata-go build -o dist\n\n# Start development server with live reload\nmarkata-go serve\n\n# Serve on custom port\nmarkata-go serve -p 3000\n\n# Serve with verbose output\nmarkata-go serve -v\n```\n\n### Content Creation\n\n```bash\n# Create a new post\nmarkata-go new \"My Post Title\"\n\n# Create with specific template\nmarkata-go new \"Tutorial\" -t tutorial\n\n# Create in specific directory\nmarkata-go new \"About\" --dir pages\n\n# Create as published (not draft)\nmarkata-go new \"Announcement\" --draft=false\n\n# List available templates\nmarkata-go new --list\n```\n\n### Configuration\n\n```bash\n# Initialize config file\nmarkata-go config init\n\n# Show resolved configuration\nmarkata-go config show\n\n# Show as JSON\nmarkata-go config show --json\n\n# Get specific value\nmarkata-go config get output_dir\nmarkata-go config get glob.patterns\n\n# Validate configuration\nmarkata-go config validate\n```\n\n### Themes and Palettes\n\n```bash\n# List available palettes\nmarkata-go palette list\n\n# Show palette details\nmarkata-go palette info catppuccin-mocha\n\n# Check accessibility\nmarkata-go palette check catppuccin-mocha\n\n# Export palette as CSS\nmarkata-go palette export catppuccin-mocha --format css\n\n# Clone a palette for customization\nmarkata-go palette clone catppuccin-mocha --name \"my-theme\"\n```\n\n---\n\n## Rich Markdown icon shortcuts\n\nUse the existing Lucide shortcode in any Markdown post:\n\n````markdown\n:lucide-rocket: Deployment\n\n::: md-feature\n\n:::: md-feature-icon\n:lucide-rocket:\n\n::::\n\n:::: md-feature-body\n### Verify production\nConfirm the deployed image, with visible text for accessibility.\n\n::::\n\n:::\n````\n\nCombine `md-icon` with `md-card` for centered icon cards. See\n[Icon Shortcodes](/docs/guides/icons/) and\n[Markdown Containers](/docs/guides/markdown-containers/). Agents should read\nthe bundled skill's `topics/rich-markdown.md` before inventing custom icon\ncode.\n\n---\n\n## Configuration Snippets\n\n### Minimal Site Config\n\n```toml\n[markata-go]\ntitle = \"My Site\"\nurl = \"https://example.com\"\noutput_dir = \"public\"\n\n[markata-go.glob]\npatterns = [\"posts/**/*.md\"]\n```\n\n### Blog with RSS\n\n```toml\n[markata-go]\ntitle = \"My Blog\"\nurl = \"https://myblog.com\"\noutput_dir = \"public\"\n\n[markata-go.glob]\npatterns = [\"posts/**/*.md\", \"pages/*.md\"]\n\n[[markata-go.feeds]]\nslug = \"blog\"\ntitle = \"Blog\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\n\n[markata-go.feeds.formats]\nhtml = true\nrss = true\natom = true\n```\n\n### Documentation Site\n\n```toml\n[markata-go]\ntitle = \"Project Docs\"\nurl = \"https://docs.example.com\"\noutput_dir = \"site\"\n\n[markata-go.glob]\npatterns = [\"docs/**/*.md\"]\n\n[markata-go.markdown]\nextensions = [\"tables\", \"tasklist\"]\n\n[markata-go.components.doc_sidebar]\nenabled = true\nposition = \"right\"\nmin_depth = 2\nmax_depth = 4\n\n[search]\nenabled = true\nposition = \"navbar\"\n```\n\n### Custom Theme\n\n```toml\n[markata-go.theme]\npalette = \"catppuccin-mocha\"\ncustom_css = \"custom.css\"\n\n[markata-go.theme.variables]\n\"--color-primary\" = \"#8b5cf6\"\n\"--content-width\" = \"800px\"\n```\n\n### Navigation Config\n\n```toml\n[markata-go.components.nav]\nenabled = true\nposition = \"header\"\n\n[[markata-go.components.nav.items]]\nlabel = \"Home\"\nurl = \"/\"\n\n[[markata-go.components.nav.items]]\nlabel = \"Blog\"\nurl = \"/blog/\"\n\n[[markata-go.components.nav.items]]\nlabel = \"GitHub\"\nurl = \"https://github.com/user\"\nexternal = true\n```\n\n---\n\n## Frontmatter Snippets\n\n### Basic Post\n\n```yaml\n---\ntitle: \"My Post\"\ndate: 2026-01-24\npublished: true\ntags:\n  - topic\n---\n```\n\n### Full Post with Custom Fields\n\n```yaml\n---\ntitle: \"Complete Guide to X\"\nslug: \"guide-to-x\"\ndate: 2026-01-24\npublished: true\ntags:\n  - tutorial\n  - guide\ndescription: \"A comprehensive guide covering everything about X.\"\ntemplate: \"tutorial.html\"\n\n# Custom fields (available via post.Extra)\nauthor: \"Jane Doe\"\nreading_time: \"10 min\"\nfeatured: true\nseries: \"X Fundamentals\"\nseries_order: 1\n---\n```\n\n### Draft Post\n\n```yaml\n---\ntitle: \"Work in Progress\"\ndate: 2026-01-24\npublished: false\ndraft: true\n---\n```\n\n### Landing Page\n\n```yaml\n---\ntitle: \"Welcome\"\nslug: \"\"\npublished: true\ntemplate: \"landing.html\"\n---\n```\n\n---\n\n## Filter Expressions\n\nCommon filter expressions for feed configuration:\n\n```toml\n# Published posts only\nfilter = \"published == True\"\n\n# Exclude drafts\nfilter = \"published == True and draft == False\"\n\n# Posts with specific tag\nfilter = \"'tutorial' in tags\"\n\n# Multiple tags (OR)\nfilter = \"'python' in tags or 'go' in tags\"\n\n# Date range\nfilter = \"date \u003e= '2024-01-01' and date \u003c '2025-01-01'\"\n\n# No future posts\nfilter = \"published == True and date \u003c= today\"\n\n# Featured posts\nfilter = \"published == True and featured == True\"\n\n# By author (custom field)\nfilter = \"author == 'Jane Doe'\"\n\n# Slug prefix (for sections)\nfilter = \"slug.startswith('tutorials/')\"\n```\n\n---\n\n## Template Snippets\n\n### Date Formatting\n\n```django\n{{ post.Date|date_format:\"January 2, 2006\" }}\n{{ post.Date|date_format:\"2006-01-02\" }}\n{{ post.Date|rss_date }}\n{{ post.Date|atom_date }}\n```\n\n### Conditional Content\n\n```django\n{% if post.Tags %}\n\u003cul class=\"tags\"\u003e\n  {% for tag in post.Tags %}\n  \u003cli\u003e\u003ca href=\"/tags/{{ tag|slugify }}/\"\u003e{{ tag }}\u003c/a\u003e\u003c/li\u003e\n  {% endfor %}\n\u003c/ul\u003e\n{% endif %}\n```\n\n### Custom Field Access\n\n```django\n{% if post.Extra.featured %}\n\u003cspan class=\"badge\"\u003eFeatured\u003c/span\u003e\n{% endif %}\n\n{% if post.Extra.author %}\n\u003cp\u003eBy {{ post.Extra.author }}\u003c/p\u003e\n{% endif %}\n```\n\n### Pagination\n\n```django\n{% if page.HasPrev or page.HasNext %}\n\u003cnav class=\"pagination\"\u003e\n  {% if page.HasPrev %}\n  \u003ca href=\"{{ page.PrevURL }}\"\u003ePrevious\u003c/a\u003e\n  {% endif %}\n  \u003cspan\u003ePage {{ page.Number }}\u003c/span\u003e\n  {% if page.HasNext %}\n  \u003ca href=\"{{ page.NextURL }}\"\u003eNext\u003c/a\u003e\n  {% endif %}\n\u003c/nav\u003e\n{% endif %}\n```\n\n---\n\n## Environment Variables\n\nOverride any config with `MARKATA_GO_` prefix:\n\n```bash\n# Core settings\nexport MARKATA_GO_OUTPUT_DIR=dist\nexport MARKATA_GO_URL=https://example.com\nexport MARKATA_GO_TITLE=\"My Site\"\n\n# Build with overrides\nMARKATA_GO_URL=https://staging.example.com markata-go build\n```\n\n---\n\n## Quick Troubleshooting\n\n### Site Not Updating\n\n```bash\n# Clean build\nmarkata-go build --clean\n\n# Clear browser cache or use incognito mode\n```\n\n### Posts Not Appearing\n\n1. Check frontmatter: `published: true` must be set\n2. Check filter: Ensure feed filter matches your posts\n3. Check date: Future dates won't appear with `date \u003c= today` filter\n\n```bash\n# Validate config\nmarkata-go config validate\n\n# Check resolved config\nmarkata-go config show\n```\n\n### RSS Feed Empty\n\n1. Verify RSS is enabled in feed formats:\n   ```toml\n   [markata-go.feeds.formats]\n   rss = true\n   ```\n2. Check that posts match the feed filter\n3. Ensure `url` is set in config (required for absolute URLs)\n\n### Template Not Found\n\n1. Check template path in frontmatter matches file name\n2. Verify file exists in `templates/` directory\n3. Include `.html` extension: `template: \"custom.html\"`\n\n### Styles Not Loading\n\n1. Check `static/` directory contains CSS files\n2. Verify `assets_dir` setting if using custom location\n3. Check browser console for 404 errors\n\n### Build Fails\n\n```bash\n# Verbose output for debugging\nmarkata-go build -v\n\n# Validate configuration first\nmarkata-go config validate\n```\n\n---\n\n## Common File Locations\n\n| Purpose | Default Location |\n|---------|-----------------|\n| Configuration | `./markata-go.toml` |\n| Content | `./posts/**/*.md` |\n| Templates | `./templates/` |\n| Static assets | `./static/` |\n| Build output | `./public/` |\n| Custom CSS | `./static/custom.css` |\n\n---\n\n## Next Steps\n\n- **[Getting Started](/docs/getting-started/)** - Full installation tutorial\n- **[Configuration Guide](/docs/guides/configuration/)** - Complete config reference\n- **[Troubleshooting](/docs/troubleshooting/)** - Detailed problem solutions\n- **[Guides Hub](/docs/guides/)** - Learning paths and all guides\n",
      "summary": "Common commands, configuration snippets, and troubleshooting tips for markata-go",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "documentation",
        "guides",
        "reference"
      ]
    },
    {
      "id": "https://markata.dev/qa-troubleshooting/",
      "url": "https://markata.dev/qa-troubleshooting/",
      "title": "Troubleshooting Quality Checks",
      "content_html": "\u003cp\u003eThis guide covers common issues you may encounter when setting up and running content quality checks for your markata-go site, along with their solutions.\u003c/p\u003e\n\u003ch2 id=\"table-of-contents\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTable of Contents\u003c/span\u003e \u003ca href=\"#table-of-contents\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#pre-commit-hook-issues\"\u003ePre-commit Hook Issues\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#markdown-linting-issues\"\u003eMarkdown Linting Issues\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#yamlfrontmatter-issues\"\u003eYAML/Frontmatter Issues\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#link-checking-issues\"\u003eLink Checking Issues\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#cicd-pipeline-issues\"\u003eCI/CD Pipeline Issues\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#performance-issues\"\u003ePerformance Issues\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#migration-from-other-tools\"\u003eMigration from Other Tools\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"pre-commit-hook-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePre-commit Hook Issues\u003c/span\u003e \u003ca href=\"#pre-commit-hook-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"hooks-not-running\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHooks Not Running\u003c/span\u003e \u003ca href=\"#hooks-not-running\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Pre-commit hooks don\u0026rsquo;t execute when you commit.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolutions:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eReinstall hooks:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epre-commit uninstall\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epre-commit install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerify git hooks directory:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003els -la .git/hooks/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Should see pre-commit -\u0026gt; /path/to/pre-commit-hook\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck pre-commit installation:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epre-commit --version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# If not found, reinstall: pip install pre-commit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerify configuration file exists:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003els -la .pre-commit-config.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"hook-fails-with-command-not-found\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHook Fails with “Command Not Found”\u003c/span\u003e \u003ca href=\"#hook-fails-with-command-not-found\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Hook fails because it can\u0026rsquo;t find a command like \u003ccode\u003emarkdownlint\u003c/code\u003e or \u003ccode\u003eyamllint\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolutions:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eFor system hooks\u003c/strong\u003e, install the tool globally:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# markdownlint\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpm install -g markdownlint-cli\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# yamllint\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install yamllint\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUse repository-based hooks\u003c/strong\u003e instead of local hooks:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Instead of local hook:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://github.com/igorshubovych/markdownlint-cli\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erev\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev0.42.0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkdownlint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck PATH in your shell:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"nv\"\u003e$PATH\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewhich markdownlint\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"hooks-running-too-slowly\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHooks Running Too Slowly\u003c/span\u003e \u003ca href=\"#hooks-running-too-slowly\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Commits take a long time because hooks are slow.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolutions:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eLimit files processed:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkdownlint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e^docs/ \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Only check docs directory\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSkip slow hooks for WIP commits:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eSKIP\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003echeck-links git commit -m \u003cspan class=\"s2\"\u003e\u0026#34;WIP: quick save\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eMove slow checks to CI only:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# In .pre-commit-config.yaml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003echeck-links\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003estages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003epush] \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Only run on push, not commit\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eClear pre-commit cache:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epre-commit clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epre-commit gc\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"skipping-hooks-temporarily\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSkipping Hooks Temporarily\u003c/span\u003e \u003ca href=\"#skipping-hooks-temporarily\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eWhen to skip:\u003c/strong\u003e Emergency fixes, work-in-progress commits, or when hooks have false positives.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Skip all hooks (use sparingly!)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit commit --no-verify -m \u003cspan class=\"s2\"\u003e\u0026#34;Emergency fix\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Skip specific hooks\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eSKIP\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003emarkdownlint,check-links git commit -m \u003cspan class=\"s2\"\u003e\u0026#34;Quick fix\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Skip hooks for a single file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit add -f file-with-issues.md\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eWarning:\u003c/strong\u003e Skipping hooks bypasses quality checks. Use CI/CD as a safety net.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"markdown-linting-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMarkdown Linting Issues\u003c/span\u003e \u003ca href=\"#markdown-linting-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"md013-line-length-errors\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMD013: Line Length Errors\u003c/span\u003e \u003ca href=\"#md013-line-length-errors\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e \u003ccode\u003eMD013/line-length: Line length [expected: 80, actual: 150]\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolutions:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eDisable for prose\u003c/strong\u003e (recommended for content sites):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD013\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eIncrease line length limit:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD013\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;line_length\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e120\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;code_blocks\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;tables\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eDisable for specific file:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!-- markdownlint-disable-file MD013 --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# My Document\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis file allows long lines...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"md033-inline-html-warnings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMD033: Inline HTML Warnings\u003c/span\u003e \u003ca href=\"#md033-inline-html-warnings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e \u003ccode\u003eMD033/no-inline-html: Inline HTML [Element: details]\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolutions:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eAllow specific HTML elements:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD033\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;allowed_elements\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;details\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;summary\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;kbd\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;br\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;sup\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;sub\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;img\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eDisable for a section:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!-- markdownlint-disable MD033 --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;details\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;summary\u0026gt;Click to expand\u0026lt;/summary\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent here...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;/details\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!-- markdownlint-enable MD033 --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eDisable entirely\u003c/strong\u003e (not recommended):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD033\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"md041-first-line-should-be-heading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMD041: First Line Should Be Heading\u003c/span\u003e \u003ca href=\"#md041-first-line-should-be-heading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e \u003ccode\u003eMD041/first-line-heading: First line in file should be a top-level heading\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhy it happens:\u003c/strong\u003e Files with YAML frontmatter trigger this because the first content line isn\u0026rsquo;t a heading.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD041\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr configure to recognize frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD025\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;front_matter_title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^\\\\s*title\\\\s*[:=]\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD041\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"md024-duplicate-headings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMD024: Duplicate Headings\u003c/span\u003e \u003ca href=\"#md024-duplicate-headings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e \u003ccode\u003eMD024/no-duplicate-heading: Multiple headings with the same content\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e Allow duplicate headings for siblings only:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD024\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;siblings_only\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis allows:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Installation  \u0026lt;!-- OK: different parent --\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Step 1\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Configuration\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Step 1  \u0026lt;!-- OK: different parent section --\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"false-positives-in-code-blocks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFalse Positives in Code Blocks\u003c/span\u003e \u003ca href=\"#false-positives-in-code-blocks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Linting errors appear for content inside code blocks.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolutions:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eEnsure code blocks are properly fenced:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e```bash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# This is code, not a heading\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eecho \u0026#34;hello\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre\u003e\u003ccode\u003e\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck for missing language identifier:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD040\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e  \u003cspan class=\"c1\"\u003e// Enforces language specification\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerify backtick count matches:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e``\u003cspan class=\"sb\"\u003e`python\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003ecode here\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e`\u003c/span\u003e``  \u003cspan class=\"cm\"\u003e\u0026lt;!-- Must have same number of backticks --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"yaml-frontmatter-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eYAML/Frontmatter Issues\u003c/span\u003e \u003ca href=\"#yaml-frontmatter-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"invalid-yaml-syntax\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInvalid YAML Syntax\u003c/span\u003e \u003ca href=\"#invalid-yaml-syntax\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e \u003ccode\u003eyaml: line 3: mapping values are not allowed here\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCommon causes and fixes:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUnquoted special characters:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Wrong\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nt\"\u003eMy Post\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eA Journey\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Correct\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Post: A Journey\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eImproper indentation:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Wrong (tabs)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e- \u003cspan class=\"l\"\u003edocumentation\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Correct (2 spaces)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003edocumentation\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eMissing quotes around dates:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Wrong (may be interpreted as number)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1.0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Correct\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1.0\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"frontmatter-not-detected\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFrontmatter Not Detected\u003c/span\u003e \u003ca href=\"#frontmatter-not-detected\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Frontmatter is treated as content, not metadata.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCauses:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eNo opening delimiter on first line:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!-- Wrong: whitespace before --- --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e ---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etitle: My Post\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!-- Correct: --- must be on line 1 --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etitle: My Post\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eWrong delimiter:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!-- Wrong --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etitle: My Post\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!-- Correct: exactly three dashes --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etitle: My Post\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eBOM or hidden characters:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check for BOM\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efile your-file.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Should show: UTF-8 Unicode text\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# NOT: UTF-8 Unicode (with BOM) text\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Remove BOM\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esed -i \u003cspan class=\"s1\"\u003e\u0026#39;1s/^\\xEF\\xBB\\xBF//\u0026#39;\u003c/span\u003e your-file.md\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"required-field-missing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRequired Field Missing\u003c/span\u003e \u003ca href=\"#required-field-missing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Build fails with \u0026ldquo;missing required field: title\u0026rdquo;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolutions:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eAdd missing field:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Post Title\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2026-01-24\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck field spelling:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Wrong\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitel\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Correct\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck for invisible characters:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# View hex dump of frontmatter\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehead -5 your-file.md \u003cspan class=\"p\"\u003e|\u003c/span\u003e xxd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"date-format-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDate Format Issues\u003c/span\u003e \u003ca href=\"#date-format-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e \u003ccode\u003eInvalid date format\u003c/code\u003e or dates not sorting correctly.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCorrect formats:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# ISO 8601 (recommended)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2026-01-24\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# With time\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2026-01-24T10:30:00\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# With timezone\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2026-01-24T10:30:00\u003c/span\u003e\u003cspan class=\"m\"\u003e-05\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"m\"\u003e00\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eWrong formats:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Wrong: needs quotes or different format\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eJanuary 24, 2026\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Wrong: ambiguous\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e01\u003c/span\u003e\u003cspan class=\"l\"\u003e/24/2026\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"link-checking-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLink Checking Issues\u003c/span\u003e \u003ca href=\"#link-checking-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"rate-limiting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRate Limiting\u003c/span\u003e \u003ca href=\"#rate-limiting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Link checks fail with \u003ccode\u003e429 Too Many Requests\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolutions:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eConfigure retry behavior:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;retryOn429\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;retryCount\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;fallbackRetryDelay\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;30s\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eAdd delays between requests:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .lychee.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_concurrency\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edelay\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eExclude problematic domains:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;ignorePatterns\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^https://twitter\\\\.com\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^https://x\\\\.com\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"false-positives-on-valid-links\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFalse Positives on Valid Links\u003c/span\u003e \u003ca href=\"#false-positives-on-valid-links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Link checker reports broken links that work in browser.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCommon causes:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eBot detection:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .lychee.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003euser_agent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Mozilla/5.0 (compatible; link-checker)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eAuthentication required:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;ignorePatterns\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^https://private-site\\\\.com\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eJavaScript-rendered content:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLink checkers can\u0026rsquo;t execute JavaScript\u003c/li\u003e\n\u003cli\u003eAdd to ignore list if the link is valid\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eRedirect chains:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;aliveStatusCodes\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e200\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e206\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e301\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e302\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e307\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e308\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"internal-links-not-resolving\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInternal Links Not Resolving\u003c/span\u003e \u003ca href=\"#internal-links-not-resolving\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Relative links like \u003ccode\u003e/docs/guide/\u003c/code\u003e reported as broken.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolutions:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eConfigure base URL:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;replacementPatterns\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;replacement\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eRun link checker on built output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build first\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check built HTML\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elychee ./public/**/*.html\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUse relative path resolution:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .lychee.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebase\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"mailto-and-tel-links\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMailto and Tel Links\u003c/span\u003e \u003ca href=\"#mailto-and-tel-links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e \u003ccode\u003emailto:\u003c/code\u003e and \u003ccode\u003etel:\u003c/code\u003e links reported as broken.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e Exclude these patterns:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;ignorePatterns\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^mailto:\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^tel:\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr in lychee:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .lychee.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;^mailto:\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;^tel:\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"ci-cd-pipeline-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCI/CD Pipeline Issues\u003c/span\u003e \u003ca href=\"#ci-cd-pipeline-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"pipeline-not-triggering\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePipeline Not Triggering\u003c/span\u003e \u003ca href=\"#pipeline-not-triggering\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Push/MR doesn\u0026rsquo;t start the pipeline.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eGitHub Actions solutions:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck workflow file location:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e.github/workflows/quality.yml  # Correct\n.github/workflow/quality.yml   # Wrong (missing 's')\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerify trigger configuration:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck for YAML syntax errors:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Validate workflow file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eyamllint .github/workflows/quality.yml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eGitLab CI solutions:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck file name:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e.gitlab-ci.yml  # Correct\ngitlab-ci.yml   # Wrong (missing leading dot)\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eValidate configuration:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# In GitLab UI: CI/CD \u0026gt; Pipelines \u0026gt; CI Lint\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Or use API\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"job-fails-with-exit-code-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJob Fails with Exit Code 1\u003c/span\u003e \u003ca href=\"#job-fails-with-exit-code-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Job fails but output doesn\u0026rsquo;t show clear error.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolutions:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eAdd verbose output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkdownlint \u0026#39;**/*.md\u0026#39; --verbose\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck previous command exit codes:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003eset -e \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Exit on first error\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkdownlint \u0026#39;**/*.md\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Lint passed\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUse \u003ccode\u003e|| true\u003c/code\u003e for non-blocking checks:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkdownlint \u0026#39;**/*.md\u0026#39; || true \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Continue even if fails\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"artifacts-not-available\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eArtifacts Not Available\u003c/span\u003e \u003ca href=\"#artifacts-not-available\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Built files not available in later jobs.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eGitHub Actions:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/upload-artifact@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etest\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/download-artifact@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eGitLab CI:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eexpire_in\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehour\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etest\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003ejob\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"cache-not-working\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCache Not Working\u003c/span\u003e \u003ca href=\"#cache-not-working\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Dependencies re-download every run.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eGitHub Actions:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-node@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003enode-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;20\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;npm\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Enable built-in caching\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eGitLab CI:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003enpm_config_cache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PROJECT_DIR/.npm\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_REF_SLUG\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003e.npm/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epolicy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epull-push \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Important: must be pull-push\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"performance-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePerformance Issues\u003c/span\u003e \u003ca href=\"#performance-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"pre-commit-runs-slowly\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePre-commit Runs Slowly\u003c/span\u003e \u003ca href=\"#pre-commit-runs-slowly\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eDiagnosis:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Time individual hooks\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003etime\u003c/span\u003e pre-commit run markdownlint --all-files\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003etime\u003c/span\u003e pre-commit run yamllint --all-files\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOptimizations:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eLimit scope:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkdownlint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e^docs/ \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Only docs directory\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUse faster alternatives:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003emarkdownlint-cli2\u003c/code\u003e is faster than \u003ccode\u003emarkdownlint-cli\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elychee\u003c/code\u003e is faster than \u003ccode\u003emarkdown-link-check\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSkip expensive checks on commit:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003echeck-links\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003estages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003epush] \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Only on push\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"ci-cd-takes-too-long\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCI/CD Takes Too Long\u003c/span\u003e \u003ca href=\"#ci-cd-takes-too-long\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eOptimizations:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eRun jobs in parallel:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# GitHub Actions\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003elint\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# No dependency = parallel\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUse caching effectively:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/cache@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e~/.npm\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enpm-${{ hashFiles(\u0026#39;package-lock.json\u0026#39;) }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eOnly run on relevant changes:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s1\"\u003e\u0026#39;**/*.md\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s1\"\u003e\u0026#39;.markdownlint.json\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUse lightweight images:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Instead of: image: node:20\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enode:20-alpine \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Much smaller\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"migration-from-other-tools\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMigration from Other Tools\u003c/span\u003e \u003ca href=\"#migration-from-other-tools\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"from-jekyll\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFrom Jekyll\u003c/span\u003e \u003ca href=\"#from-jekyll\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eFrontmatter differences:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Jekyll\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003elayout\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epost\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eMy Post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecategories\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eblog\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2026-01-24\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003eblog\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eConversion script:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Convert Jekyll frontmatter to markata-go format\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e file in _posts/*.md\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e# Add published: true if missing\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eif\u003c/span\u003e ! grep -q \u003cspan class=\"s2\"\u003e\u0026#34;^published:\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    sed -i \u003cspan class=\"s1\"\u003e\u0026#39;/^---$/,/^---$/{/^title:/a published: true\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    }\u0026#39;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"from-hugo\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFrom Hugo\u003c/span\u003e \u003ca href=\"#from-hugo\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eFrontmatter differences:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Hugo\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2026-01-24T10:00:00\u003c/span\u003e\u003cspan class=\"m\"\u003e-05\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"m\"\u003e00\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edraft\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2026-01-24\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eKey changes:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003edraft: true\u003c/code\u003e becomes \u003ccode\u003epublished: false\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eDate format simplified (time optional)\u003c/li\u003e\n\u003cli\u003eRemove Hugo-specific fields like \u003ccode\u003eweight\u003c/code\u003e, \u003ccode\u003etype\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"from-gatsby-mdx\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFrom Gatsby/MDX\u003c/span\u003e \u003ca href=\"#from-gatsby-mdx\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eMDX components won\u0026rsquo;t work directly.\u003c/strong\u003e Convert to standard Markdown:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Gatsby MDX\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eCallout\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;info\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eImportant\u003c/span\u003e \u003cspan class=\"nx\"\u003einformation\u003c/span\u003e \u003cspan class=\"nx\"\u003ehere\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eCallout\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// markata-go Markdown\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"nx\"\u003eInfo\u003c/span\u003e\u003cspan class=\"o\"\u003e:**\u003c/span\u003e \u003cspan class=\"nx\"\u003eImportant\u003c/span\u003e \u003cspan class=\"nx\"\u003einformation\u003c/span\u003e \u003cspan class=\"nx\"\u003ehere\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr use HTML:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003edetails\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esummary\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eImportant information\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esummary\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent here...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003edetails\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"getting-help\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGetting Help\u003c/span\u003e \u003ca href=\"#getting-help\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf you can\u0026rsquo;t resolve an issue:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck existing issues:\u003c/strong\u003e Search \u003ca href=\"https://github.com/waylonwalker/markata-go/issues\"\u003eGitHub Issues\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eEnable verbose output:\u003c/strong\u003e Add \u003ccode\u003e--verbose\u003c/code\u003e or \u003ccode\u003e-v\u003c/code\u003e flags to commands\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eIsolate the problem:\u003c/strong\u003e Create a minimal reproduction case\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eGather information:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# System info\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euname -a\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enode --version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython --version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Tool versions\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epre-commit --version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkdownlint --version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eOpen an issue\u003c/strong\u003e with:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWhat you expected\u003c/li\u003e\n\u003cli\u003eWhat actually happened\u003c/li\u003e\n\u003cli\u003eSteps to reproduce\u003c/li\u003e\n\u003cli\u003eRelevant configuration files\u003c/li\u003e\n\u003cli\u003eError messages (full output)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"pre-commit-hooks/\"\u003ePre-commit Hooks\u003c/a\u003e - Hook setup and configuration\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"github-actions/\"\u003eGitHub Actions\u003c/a\u003e - CI/CD for GitHub\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"gitlab-ci/\"\u003eGitLab CI\u003c/a\u003e - CI/CD for GitLab\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"custom-rules/\"\u003eCustom Rules\u003c/a\u003e - Creating custom linting rules\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nThis guide covers common issues you may encounter when setting up and running content quality checks for your markata-go site, along with their solutions.\n\n## Table of Contents\n\n- [Pre-commit Hook Issues](#pre-commit-hook-issues)\n- [Markdown Linting Issues](#markdown-linting-issues)\n- [YAML/Frontmatter Issues](#yamlfrontmatter-issues)\n- [Link Checking Issues](#link-checking-issues)\n- [CI/CD Pipeline Issues](#cicd-pipeline-issues)\n- [Performance Issues](#performance-issues)\n- [Migration from Other Tools](#migration-from-other-tools)\n\n---\n\n## Pre-commit Hook Issues\n\n### Hooks Not Running\n\n**Symptom:** Pre-commit hooks don't execute when you commit.\n\n**Solutions:**\n\n1. **Reinstall hooks:**\n   ```bash\n   pre-commit uninstall\n   pre-commit install\n   ```\n\n2. **Verify git hooks directory:**\n   ```bash\n   ls -la .git/hooks/\n   # Should see pre-commit -\u003e /path/to/pre-commit-hook\n   ```\n\n3. **Check pre-commit installation:**\n   ```bash\n   pre-commit --version\n   # If not found, reinstall: pip install pre-commit\n   ```\n\n4. **Verify configuration file exists:**\n   ```bash\n   ls -la .pre-commit-config.yaml\n   ```\n\n### Hook Fails with \"Command Not Found\"\n\n**Symptom:** Hook fails because it can't find a command like `markdownlint` or `yamllint`.\n\n**Solutions:**\n\n1. **For system hooks**, install the tool globally:\n   ```bash\n   # markdownlint\n   npm install -g markdownlint-cli\n\n   # yamllint\n   pip install yamllint\n   ```\n\n2. **Use repository-based hooks** instead of local hooks:\n   ```yaml\n   # Instead of local hook:\n   - repo: https://github.com/igorshubovych/markdownlint-cli\n     rev: v0.42.0\n     hooks:\n       - id: markdownlint\n   ```\n\n3. **Check PATH in your shell:**\n   ```bash\n   echo $PATH\n   which markdownlint\n   ```\n\n### Hooks Running Too Slowly\n\n**Symptom:** Commits take a long time because hooks are slow.\n\n**Solutions:**\n\n1. **Limit files processed:**\n   ```yaml\n   hooks:\n     - id: markdownlint\n       files: ^docs/  # Only check docs directory\n   ```\n\n2. **Skip slow hooks for WIP commits:**\n   ```bash\n   SKIP=check-links git commit -m \"WIP: quick save\"\n   ```\n\n3. **Move slow checks to CI only:**\n   ```yaml\n   # In .pre-commit-config.yaml\n   hooks:\n     - id: check-links\n       stages: [push]  # Only run on push, not commit\n   ```\n\n4. **Clear pre-commit cache:**\n   ```bash\n   pre-commit clean\n   pre-commit gc\n   ```\n\n### Skipping Hooks Temporarily\n\n**When to skip:** Emergency fixes, work-in-progress commits, or when hooks have false positives.\n\n```bash\n# Skip all hooks (use sparingly!)\ngit commit --no-verify -m \"Emergency fix\"\n\n# Skip specific hooks\nSKIP=markdownlint,check-links git commit -m \"Quick fix\"\n\n# Skip hooks for a single file\ngit add -f file-with-issues.md\n```\n\n**Warning:** Skipping hooks bypasses quality checks. Use CI/CD as a safety net.\n\n---\n\n## Markdown Linting Issues\n\n### MD013: Line Length Errors\n\n**Symptom:** `MD013/line-length: Line length [expected: 80, actual: 150]`\n\n**Solutions:**\n\n1. **Disable for prose** (recommended for content sites):\n   ```json\n   {\n     \"MD013\": false\n   }\n   ```\n\n2. **Increase line length limit:**\n   ```json\n   {\n     \"MD013\": {\n       \"line_length\": 120,\n       \"code_blocks\": false,\n       \"tables\": false\n     }\n   }\n   ```\n\n3. **Disable for specific file:**\n   ```markdown\n   \u003c!-- markdownlint-disable-file MD013 --\u003e\n\n   # My Document\n\n   This file allows long lines...\n   ```\n\n### MD033: Inline HTML Warnings\n\n**Symptom:** `MD033/no-inline-html: Inline HTML [Element: details]`\n\n**Solutions:**\n\n1. **Allow specific HTML elements:**\n   ```json\n   {\n     \"MD033\": {\n       \"allowed_elements\": [\n         \"details\", \"summary\", \"kbd\", \"br\",\n         \"sup\", \"sub\", \"img\", \"video\"\n       ]\n     }\n   }\n   ```\n\n2. **Disable for a section:**\n   ```markdown\n   \u003c!-- markdownlint-disable MD033 --\u003e\n   \u003cdetails\u003e\n   \u003csummary\u003eClick to expand\u003c/summary\u003e\n\n   Content here...\n\n   \u003c/details\u003e\n   \u003c!-- markdownlint-enable MD033 --\u003e\n   ```\n\n3. **Disable entirely** (not recommended):\n   ```json\n   {\n     \"MD033\": false\n   }\n   ```\n\n### MD041: First Line Should Be Heading\n\n**Symptom:** `MD041/first-line-heading: First line in file should be a top-level heading`\n\n**Why it happens:** Files with YAML frontmatter trigger this because the first content line isn't a heading.\n\n**Solution:**\n\n```json\n{\n  \"MD041\": false\n}\n```\n\nOr configure to recognize frontmatter:\n\n```json\n{\n  \"MD025\": {\n    \"front_matter_title\": \"^\\\\s*title\\\\s*[:=]\"\n  },\n  \"MD041\": false\n}\n```\n\n### MD024: Duplicate Headings\n\n**Symptom:** `MD024/no-duplicate-heading: Multiple headings with the same content`\n\n**Solution:** Allow duplicate headings for siblings only:\n\n```json\n{\n  \"MD024\": {\n    \"siblings_only\": true\n  }\n}\n```\n\nThis allows:\n```markdown\n## Installation  \u003c!-- OK: different parent --\u003e\n\n### Step 1\n\n## Configuration\n\n### Step 1  \u003c!-- OK: different parent section --\u003e\n```\n\n### False Positives in Code Blocks\n\n**Symptom:** Linting errors appear for content inside code blocks.\n\n**Solutions:**\n\n1. **Ensure code blocks are properly fenced:**\n   ```markdown\n   ```bash\n   # This is code, not a heading\n   echo \"hello\"\n   ```\n   ```\n\n2. **Check for missing language identifier:**\n   ```json\n   {\n     \"MD040\": true  // Enforces language specification\n   }\n   ```\n\n3. **Verify backtick count matches:**\n   ````markdown\n   ```python\n   code here\n   ```  \u003c!-- Must have same number of backticks --\u003e\n   ````\n\n---\n\n## YAML/Frontmatter Issues\n\n### Invalid YAML Syntax\n\n**Symptom:** `yaml: line 3: mapping values are not allowed here`\n\n**Common causes and fixes:**\n\n1. **Unquoted special characters:**\n   ```yaml\n   # Wrong\n   title: My Post: A Journey\n\n   # Correct\n   title: \"My Post: A Journey\"\n   ```\n\n2. **Improper indentation:**\n   ```yaml\n   # Wrong (tabs)\n   tags:\n   \t- documentation\n\n   # Correct (2 spaces)\n   tags:\n     - documentation\n   ```\n\n3. **Missing quotes around dates:**\n   ```yaml\n   # Wrong (may be interpreted as number)\n   version: 1.0\n\n   # Correct\n   version: \"1.0\"\n   ```\n\n### Frontmatter Not Detected\n\n**Symptom:** Frontmatter is treated as content, not metadata.\n\n**Causes:**\n\n1. **No opening delimiter on first line:**\n   ```markdown\n   \u003c!-- Wrong: whitespace before --- --\u003e\n    ---\n   title: My Post\n   ---\n\n   \u003c!-- Correct: --- must be on line 1 --\u003e\n   ---\n   title: My Post\n   ---\n   ```\n\n2. **Wrong delimiter:**\n   ```markdown\n   \u003c!-- Wrong --\u003e\n   ----\n   title: My Post\n   ----\n\n   \u003c!-- Correct: exactly three dashes --\u003e\n   ---\n   title: My Post\n   ---\n   ```\n\n3. **BOM or hidden characters:**\n   ```bash\n   # Check for BOM\n   file your-file.md\n   # Should show: UTF-8 Unicode text\n   # NOT: UTF-8 Unicode (with BOM) text\n\n   # Remove BOM\n   sed -i '1s/^\\xEF\\xBB\\xBF//' your-file.md\n   ```\n\n### Required Field Missing\n\n**Symptom:** Build fails with \"missing required field: title\"\n\n**Solutions:**\n\n1. **Add missing field:**\n   ```yaml\n   ---\n   title: \"My Post Title\"\n   date: 2026-01-24\n   published: true\n   ---\n   ```\n\n2. **Check field spelling:**\n   ```yaml\n   # Wrong\n   titel: \"My Post\"\n\n   # Correct\n   title: \"My Post\"\n   ```\n\n3. **Check for invisible characters:**\n   ```bash\n   # View hex dump of frontmatter\n   head -5 your-file.md | xxd\n   ```\n\n### Date Format Issues\n\n**Symptom:** `Invalid date format` or dates not sorting correctly.\n\n**Correct formats:**\n\n```yaml\n# ISO 8601 (recommended)\ndate: 2026-01-24\n\n# With time\ndate: 2026-01-24T10:30:00\n\n# With timezone\ndate: 2026-01-24T10:30:00-05:00\n```\n\n**Wrong formats:**\n\n```yaml\n# Wrong: needs quotes or different format\ndate: January 24, 2026\n\n# Wrong: ambiguous\ndate: 01/24/2026\n```\n\n---\n\n## Link Checking Issues\n\n### Rate Limiting\n\n**Symptom:** Link checks fail with `429 Too Many Requests`.\n\n**Solutions:**\n\n1. **Configure retry behavior:**\n   ```json\n   {\n     \"retryOn429\": true,\n     \"retryCount\": 5,\n     \"fallbackRetryDelay\": \"30s\"\n   }\n   ```\n\n2. **Add delays between requests:**\n   ```toml\n   # .lychee.toml\n   max_concurrency = 5\n   delay = 1\n   ```\n\n3. **Exclude problematic domains:**\n   ```json\n   {\n     \"ignorePatterns\": [\n       { \"pattern\": \"^https://twitter\\\\.com\" },\n       { \"pattern\": \"^https://x\\\\.com\" }\n     ]\n   }\n   ```\n\n### False Positives on Valid Links\n\n**Symptom:** Link checker reports broken links that work in browser.\n\n**Common causes:**\n\n1. **Bot detection:**\n   ```toml\n   # .lychee.toml\n   user_agent = \"Mozilla/5.0 (compatible; link-checker)\"\n   ```\n\n2. **Authentication required:**\n   ```json\n   {\n     \"ignorePatterns\": [\n       { \"pattern\": \"^https://private-site\\\\.com\" }\n     ]\n   }\n   ```\n\n3. **JavaScript-rendered content:**\n   - Link checkers can't execute JavaScript\n   - Add to ignore list if the link is valid\n\n4. **Redirect chains:**\n   ```json\n   {\n     \"aliveStatusCodes\": [200, 206, 301, 302, 307, 308]\n   }\n   ```\n\n### Internal Links Not Resolving\n\n**Symptom:** Relative links like `/docs/guide/` reported as broken.\n\n**Solutions:**\n\n1. **Configure base URL:**\n   ```json\n   {\n     \"replacementPatterns\": [\n       {\n         \"pattern\": \"^/\",\n         \"replacement\": \"https://example.com/\"\n       }\n     ]\n   }\n   ```\n\n2. **Run link checker on built output:**\n   ```bash\n   # Build first\n   markata-go build\n\n   # Check built HTML\n   lychee ./public/**/*.html\n   ```\n\n3. **Use relative path resolution:**\n   ```toml\n   # .lychee.toml\n   base = \"https://example.com\"\n   ```\n\n### Mailto and Tel Links\n\n**Symptom:** `mailto:` and `tel:` links reported as broken.\n\n**Solution:** Exclude these patterns:\n\n```json\n{\n  \"ignorePatterns\": [\n    { \"pattern\": \"^mailto:\" },\n    { \"pattern\": \"^tel:\" }\n  ]\n}\n```\n\nOr in lychee:\n\n```toml\n# .lychee.toml\nexclude = [\n  \"^mailto:\",\n  \"^tel:\",\n]\n```\n\n---\n\n## CI/CD Pipeline Issues\n\n### Pipeline Not Triggering\n\n**Symptom:** Push/MR doesn't start the pipeline.\n\n**GitHub Actions solutions:**\n\n1. **Check workflow file location:**\n   ```\n   .github/workflows/quality.yml  # Correct\n   .github/workflow/quality.yml   # Wrong (missing 's')\n   ```\n\n2. **Verify trigger configuration:**\n   ```yaml\n   on:\n     push:\n       branches: [main]\n     pull_request:\n       branches: [main]\n   ```\n\n3. **Check for YAML syntax errors:**\n   ```bash\n   # Validate workflow file\n   yamllint .github/workflows/quality.yml\n   ```\n\n**GitLab CI solutions:**\n\n1. **Check file name:**\n   ```\n   .gitlab-ci.yml  # Correct\n   gitlab-ci.yml   # Wrong (missing leading dot)\n   ```\n\n2. **Validate configuration:**\n   ```bash\n   # In GitLab UI: CI/CD \u003e Pipelines \u003e CI Lint\n   # Or use API\n   ```\n\n### Job Fails with Exit Code 1\n\n**Symptom:** Job fails but output doesn't show clear error.\n\n**Solutions:**\n\n1. **Add verbose output:**\n   ```yaml\n   script:\n     - markdownlint '**/*.md' --verbose\n   ```\n\n2. **Check previous command exit codes:**\n   ```yaml\n   script:\n     - set -e  # Exit on first error\n     - markdownlint '**/*.md'\n     - echo \"Lint passed\"\n   ```\n\n3. **Use `|| true` for non-blocking checks:**\n   ```yaml\n   script:\n     - markdownlint '**/*.md' || true  # Continue even if fails\n   ```\n\n### Artifacts Not Available\n\n**Symptom:** Built files not available in later jobs.\n\n**GitHub Actions:**\n\n```yaml\njobs:\n  build:\n    steps:\n      - uses: actions/upload-artifact@v4\n        with:\n          name: site\n          path: public/\n\n  test:\n    needs: build\n    steps:\n      - uses: actions/download-artifact@v4\n        with:\n          name: site\n          path: public/\n```\n\n**GitLab CI:**\n\n```yaml\nbuild:\n  artifacts:\n    paths:\n      - public/\n    expire_in: 1 hour\n\ntest:\n  needs:\n    - job: build\n      artifacts: true\n```\n\n### Cache Not Working\n\n**Symptom:** Dependencies re-download every run.\n\n**GitHub Actions:**\n\n```yaml\n- uses: actions/setup-node@v4\n  with:\n    node-version: '20'\n    cache: 'npm'  # Enable built-in caching\n```\n\n**GitLab CI:**\n\n```yaml\nvariables:\n  npm_config_cache: $CI_PROJECT_DIR/.npm\n\ncache:\n  key: $CI_COMMIT_REF_SLUG\n  paths:\n    - .npm/\n  policy: pull-push  # Important: must be pull-push\n```\n\n---\n\n## Performance Issues\n\n### Pre-commit Runs Slowly\n\n**Diagnosis:**\n\n```bash\n# Time individual hooks\ntime pre-commit run markdownlint --all-files\ntime pre-commit run yamllint --all-files\n```\n\n**Optimizations:**\n\n1. **Limit scope:**\n   ```yaml\n   hooks:\n     - id: markdownlint\n       files: ^docs/  # Only docs directory\n   ```\n\n2. **Use faster alternatives:**\n   - `markdownlint-cli2` is faster than `markdownlint-cli`\n   - `lychee` is faster than `markdown-link-check`\n\n3. **Skip expensive checks on commit:**\n   ```yaml\n   hooks:\n     - id: check-links\n       stages: [push]  # Only on push\n   ```\n\n### CI/CD Takes Too Long\n\n**Optimizations:**\n\n1. **Run jobs in parallel:**\n   ```yaml\n   # GitHub Actions\n   jobs:\n     lint:\n       runs-on: ubuntu-latest\n     build:\n       runs-on: ubuntu-latest\n       needs: []  # No dependency = parallel\n   ```\n\n2. **Use caching effectively:**\n   ```yaml\n   - uses: actions/cache@v4\n     with:\n       path: ~/.npm\n       key: npm-${{ hashFiles('package-lock.json') }}\n   ```\n\n3. **Only run on relevant changes:**\n   ```yaml\n   on:\n     push:\n       paths:\n         - '**/*.md'\n         - '.markdownlint.json'\n   ```\n\n4. **Use lightweight images:**\n   ```yaml\n   # Instead of: image: node:20\n   image: node:20-alpine  # Much smaller\n   ```\n\n---\n\n## Migration from Other Tools\n\n### From Jekyll\n\n**Frontmatter differences:**\n\n```yaml\n# Jekyll\n---\nlayout: post\ntitle: My Post\ncategories: blog\n---\n\n# markata-go\n---\ntitle: \"My Post\"\ndate: 2026-01-24\npublished: true\ntags:\n  - blog\n---\n```\n\n**Conversion script:**\n\n```bash\n#!/bin/bash\n# Convert Jekyll frontmatter to markata-go format\nfor file in _posts/*.md; do\n  # Add published: true if missing\n  if ! grep -q \"^published:\" \"$file\"; then\n    sed -i '/^---$/,/^---$/{/^title:/a published: true\n    }' \"$file\"\n  fi\ndone\n```\n\n### From Hugo\n\n**Frontmatter differences:**\n\n```yaml\n# Hugo\n---\ntitle: \"My Post\"\ndate: 2026-01-24T10:00:00-05:00\ndraft: true\n---\n\n# markata-go\n---\ntitle: \"My Post\"\ndate: 2026-01-24\npublished: false\n---\n```\n\n**Key changes:**\n- `draft: true` becomes `published: false`\n- Date format simplified (time optional)\n- Remove Hugo-specific fields like `weight`, `type`\n\n### From Gatsby/MDX\n\n**MDX components won't work directly.** Convert to standard Markdown:\n\n```jsx\n// Gatsby MDX\n\u003cCallout type=\"info\"\u003e\n  Important information here\n\u003c/Callout\u003e\n\n// markata-go Markdown\n\u003e **Info:** Important information here\n```\n\nOr use HTML:\n\n```html\n\u003cdetails\u003e\n\u003csummary\u003eImportant information\u003c/summary\u003e\n\nContent here...\n\n\u003c/details\u003e\n```\n\n---\n\n## Getting Help\n\nIf you can't resolve an issue:\n\n1. **Check existing issues:** Search [GitHub Issues](https://github.com/waylonwalker/markata-go/issues)\n\n2. **Enable verbose output:** Add `--verbose` or `-v` flags to commands\n\n3. **Isolate the problem:** Create a minimal reproduction case\n\n4. **Gather information:**\n   ```bash\n   # System info\n   uname -a\n   go version\n   node --version\n   python --version\n\n   # Tool versions\n   pre-commit --version\n   markdownlint --version\n   ```\n\n5. **Open an issue** with:\n   - What you expected\n   - What actually happened\n   - Steps to reproduce\n   - Relevant configuration files\n   - Error messages (full output)\n\n---\n\n## See Also\n\n- [Pre-commit Hooks](pre-commit-hooks/) - Hook setup and configuration\n- [GitHub Actions](github-actions/) - CI/CD for GitHub\n- [GitLab CI](gitlab-ci/) - CI/CD for GitLab\n- [Custom Rules](custom-rules/) - Creating custom linting rules\n",
      "summary": "Common issues and solutions for linting, pre-commit hooks, and CI/CD quality pipelines",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "quality-assurance",
        "documentation",
        "troubleshooting"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/quality-assurance/pre-commit-hooks/",
      "url": "https://markata.dev/docs/guides/quality-assurance/pre-commit-hooks/",
      "title": "Pre-commit Hooks for Content Quality",
      "content_html": "\u003cp\u003ePre-commit hooks automatically validate your content before each commit, catching issues early in the development cycle. This guide shows you how to set up comprehensive content quality checks for your markata-go site.\u003c/p\u003e\n\u003ch2 id=\"table-of-contents\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTable of Contents\u003c/span\u003e \u003ca href=\"#table-of-contents\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[Installation](\u003ca href=\"/tags/installation/\" class=\"hashtag-tag\" data-tag=\"installation\" data-count=1 data-reading-time=2 data-reading-time-text=\"2 minutes\"\u003e#installation\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#basic-configuration\"\u003eBasic Configuration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#yaml-frontmatter-validation\"\u003eYAML Frontmatter Validation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#markdown-linting\"\u003eMarkdown Linting\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#link-checking\"\u003eLink Checking\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#image-alt-text-validation\"\u003eImage Alt Text Validation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#custom-validation-scripts\"\u003eCustom Validation Scripts\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#complete-configuration-example\"\u003eComplete Configuration Example\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"installation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInstallation\u003c/span\u003e \u003ca href=\"#installation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"install-pre-commit\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInstall pre-commit\u003c/span\u003e \u003ca href=\"#install-pre-commit\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# macOS (Homebrew)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew install pre-commit\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Python (pip) - works on all platforms\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install pre-commit\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Python (pipx) - isolated installation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epipx install pre-commit\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Conda\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econda install -c conda-forge pre-commit\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"verify-installation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVerify Installation\u003c/span\u003e \u003ca href=\"#verify-installation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epre-commit --version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# pre-commit 3.7.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"initialize-in-your-project\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInitialize in Your Project\u003c/span\u003e \u003ca href=\"#initialize-in-your-project\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create initial configuration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epre-commit sample-config \u0026gt; .pre-commit-config.yaml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Install git hooks\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epre-commit install\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Optional: Install for commit messages too\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epre-commit install --hook-type commit-msg\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"basic-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Configuration\u003c/span\u003e \u003ca href=\"#basic-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCreate \u003ccode\u003e.pre-commit-config.yaml\u003c/code\u003e in your site\u0026rsquo;s root directory:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .pre-commit-config.yaml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edefault_language_version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epython\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epython3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003erepos\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Basic file checks\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://github.com/pre-commit/pre-commit-hooks\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erev\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev4.6.0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etrailing-whitespace\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e--\u003cspan class=\"l\"\u003emarkdown-linebreak-ext=md]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eend-of-file-fixer\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003echeck-yaml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003echeck-added-large-files\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e--\u003cspan class=\"l\"\u003emaxkb=1024]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emixed-line-ending\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e--\u003cspan class=\"l\"\u003efix=lf]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"running-pre-commit\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRunning Pre-commit\u003c/span\u003e \u003ca href=\"#running-pre-commit\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run on staged files (automatic on commit)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epre-commit run\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run on all files\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epre-commit run --all-files\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run specific hook\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epre-commit run markdownlint --all-files\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Update hooks to latest versions\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epre-commit autoupdate\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"yaml-frontmatter-validation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eYAML Frontmatter Validation\u003c/span\u003e \u003ca href=\"#yaml-frontmatter-validation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go uses YAML frontmatter for post metadata. Validating this frontmatter catches syntax errors before they break your build.\u003c/p\u003e\n\u003ch3 id=\"using-yamllint\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing yamllint\u003c/span\u003e \u003ca href=\"#using-yamllint\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd yamllint to your pre-commit config:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003erepos\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://github.com/adrienverge/yamllint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erev\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev1.35.1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eyamllint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e--\u003cspan class=\"l\"\u003econfig-file, .yamllint.yml]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\\.(md|markdown)$\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCreate \u003ccode\u003e.yamllint.yml\u003c/code\u003e for Markdown frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .yamllint.yml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eextends\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003erelaxed\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Frontmatter doesn\u0026#39;t need document start markers\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edocument-start\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edisable\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Allow long lines in frontmatter (descriptions, etc.)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eline-length\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edisable\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Allow trailing spaces (some editors add them)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etrailing-spaces\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edisable\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Require consistent indentation\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eindentation\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003espaces\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eindent-sequences\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Ensure proper quoting\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003equoted-strings\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003equote-type\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eany\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erequired\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eonly-when-needed\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Check for duplicate keys\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey-duplicates\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eenable\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Ensure proper boolean values\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etruthy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eallowed-values\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;true\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;false\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;yes\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;no\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"custom-frontmatter-validation-script\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Frontmatter Validation Script\u003c/span\u003e \u003ca href=\"#custom-frontmatter-validation-script\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor more specific frontmatter validation, create a custom script:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# scripts/validate-frontmatter.sh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Validates that required frontmatter fields exist\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eset\u003c/span\u003e -e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003erequired_fields\u003c/span\u003e\u003cspan class=\"o\"\u003e=(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eerrors\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e file in \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$@\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Skip non-markdown files\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e !\u003cspan class=\"o\"\u003e=\u003c/span\u003e *.md \u003cspan class=\"o\"\u003e]]\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Extract frontmatter (between first two ---)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003efrontmatter\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003esed -n \u003cspan class=\"s1\"\u003e\u0026#39;/^---$/,/^---$/p\u0026#39;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e sed \u003cspan class=\"s1\"\u003e\u0026#39;1d;$d\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e -z \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$frontmatter\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ERROR: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e - No frontmatter found\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e((\u003c/span\u003eerrors++\u003cspan class=\"o\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efor\u003c/span\u003e field in \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003erequired_fields\u003c/span\u003e\u003cspan class=\"p\"\u003e[@]\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e ! \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$frontmatter\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep -q \u003cspan class=\"s2\"\u003e\u0026#34;^\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003efield\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e:\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ERROR: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e - Missing required field: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$field\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e((\u003c/span\u003eerrors++\u003cspan class=\"o\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Check that published is boolean\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003epublished\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$frontmatter\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep \u003cspan class=\"s2\"\u003e\u0026#34;^published:\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e cut -d: -f2 \u003cspan class=\"p\"\u003e|\u003c/span\u003e tr -d \u003cspan class=\"s1\"\u003e\u0026#39; \u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e -n \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$published\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003e ! \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$published\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e~ ^\u003cspan class=\"o\"\u003e(\u003c/span\u003etrue\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e$ \u003cspan class=\"o\"\u003e]]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ERROR: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e - \u0026#39;published\u0026#39; must be true or false, got: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$published\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e((\u003c/span\u003eerrors++\u003cspan class=\"o\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Check date format (YYYY-MM-DD)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003edate_val\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$frontmatter\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep \u003cspan class=\"s2\"\u003e\u0026#34;^date:\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e cut -d: -f2 \u003cspan class=\"p\"\u003e|\u003c/span\u003e tr -d \u003cspan class=\"s1\"\u003e\u0026#39; \u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e -n \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$date_val\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003e ! \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$date_val\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e~ ^\u003cspan class=\"o\"\u003e[\u003c/span\u003e0-9\u003cspan class=\"o\"\u003e]{\u003c/span\u003e4\u003cspan class=\"o\"\u003e}\u003c/span\u003e-\u003cspan class=\"o\"\u003e[\u003c/span\u003e0-9\u003cspan class=\"o\"\u003e]{\u003c/span\u003e2\u003cspan class=\"o\"\u003e}\u003c/span\u003e-\u003cspan class=\"o\"\u003e[\u003c/span\u003e0-9\u003cspan class=\"o\"\u003e]{\u003c/span\u003e2\u003cspan class=\"o\"\u003e}\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;WARNING: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e - Date format should be YYYY-MM-DD, got: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$date_val\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e \u003cspan class=\"nv\"\u003e$errors\u003c/span\u003e -gt \u003cspan class=\"m\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Found \u003c/span\u003e\u003cspan class=\"nv\"\u003e$errors\u003c/span\u003e\u003cspan class=\"s2\"\u003e frontmatter error(s)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eexit\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;All frontmatter valid!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAdd the script to pre-commit:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003erepos\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elocal\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003evalidate-frontmatter\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eValidate Frontmatter\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eentry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebash scripts/validate-frontmatter.sh\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003elanguage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esystem\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\\.(md|markdown)$\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003epass_filenames\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"markdown-linting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMarkdown Linting\u003c/span\u003e \u003ca href=\"#markdown-linting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eConsistent Markdown formatting improves maintainability and ensures reliable rendering.\u003c/p\u003e\n\u003ch3 id=\"using-markdownlint-cli\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing markdownlint-cli\u003c/span\u003e \u003ca href=\"#using-markdownlint-cli\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003erepos\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://github.com/igorshubovych/markdownlint-cli\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erev\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev0.42.0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkdownlint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e--\u003cspan class=\"l\"\u003econfig, .markdownlint.json, --fix]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCreate \u003ccode\u003e.markdownlint.json\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD001\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD003\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;atx\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD004\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dash\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD007\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;indent\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD009\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;br_spaces\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD010\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD012\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;maximum\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD013\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD022\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;lines_above\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;lines_below\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD024\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;siblings_only\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD025\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;front_matter_title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^\\\\s*title\\\\s*[:=]\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD026\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;punctuation\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.,;:!\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD033\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;allowed_elements\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;details\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;summary\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;kbd\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;br\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;sup\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;sub\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;img\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;audio\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;iframe\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD034\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD036\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD040\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD041\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD046\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;fenced\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD048\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;backtick\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"rule-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRule Reference\u003c/span\u003e \u003ca href=\"#rule-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCommon rules you may want to configure:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eRule\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eRecommended\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eMD013\u003c/td\u003e\n\u003ctd\u003eLine length\u003c/td\u003e\n\u003ctd\u003eDisable for prose\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMD033\u003c/td\u003e\n\u003ctd\u003eNo inline HTML\u003c/td\u003e\n\u003ctd\u003eAllow specific tags\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMD041\u003c/td\u003e\n\u003ctd\u003eFirst line H1\u003c/td\u003e\n\u003ctd\u003eDisable (frontmatter)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMD025\u003c/td\u003e\n\u003ctd\u003eSingle H1\u003c/td\u003e\n\u003ctd\u003eEnable with frontmatter exception\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMD024\u003c/td\u003e\n\u003ctd\u003eNo duplicate headings\u003c/td\u003e\n\u003ctd\u003eEnable siblings only\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"per-file-overrides\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePer-File Overrides\u003c/span\u003e \u003ca href=\"#per-file-overrides\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDisable rules for specific files using \u003ccode\u003e.markdownlintignore\u003c/code\u003e:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e# .markdownlintignore\n# Ignore generated files\npublic/\nnode_modules/\n\n# Ignore specific files\nCHANGELOG.md\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eOr use inline comments in Markdown:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!-- markdownlint-disable MD033 --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;details\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;summary\u0026gt;Click to expand\u0026lt;/summary\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent here...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;/details\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!-- markdownlint-enable MD033 --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"link-checking\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLink Checking\u003c/span\u003e \u003ca href=\"#link-checking\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBroken links hurt user experience and SEO. Check links before committing.\u003c/p\u003e\n\u003ch3 id=\"using-markdown-link-check\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing markdown-link-check\u003c/span\u003e \u003ca href=\"#using-markdown-link-check\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003erepos\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://github.com/tcort/markdown-link-check\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erev\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev3.12.2\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkdown-link-check\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e--\u003cspan class=\"l\"\u003econfig, .markdown-link-check.json]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCreate \u003ccode\u003e.markdown-link-check.json\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;ignorePatterns\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^https://localhost\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^https://127\\\\.0\\\\.0\\\\.1\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^#\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;replacementPatterns\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;replacement\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;{{BASEURL}}/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;httpHeaders\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;urls\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://github.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;headers\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;Accept\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;text/html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;timeout\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;10s\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;retryOn429\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;retryCount\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;fallbackRetryDelay\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;5s\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;aliveStatusCodes\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e200\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e206\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e301\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e302\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e307\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e308\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"using-lychee-faster-alternative\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing lychee (Faster Alternative)\u003c/span\u003e \u003ca href=\"#using-lychee-faster-alternative\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/lycheeverse/lychee\"\u003elychee\u003c/a\u003e is a fast, async link checker written in Rust:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003erepos\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elocal\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elychee\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCheck links with lychee\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eentry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elychee\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003elanguage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esystem\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\\.(md|html)$\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- --\u003cspan class=\"l\"\u003econfig=.lychee.toml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- --\u003cspan class=\"kc\"\u003eno\u003c/span\u003e-\u003cspan class=\"l\"\u003eprogress\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCreate \u003ccode\u003e.lychee.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .lychee.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Maximum number of concurrent requests\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_concurrency\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e32\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Timeout for requests\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etimeout\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# User agent\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003euser_agent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;lychee/0.15\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Accept codes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eaccept\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e200\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e204\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e301\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e302\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e307\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e308\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Exclude patterns\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;^https://localhost\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;^https://127\\\\.0\\\\.0\\\\.1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;^mailto:\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;^tel:\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Exclude paths\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;node_modules\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;.git\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Skip private IPs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eskip_missing\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Include fragments\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_fragments\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"link-checking-best-practices\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLink Checking Best Practices\u003c/span\u003e \u003ca href=\"#link-checking-best-practices\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eCache results\u003c/strong\u003e - Link checking is slow; cache in CI\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAllow retries\u003c/strong\u003e - Some sites rate-limit requests\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eExclude known-good patterns\u003c/strong\u003e - Skip localhost, anchors\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRun separately\u003c/strong\u003e - Consider running link checks only in CI, not on every commit\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"image-alt-text-validation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eImage Alt Text Validation\u003c/span\u003e \u003ca href=\"#image-alt-text-validation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAlt text is essential for accessibility. Validate that all images have meaningful descriptions.\u003c/p\u003e\n\u003ch3 id=\"custom-alt-text-checker\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Alt Text Checker\u003c/span\u003e \u003ca href=\"#custom-alt-text-checker\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# scripts/check-alt-text.sh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Ensures all images have alt text\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eset\u003c/span\u003e -e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eerrors\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e file in \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$@\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e !\u003cspan class=\"o\"\u003e=\u003c/span\u003e *.md \u003cspan class=\"o\"\u003e]]\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Find images without alt text: ![](url) or ![ ](url)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Correct format: ![alt text](url)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Check for empty alt text\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e grep -Pn \u003cspan class=\"s1\"\u003e\u0026#39;!\\[\\s*\\]\\(\u0026#39;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ERROR: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e - Found image(s) with empty alt text\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e((\u003c/span\u003eerrors++\u003cspan class=\"o\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Check for placeholder alt text\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e grep -Pin \u003cspan class=\"s1\"\u003e\u0026#39;!\\[(image|img|photo|picture|screenshot)\\]\\(\u0026#39;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;WARNING: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e - Found image(s) with placeholder alt text\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e \u003cspan class=\"nv\"\u003e$errors\u003c/span\u003e -gt \u003cspan class=\"m\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Found \u003c/span\u003e\u003cspan class=\"nv\"\u003e$errors\u003c/span\u003e\u003cspan class=\"s2\"\u003e image(s) missing alt text\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Add descriptive alt text: ![description of image](url)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eexit\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;All images have alt text!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAdd to pre-commit:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003erepos\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elocal\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003echeck-alt-text\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCheck image alt text\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eentry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebash scripts/check-alt-text.sh\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003elanguage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esystem\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\\.(md|markdown)$\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003epass_filenames\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"using-remark-lint\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing remark-lint\u003c/span\u003e \u003ca href=\"#using-remark-lint\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor more comprehensive Markdown validation including alt text:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003erepos\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elocal\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eremark-lint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eRemark lint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eentry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enpx remark\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003elanguage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enode\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\\.(md|markdown)$\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e--\u003cspan class=\"l\"\u003efrail, --quiet]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eadditional_dependencies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003eremark-cli\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003eremark-preset-lint-recommended\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003eremark-lint-no-empty-image-alt\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCreate \u003ccode\u003e.remarkrc.js\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// .remarkrc.js\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emodule\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eexports\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s1\"\u003e\u0026#39;preset-lint-recommended\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s1\"\u003e\u0026#39;lint-no-empty-image-alt\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;lint-no-undefined-references\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"c1\"\u003e// Allow [[wikilinks]]\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"custom-validation-scripts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Validation Scripts\u003c/span\u003e \u003ca href=\"#custom-validation-scripts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"validate-slug-uniqueness\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eValidate Slug Uniqueness\u003c/span\u003e \u003ca href=\"#validate-slug-uniqueness\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePrevent duplicate slugs that cause build conflicts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# scripts/check-unique-slugs.sh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eset\u003c/span\u003e -e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Extract all slugs from frontmatter\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003edeclare\u003c/span\u003e -A slugs\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e file in \u003cspan class=\"k\"\u003e$(\u003c/span\u003efind . -name \u003cspan class=\"s2\"\u003e\u0026#34;*.md\u0026#34;\u003c/span\u003e -not -path \u003cspan class=\"s2\"\u003e\u0026#34;./node_modules/*\u0026#34;\u003c/span\u003e -not -path \u003cspan class=\"s2\"\u003e\u0026#34;./public/*\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eslug\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003esed -n \u003cspan class=\"s1\"\u003e\u0026#39;/^---$/,/^---$/p\u0026#39;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep \u003cspan class=\"s2\"\u003e\u0026#34;^slug:\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e cut -d: -f2- \u003cspan class=\"p\"\u003e|\u003c/span\u003e tr -d \u003cspan class=\"s1\"\u003e\u0026#39; \u0026#34;\u0026#39;\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;\u0026#34;\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e -n \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$slug\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e -n \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eslugs\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003e$slug\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ERROR: Duplicate slug \u0026#39;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$slug\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;  - \u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eslugs\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003e$slug\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;  - \u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nb\"\u003eexit\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        slugs\u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003e$slug\u003c/span\u003e\u003cspan class=\"o\"\u003e]=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;All slugs are unique!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"validate-tags\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eValidate Tags\u003c/span\u003e \u003ca href=\"#validate-tags\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnsure consistent tag usage:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# scripts/validate-tags.sh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Allowed tags (customize for your site)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eallowed_tags\u003c/span\u003e\u003cspan class=\"o\"\u003e=(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;documentation\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;tutorial\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;guide\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;reference\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;announcement\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eerrors\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e file in \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$@\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e !\u003cspan class=\"o\"\u003e=\u003c/span\u003e *.md \u003cspan class=\"o\"\u003e]]\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Extract tags from frontmatter\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003etags\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003esed -n \u003cspan class=\"s1\"\u003e\u0026#39;/^tags:/,/^[a-z]/p\u0026#39;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep \u003cspan class=\"s2\"\u003e\u0026#34;^\\s*-\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e sed \u003cspan class=\"s1\"\u003e\u0026#39;s/^\\s*-\\s*//\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"nv\"\u003eIFS\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eread\u003c/span\u003e -r tag\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003etag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$tag\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e tr -d \u003cspan class=\"s1\"\u003e\u0026#39; \u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e[\u003c/span\u003e -z \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$tag\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003e ! \u003cspan class=\"s2\"\u003e\u0026#34; \u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eallowed_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e[*]\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e~ \u003cspan class=\"s2\"\u003e\u0026#34; \u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003etag\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;WARNING: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e - Unknown tag: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$tag\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;  Allowed tags: \u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eallowed_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e[*]\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edone\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$tags\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexit\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# Warnings only, don\u0026#39;t block commit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"check-required-sections\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCheck Required Sections\u003c/span\u003e \u003ca href=\"#check-required-sections\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnsure documentation has required sections:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# scripts/check-doc-structure.sh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e file in \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$@\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e !\u003cspan class=\"o\"\u003e=\u003c/span\u003e docs/*.md \u003cspan class=\"o\"\u003e]]\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Check for table of contents\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e ! grep -q \u003cspan class=\"s2\"\u003e\u0026#34;## Table of Contents\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;WARNING: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e - Missing Table of Contents\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Check for See Also section\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e ! grep -q \u003cspan class=\"s2\"\u003e\u0026#34;## See Also\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;INFO: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e - Consider adding a See Also section\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"complete-configuration-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComplete Configuration Example\u003c/span\u003e \u003ca href=\"#complete-configuration-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere\u0026rsquo;s a comprehensive \u003ccode\u003e.pre-commit-config.yaml\u003c/code\u003e for a markata-go site:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .pre-commit-config.yaml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Complete content quality configuration for markata-go sites\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edefault_language_version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epython\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epython3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003erepos\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Basic file checks\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://github.com/pre-commit/pre-commit-hooks\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erev\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev4.6.0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etrailing-whitespace\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e--\u003cspan class=\"l\"\u003emarkdown-linebreak-ext=md]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eend-of-file-fixer\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003echeck-yaml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003echeck-json\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003echeck-toml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003echeck-added-large-files\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e--\u003cspan class=\"l\"\u003emaxkb=1024]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emixed-line-ending\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e--\u003cspan class=\"l\"\u003efix=lf]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003echeck-merge-conflict\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edetect-private-key\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# YAML/Frontmatter validation\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://github.com/adrienverge/yamllint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erev\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev1.35.1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eyamllint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e--\u003cspan class=\"l\"\u003econfig-file, .yamllint.yml]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\\.(md|yaml|yml)$\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Markdown linting\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://github.com/igorshubovych/markdownlint-cli\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erev\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev0.42.0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkdownlint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e--\u003cspan class=\"l\"\u003econfig, .markdownlint.json, --fix]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eexclude\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e^(CHANGELOG|node_modules/)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Link checking (optional - can be slow)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# - repo: https://github.com/tcort/markdown-link-check\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e#   rev: v3.12.2\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e#   hooks:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e#     - id: markdown-link-check\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e#       args: [--config, .markdown-link-check.json]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Custom validations\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elocal\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# Validate required frontmatter fields\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003evalidate-frontmatter\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eValidate Frontmatter\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eentry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebash scripts/validate-frontmatter.sh\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003elanguage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esystem\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\\.(md|markdown)$\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003epass_filenames\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# Check image alt text\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003echeck-alt-text\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCheck image alt text\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eentry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebash scripts/check-alt-text.sh\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003elanguage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esystem\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\\.(md|markdown)$\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003epass_filenames\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# Validate build (optional - can be slow)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# - id: markata-build\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e#   name: Test build\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e#   entry: markata-go build --dry-run\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e#   language: system\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e#   pass_filenames: false\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e#   stages: [push]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"directory-structure\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDirectory Structure\u003c/span\u003e \u003ca href=\"#directory-structure\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAfter setup, your project should have:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eyour-site/\n├── .pre-commit-config.yaml     # Pre-commit configuration\n├── .yamllint.yml               # YAML linting rules\n├── .markdownlint.json          # Markdown linting rules\n├── .markdown-link-check.json   # Link checker config (optional)\n├── scripts/\n│   ├── validate-frontmatter.sh\n│   └── check-alt-text.sh\n├── docs/\n│   └── ...your content...\n└── markata-go.toml\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"common-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Issues\u003c/span\u003e \u003ca href=\"#common-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eHook not running\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Reinstall hooks\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epre-commit uninstall\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epre-commit install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eSkipping hooks temporarily\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Skip all hooks (use sparingly!)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit commit --no-verify -m \u003cspan class=\"s2\"\u003e\u0026#34;WIP: work in progress\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Skip specific hook\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eSKIP\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003emarkdownlint git commit -m \u003cspan class=\"s2\"\u003e\u0026#34;Quick fix\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eHooks too slow\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run only on changed files (default behavior)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epre-commit run\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Cache is stored in ~/.cache/pre-commit/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eFalse positives\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eUse inline comments to disable specific rules:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!-- markdownlint-disable MD033 --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;custom-element\u0026gt;content\u0026lt;/custom-element\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!-- markdownlint-enable MD033 --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr exclude files in \u003ccode\u003e.markdownlintignore\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"github-actions/\"\u003eGitHub Actions\u003c/a\u003e - CI/CD quality checks\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"custom-rules/\"\u003eCustom Rules\u003c/a\u003e - Configure linting rules\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"troubleshooting/\"\u003eTroubleshooting\u003c/a\u003e - Common issues and solutions\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nPre-commit hooks automatically validate your content before each commit, catching issues early in the development cycle. This guide shows you how to set up comprehensive content quality checks for your markata-go site.\n\n## Table of Contents\n\n- [Installation](\u003ca href=\"/tags/installation/\" class=\"hashtag-tag\" data-tag=\"installation\" data-count=1 data-reading-time=2 data-reading-time-text=\"2 minutes\"\u003e#installation\u003c/a\u003e)\n- [Basic Configuration](#basic-configuration)\n- [YAML Frontmatter Validation](#yaml-frontmatter-validation)\n- [Markdown Linting](#markdown-linting)\n- [Link Checking](#link-checking)\n- [Image Alt Text Validation](#image-alt-text-validation)\n- [Custom Validation Scripts](#custom-validation-scripts)\n- [Complete Configuration Example](#complete-configuration-example)\n\n---\n\n## Installation\n\n### Install pre-commit\n\n```bash\n# macOS (Homebrew)\nbrew install pre-commit\n\n# Python (pip) - works on all platforms\npip install pre-commit\n\n# Python (pipx) - isolated installation\npipx install pre-commit\n\n# Conda\nconda install -c conda-forge pre-commit\n```\n\n### Verify Installation\n\n```bash\npre-commit --version\n# pre-commit 3.7.0\n```\n\n### Initialize in Your Project\n\n```bash\n# Create initial configuration\npre-commit sample-config \u003e .pre-commit-config.yaml\n\n# Install git hooks\npre-commit install\n\n# Optional: Install for commit messages too\npre-commit install --hook-type commit-msg\n```\n\n---\n\n## Basic Configuration\n\nCreate `.pre-commit-config.yaml` in your site's root directory:\n\n```yaml\n# .pre-commit-config.yaml\ndefault_language_version:\n  python: python3\n\nrepos:\n  # Basic file checks\n  - repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v4.6.0\n    hooks:\n      - id: trailing-whitespace\n        args: [--markdown-linebreak-ext=md]\n      - id: end-of-file-fixer\n      - id: check-yaml\n      - id: check-added-large-files\n        args: [--maxkb=1024]\n      - id: mixed-line-ending\n        args: [--fix=lf]\n```\n\n### Running Pre-commit\n\n```bash\n# Run on staged files (automatic on commit)\npre-commit run\n\n# Run on all files\npre-commit run --all-files\n\n# Run specific hook\npre-commit run markdownlint --all-files\n\n# Update hooks to latest versions\npre-commit autoupdate\n```\n\n---\n\n## YAML Frontmatter Validation\n\nmarkata-go uses YAML frontmatter for post metadata. Validating this frontmatter catches syntax errors before they break your build.\n\n### Using yamllint\n\nAdd yamllint to your pre-commit config:\n\n```yaml\nrepos:\n  - repo: https://github.com/adrienverge/yamllint\n    rev: v1.35.1\n    hooks:\n      - id: yamllint\n        args: [--config-file, .yamllint.yml]\n        files: \\.(md|markdown)$\n```\n\nCreate `.yamllint.yml` for Markdown frontmatter:\n\n```yaml\n# .yamllint.yml\nextends: relaxed\n\nrules:\n  # Frontmatter doesn't need document start markers\n  document-start: disable\n  \n  # Allow long lines in frontmatter (descriptions, etc.)\n  line-length: disable\n  \n  # Allow trailing spaces (some editors add them)\n  trailing-spaces: disable\n  \n  # Require consistent indentation\n  indentation:\n    spaces: 2\n    indent-sequences: true\n  \n  # Ensure proper quoting\n  quoted-strings:\n    quote-type: any\n    required: only-when-needed\n  \n  # Check for duplicate keys\n  key-duplicates: enable\n  \n  # Ensure proper boolean values\n  truthy:\n    allowed-values: ['true', 'false', 'yes', 'no']\n```\n\n### Custom Frontmatter Validation Script\n\nFor more specific frontmatter validation, create a custom script:\n\n```bash\n#!/bin/bash\n# scripts/validate-frontmatter.sh\n# Validates that required frontmatter fields exist\n\nset -e\n\nrequired_fields=(\"title\" \"date\" \"published\")\nerrors=0\n\nfor file in \"$@\"; do\n    # Skip non-markdown files\n    [[ \"$file\" != *.md ]] \u0026\u0026 continue\n    \n    # Extract frontmatter (between first two ---)\n    frontmatter=$(sed -n '/^---$/,/^---$/p' \"$file\" | sed '1d;$d')\n    \n    if [ -z \"$frontmatter\" ]; then\n        echo \"ERROR: $file - No frontmatter found\"\n        ((errors++))\n        continue\n    fi\n    \n    for field in \"${required_fields[@]}\"; do\n        if ! echo \"$frontmatter\" | grep -q \"^${field}:\"; then\n            echo \"ERROR: $file - Missing required field: $field\"\n            ((errors++))\n        fi\n    done\n    \n    # Check that published is boolean\n    published=$(echo \"$frontmatter\" | grep \"^published:\" | cut -d: -f2 | tr -d ' ')\n    if [ -n \"$published\" ] \u0026\u0026 [[ ! \"$published\" =~ ^(true|false)$ ]]; then\n        echo \"ERROR: $file - 'published' must be true or false, got: $published\"\n        ((errors++))\n    fi\n    \n    # Check date format (YYYY-MM-DD)\n    date_val=$(echo \"$frontmatter\" | grep \"^date:\" | cut -d: -f2 | tr -d ' ')\n    if [ -n \"$date_val\" ] \u0026\u0026 [[ ! \"$date_val\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2} ]]; then\n        echo \"WARNING: $file - Date format should be YYYY-MM-DD, got: $date_val\"\n    fi\ndone\n\nif [ $errors -gt 0 ]; then\n    echo \"\"\n    echo \"Found $errors frontmatter error(s)\"\n    exit 1\nfi\n\necho \"All frontmatter valid!\"\n```\n\nAdd the script to pre-commit:\n\n```yaml\nrepos:\n  - repo: local\n    hooks:\n      - id: validate-frontmatter\n        name: Validate Frontmatter\n        entry: bash scripts/validate-frontmatter.sh\n        language: system\n        files: \\.(md|markdown)$\n        pass_filenames: true\n```\n\n---\n\n## Markdown Linting\n\nConsistent Markdown formatting improves maintainability and ensures reliable rendering.\n\n### Using markdownlint-cli\n\n```yaml\nrepos:\n  - repo: https://github.com/igorshubovych/markdownlint-cli\n    rev: v0.42.0\n    hooks:\n      - id: markdownlint\n        args: [--config, .markdownlint.json, --fix]\n```\n\nCreate `.markdownlint.json`:\n\n```json\n{\n  \"default\": true,\n  \n  \"MD001\": true,\n  \"MD003\": { \"style\": \"atx\" },\n  \"MD004\": { \"style\": \"dash\" },\n  \"MD007\": { \"indent\": 2 },\n  \"MD009\": { \"br_spaces\": 2 },\n  \"MD010\": true,\n  \"MD012\": { \"maximum\": 2 },\n  \n  \"MD013\": false,\n  \n  \"MD022\": { \"lines_above\": 1, \"lines_below\": 1 },\n  \"MD024\": { \"siblings_only\": true },\n  \"MD025\": { \"front_matter_title\": \"^\\\\s*title\\\\s*[:=]\" },\n  \n  \"MD026\": { \"punctuation\": \".,;:!\" },\n  \n  \"MD033\": {\n    \"allowed_elements\": [\n      \"details\", \"summary\", \"kbd\", \"br\", \"sup\", \"sub\",\n      \"img\", \"video\", \"audio\", \"source\", \"iframe\"\n    ]\n  },\n  \n  \"MD034\": true,\n  \n  \"MD036\": false,\n  \n  \"MD040\": true,\n  \"MD041\": false,\n  \"MD046\": { \"style\": \"fenced\" },\n  \"MD048\": { \"style\": \"backtick\" }\n}\n```\n\n### Rule Reference\n\nCommon rules you may want to configure:\n\n| Rule | Description | Recommended |\n|------|-------------|-------------|\n| MD013 | Line length | Disable for prose |\n| MD033 | No inline HTML | Allow specific tags |\n| MD041 | First line H1 | Disable (frontmatter) |\n| MD025 | Single H1 | Enable with frontmatter exception |\n| MD024 | No duplicate headings | Enable siblings only |\n\n### Per-File Overrides\n\nDisable rules for specific files using `.markdownlintignore`:\n\n```\n# .markdownlintignore\n# Ignore generated files\npublic/\nnode_modules/\n\n# Ignore specific files\nCHANGELOG.md\n```\n\nOr use inline comments in Markdown:\n\n```markdown\n\u003c!-- markdownlint-disable MD033 --\u003e\n\u003cdetails\u003e\n\u003csummary\u003eClick to expand\u003c/summary\u003e\n\nContent here...\n\n\u003c/details\u003e\n\u003c!-- markdownlint-enable MD033 --\u003e\n```\n\n---\n\n## Link Checking\n\nBroken links hurt user experience and SEO. Check links before committing.\n\n### Using markdown-link-check\n\n```yaml\nrepos:\n  - repo: https://github.com/tcort/markdown-link-check\n    rev: v3.12.2\n    hooks:\n      - id: markdown-link-check\n        args: [--config, .markdown-link-check.json]\n```\n\nCreate `.markdown-link-check.json`:\n\n```json\n{\n  \"ignorePatterns\": [\n    { \"pattern\": \"^https://localhost\" },\n    { \"pattern\": \"^https://127\\\\.0\\\\.0\\\\.1\" },\n    { \"pattern\": \"^#\" }\n  ],\n  \"replacementPatterns\": [\n    {\n      \"pattern\": \"^/\",\n      \"replacement\": \"{{BASEURL}}/\"\n    }\n  ],\n  \"httpHeaders\": [\n    {\n      \"urls\": [\"https://github.com\"],\n      \"headers\": {\n        \"Accept\": \"text/html\"\n      }\n    }\n  ],\n  \"timeout\": \"10s\",\n  \"retryOn429\": true,\n  \"retryCount\": 3,\n  \"fallbackRetryDelay\": \"5s\",\n  \"aliveStatusCodes\": [200, 206, 301, 302, 307, 308]\n}\n```\n\n### Using lychee (Faster Alternative)\n\n[lychee](https://github.com/lycheeverse/lychee) is a fast, async link checker written in Rust:\n\n```yaml\nrepos:\n  - repo: local\n    hooks:\n      - id: lychee\n        name: Check links with lychee\n        entry: lychee\n        language: system\n        files: \\.(md|html)$\n        args:\n          - --config=.lychee.toml\n          - --no-progress\n```\n\nCreate `.lychee.toml`:\n\n```toml\n# .lychee.toml\n\n# Maximum number of concurrent requests\nmax_concurrency = 32\n\n# Timeout for requests\ntimeout = 20\n\n# User agent\nuser_agent = \"lychee/0.15\"\n\n# Accept codes\naccept = [200, 204, 301, 302, 307, 308]\n\n# Exclude patterns\nexclude = [\n    \"^https://localhost\",\n    \"^https://127\\\\.0\\\\.0\\\\.1\",\n    \"^mailto:\",\n    \"^tel:\",\n]\n\n# Exclude paths\nexclude_path = [\n    \"node_modules\",\n    \"public\",\n    \".git\",\n]\n\n# Skip private IPs\nskip_missing = false\n\n# Include fragments\ninclude_fragments = true\n```\n\n### Link Checking Best Practices\n\n1. **Cache results** - Link checking is slow; cache in CI\n2. **Allow retries** - Some sites rate-limit requests\n3. **Exclude known-good patterns** - Skip localhost, anchors\n4. **Run separately** - Consider running link checks only in CI, not on every commit\n\n---\n\n## Image Alt Text Validation\n\nAlt text is essential for accessibility. Validate that all images have meaningful descriptions.\n\n### Custom Alt Text Checker\n\n```bash\n#!/bin/bash\n# scripts/check-alt-text.sh\n# Ensures all images have alt text\n\nset -e\n\nerrors=0\n\nfor file in \"$@\"; do\n    [[ \"$file\" != *.md ]] \u0026\u0026 continue\n    \n    # Find images without alt text: ![](url) or ![ ](url)\n    # Correct format: ![alt text](url)\n    \n    # Check for empty alt text\n    if grep -Pn '!\\[\\s*\\]\\(' \"$file\"; then\n        echo \"ERROR: $file - Found image(s) with empty alt text\"\n        ((errors++))\n    fi\n    \n    # Check for placeholder alt text\n    if grep -Pin '!\\[(image|img|photo|picture|screenshot)\\]\\(' \"$file\"; then\n        echo \"WARNING: $file - Found image(s) with placeholder alt text\"\n    fi\ndone\n\nif [ $errors -gt 0 ]; then\n    echo \"\"\n    echo \"Found $errors image(s) missing alt text\"\n    echo \"Add descriptive alt text: ![description of image](url)\"\n    exit 1\nfi\n\necho \"All images have alt text!\"\n```\n\nAdd to pre-commit:\n\n```yaml\nrepos:\n  - repo: local\n    hooks:\n      - id: check-alt-text\n        name: Check image alt text\n        entry: bash scripts/check-alt-text.sh\n        language: system\n        files: \\.(md|markdown)$\n        pass_filenames: true\n```\n\n### Using remark-lint\n\nFor more comprehensive Markdown validation including alt text:\n\n```yaml\nrepos:\n  - repo: local\n    hooks:\n      - id: remark-lint\n        name: Remark lint\n        entry: npx remark\n        language: node\n        files: \\.(md|markdown)$\n        args: [--frail, --quiet]\n        additional_dependencies:\n          - remark-cli\n          - remark-preset-lint-recommended\n          - remark-lint-no-empty-image-alt\n```\n\nCreate `.remarkrc.js`:\n\n```javascript\n// .remarkrc.js\nmodule.exports = {\n  plugins: [\n    'preset-lint-recommended',\n    'lint-no-empty-image-alt',\n    ['lint-no-undefined-references', false], // Allow [[wikilinks]]\n  ],\n};\n```\n\n---\n\n## Custom Validation Scripts\n\n### Validate Slug Uniqueness\n\nPrevent duplicate slugs that cause build conflicts:\n\n```bash\n#!/bin/bash\n# scripts/check-unique-slugs.sh\n\nset -e\n\n# Extract all slugs from frontmatter\ndeclare -A slugs\n\nfor file in $(find . -name \"*.md\" -not -path \"./node_modules/*\" -not -path \"./public/*\"); do\n    slug=$(sed -n '/^---$/,/^---$/p' \"$file\" | grep \"^slug:\" | cut -d: -f2- | tr -d ' \"'\"'\"'')\n    \n    if [ -n \"$slug\" ]; then\n        if [ -n \"${slugs[$slug]}\" ]; then\n            echo \"ERROR: Duplicate slug '$slug'\"\n            echo \"  - ${slugs[$slug]}\"\n            echo \"  - $file\"\n            exit 1\n        fi\n        slugs[$slug]=\"$file\"\n    fi\ndone\n\necho \"All slugs are unique!\"\n```\n\n### Validate Tags\n\nEnsure consistent tag usage:\n\n```bash\n#!/bin/bash\n# scripts/validate-tags.sh\n\n# Allowed tags (customize for your site)\nallowed_tags=(\n    \"documentation\"\n    \"tutorial\"\n    \"guide\"\n    \"reference\"\n    \"blog\"\n    \"announcement\"\n)\n\nerrors=0\n\nfor file in \"$@\"; do\n    [[ \"$file\" != *.md ]] \u0026\u0026 continue\n    \n    # Extract tags from frontmatter\n    tags=$(sed -n '/^tags:/,/^[a-z]/p' \"$file\" | grep \"^\\s*-\" | sed 's/^\\s*-\\s*//')\n    \n    while IFS= read -r tag; do\n        tag=$(echo \"$tag\" | tr -d ' ')\n        [ -z \"$tag\" ] \u0026\u0026 continue\n        \n        if [[ ! \" ${allowed_tags[*]} \" =~ \" ${tag} \" ]]; then\n            echo \"WARNING: $file - Unknown tag: $tag\"\n            echo \"  Allowed tags: ${allowed_tags[*]}\"\n        fi\n    done \u003c\u003c\u003c \"$tags\"\ndone\n\nexit 0  # Warnings only, don't block commit\n```\n\n### Check Required Sections\n\nEnsure documentation has required sections:\n\n```bash\n#!/bin/bash\n# scripts/check-doc-structure.sh\n\nfor file in \"$@\"; do\n    [[ \"$file\" != docs/*.md ]] \u0026\u0026 continue\n    \n    # Check for table of contents\n    if ! grep -q \"## Table of Contents\" \"$file\"; then\n        echo \"WARNING: $file - Missing Table of Contents\"\n    fi\n    \n    # Check for See Also section\n    if ! grep -q \"## See Also\" \"$file\"; then\n        echo \"INFO: $file - Consider adding a See Also section\"\n    fi\ndone\n```\n\n---\n\n## Complete Configuration Example\n\nHere's a comprehensive `.pre-commit-config.yaml` for a markata-go site:\n\n```yaml\n# .pre-commit-config.yaml\n# Complete content quality configuration for markata-go sites\n\ndefault_language_version:\n  python: python3\n\nrepos:\n  # ============================================\n  # Basic file checks\n  # ============================================\n  - repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v4.6.0\n    hooks:\n      - id: trailing-whitespace\n        args: [--markdown-linebreak-ext=md]\n      - id: end-of-file-fixer\n      - id: check-yaml\n      - id: check-json\n      - id: check-toml\n      - id: check-added-large-files\n        args: [--maxkb=1024]\n      - id: mixed-line-ending\n        args: [--fix=lf]\n      - id: check-merge-conflict\n      - id: detect-private-key\n\n  # ============================================\n  # YAML/Frontmatter validation\n  # ============================================\n  - repo: https://github.com/adrienverge/yamllint\n    rev: v1.35.1\n    hooks:\n      - id: yamllint\n        args: [--config-file, .yamllint.yml]\n        files: \\.(md|yaml|yml)$\n\n  # ============================================\n  # Markdown linting\n  # ============================================\n  - repo: https://github.com/igorshubovych/markdownlint-cli\n    rev: v0.42.0\n    hooks:\n      - id: markdownlint\n        args: [--config, .markdownlint.json, --fix]\n        exclude: ^(CHANGELOG|node_modules/)\n\n  # ============================================\n  # Link checking (optional - can be slow)\n  # ============================================\n  # - repo: https://github.com/tcort/markdown-link-check\n  #   rev: v3.12.2\n  #   hooks:\n  #     - id: markdown-link-check\n  #       args: [--config, .markdown-link-check.json]\n\n  # ============================================\n  # Custom validations\n  # ============================================\n  - repo: local\n    hooks:\n      # Validate required frontmatter fields\n      - id: validate-frontmatter\n        name: Validate Frontmatter\n        entry: bash scripts/validate-frontmatter.sh\n        language: system\n        files: \\.(md|markdown)$\n        pass_filenames: true\n\n      # Check image alt text\n      - id: check-alt-text\n        name: Check image alt text\n        entry: bash scripts/check-alt-text.sh\n        language: system\n        files: \\.(md|markdown)$\n        pass_filenames: true\n\n      # Validate build (optional - can be slow)\n      # - id: markata-build\n      #   name: Test build\n      #   entry: markata-go build --dry-run\n      #   language: system\n      #   pass_filenames: false\n      #   stages: [push]\n```\n\n### Directory Structure\n\nAfter setup, your project should have:\n\n```\nyour-site/\n├── .pre-commit-config.yaml     # Pre-commit configuration\n├── .yamllint.yml               # YAML linting rules\n├── .markdownlint.json          # Markdown linting rules\n├── .markdown-link-check.json   # Link checker config (optional)\n├── scripts/\n│   ├── validate-frontmatter.sh\n│   └── check-alt-text.sh\n├── docs/\n│   └── ...your content...\n└── markata-go.toml\n```\n\n---\n\n## Troubleshooting\n\n### Common Issues\n\n**Hook not running**\n\n```bash\n# Reinstall hooks\npre-commit uninstall\npre-commit install\n```\n\n**Skipping hooks temporarily**\n\n```bash\n# Skip all hooks (use sparingly!)\ngit commit --no-verify -m \"WIP: work in progress\"\n\n# Skip specific hook\nSKIP=markdownlint git commit -m \"Quick fix\"\n```\n\n**Hooks too slow**\n\n```bash\n# Run only on changed files (default behavior)\npre-commit run\n\n# Cache is stored in ~/.cache/pre-commit/\n```\n\n**False positives**\n\nUse inline comments to disable specific rules:\n\n```markdown\n\u003c!-- markdownlint-disable MD033 --\u003e\n\u003ccustom-element\u003econtent\u003c/custom-element\u003e\n\u003c!-- markdownlint-enable MD033 --\u003e\n```\n\nOr exclude files in `.markdownlintignore`.\n\n---\n\n## See Also\n\n- [GitHub Actions](github-actions/) - CI/CD quality checks\n- [Custom Rules](custom-rules/) - Configure linting rules\n- [Troubleshooting](troubleshooting/) - Common issues and solutions\n",
      "summary": "Set up pre-commit hooks for frontmatter validation, Markdown linting, and link checking",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "documentation",
        "quality-assurance",
        "pre-commit",
        "linting"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/quality-assurance/",
      "url": "https://markata.dev/docs/guides/quality-assurance/",
      "title": "Quality Assurance Guide",
      "content_html": "\u003ch2 id=\"quality-assurance-for-your-markata-go-site\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuality Assurance for Your markata-go Site\u003c/span\u003e \u003ca href=\"#quality-assurance-for-your-markata-go-site\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMaintaining high-quality content is essential for any professional site. This guide covers tools and practices for validating frontmatter, linting Markdown, checking links, and ensuring accessibility in your markata-go site.\u003c/p\u003e\n\u003ch2 id=\"table-of-contents\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTable of Contents\u003c/span\u003e \u003ca href=\"#table-of-contents\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#why-quality-assurance\"\u003eWhy Quality Assurance?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#quick-setup\"\u003eQuick Setup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#guide-sections\"\u003eGuide Sections\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#recommended-tool-stack\"\u003eRecommended Tool Stack\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"why-quality-assurance\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhy Quality Assurance?\u003c/span\u003e \u003ca href=\"#why-quality-assurance\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eContent quality issues can harm your site in several ways:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eIssue\u003c/th\u003e\n\u003cth\u003eImpact\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eInvalid frontmatter\u003c/td\u003e\n\u003ctd\u003eBuild failures, missing metadata\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBroken links\u003c/td\u003e\n\u003ctd\u003ePoor user experience, SEO penalties\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eInconsistent Markdown\u003c/td\u003e\n\u003ctd\u003eRendering issues, maintenance burden\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMissing alt text\u003c/td\u003e\n\u003ctd\u003eAccessibility violations, SEO impact\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eYAML syntax errors\u003c/td\u003e\n\u003ctd\u003eBuild failures, data loss\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eAutomated quality checks catch these issues before they reach production.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"quick-setup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Setup\u003c/span\u003e \u003ca href=\"#quick-setup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGet started with content quality checks in under 5 minutes:\u003c/p\u003e\n\u003ch3 id=\"1-install-pre-commit\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e1. Install pre-commit\u003c/span\u003e \u003ca href=\"#1-install-pre-commit\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# macOS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew install pre-commit\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# pip (all platforms)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install pre-commit\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"2-create-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e2. Create Configuration\u003c/span\u003e \u003ca href=\"#2-create-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003e.pre-commit-config.yaml\u003c/code\u003e in your site root:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003erepos\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# YAML/Frontmatter validation\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://github.com/adrienverge/yamllint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erev\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev1.35.1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eyamllint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e--\u003cspan class=\"l\"\u003econfig-file, .yamllint.yml]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003etypes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emarkdown]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Markdown linting\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://github.com/igorshubovych/markdownlint-cli\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erev\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev0.42.0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkdownlint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e--\u003cspan class=\"l\"\u003econfig, .markdownlint.json]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"3-add-linter-configs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e3. Add Linter Configs\u003c/span\u003e \u003ca href=\"#3-add-linter-configs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003e.yamllint.yml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eextends\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003erelaxed\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eline-length\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edisable\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edocument-start\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edisable\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCreate \u003ccode\u003e.markdownlint.json\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD013\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD033\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD041\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"4-install-and-run\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e4. Install and Run\u003c/span\u003e \u003ca href=\"#4-install-and-run\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epre-commit install\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epre-commit run --all-files\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow every commit will automatically validate your content!\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"guide-sections\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGuide Sections\u003c/span\u003e \u003ca href=\"#guide-sections\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis quality assurance documentation is organized into the following sections:\u003c/p\u003e\n\u003ch3 id=\"pre-commit-hooks\"\u003e\u003ca href=\"pre-commit-hooks/\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePre-commit Hooks\u003c/span\u003e\u003c/a\u003e \u003ca href=\"#pre-commit-hooks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSet up automated checks that run before every commit:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYAML frontmatter validation\u003c/li\u003e\n\u003cli\u003eMarkdown linting with markdownlint\u003c/li\u003e\n\u003cli\u003eLink checking\u003c/li\u003e\n\u003cli\u003eImage alt text validation\u003c/li\u003e\n\u003cli\u003eCustom validation scripts\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"github-actions\"\u003e\u003ca href=\"github-actions/\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGitHub Actions\u003c/span\u003e\u003c/a\u003e \u003ca href=\"#github-actions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eContinuous integration workflows for GitHub:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBuild validation on pull requests\u003c/li\u003e\n\u003cli\u003eLink checking across your entire site\u003c/li\u003e\n\u003cli\u003eContent quality gates\u003c/li\u003e\n\u003cli\u003eAutomated reporting\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"gitlab-ci\"\u003e\u003ca href=\"gitlab-ci/\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGitLab CI\u003c/span\u003e\u003c/a\u003e \u003ca href=\"#gitlab-ci\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCI/CD pipelines for GitLab:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePipeline configuration\u003c/li\u003e\n\u003cli\u003eCaching for faster builds\u003c/li\u003e\n\u003cli\u003eMerge request quality gates\u003c/li\u003e\n\u003cli\u003eBadge generation\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"custom-rules\"\u003e\u003ca href=\"custom-rules/\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Rules\u003c/span\u003e\u003c/a\u003e \u003ca href=\"#custom-rules\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigure linting rules for your specific needs:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003emarkdownlint rule customization\u003c/li\u003e\n\u003cli\u003eCustom frontmatter validation\u003c/li\u003e\n\u003cli\u003eProject-specific style guides\u003c/li\u003e\n\u003cli\u003eRule inheritance and overrides\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"troubleshooting\"\u003e\u003ca href=\"troubleshooting/\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e\u003c/a\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCommon issues and solutions:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFalse positives and how to handle them\u003c/li\u003e\n\u003cli\u003ePerformance optimization\u003c/li\u003e\n\u003cli\u003eIntegration debugging\u003c/li\u003e\n\u003cli\u003eMigration from other tools\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"editor-integration\"\u003e\u003ca href=\"editor-integration/\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEditor Integration\u003c/span\u003e\u003c/a\u003e \u003ca href=\"#editor-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse lint output with your editor\u0026rsquo;s quickfix features:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVim/Neovim quickfix integration\u003c/li\u003e\n\u003cli\u003eVS Code problem matchers\u003c/li\u003e\n\u003cli\u003eEmacs compile-mode\u003c/li\u003e\n\u003cli\u003eSublime Text build systems\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"recommended-tool-stack\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRecommended Tool Stack\u003c/span\u003e \u003ca href=\"#recommended-tool-stack\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere\u0026rsquo;s the recommended set of tools for comprehensive content quality assurance:\u003c/p\u003e\n\u003ch3 id=\"essential-tools\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEssential Tools\u003c/span\u003e \u003ca href=\"#essential-tools\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTool\u003c/th\u003e\n\u003cth\u003ePurpose\u003c/th\u003e\n\u003cth\u003eInstallation\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://pre-commit.com/\"\u003epre-commit\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eGit hooks framework\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epip install pre-commit\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/igorshubovych/markdownlint-cli\"\u003emarkdownlint-cli\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eMarkdown linting\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003enpm install -g markdownlint-cli\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/adrienverge/yamllint\"\u003eyamllint\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eYAML validation\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epip install yamllint\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"recommended-additions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRecommended Additions\u003c/span\u003e \u003ca href=\"#recommended-additions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTool\u003c/th\u003e\n\u003cth\u003ePurpose\u003c/th\u003e\n\u003cth\u003eInstallation\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/lycheeverse/lychee\"\u003elychee\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eFast link checking\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ecargo install lychee\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/wjdp/htmltest\"\u003ehtmltest\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eHTML validation\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ego install github.com/wjdp/htmltest@latest\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://pa11y.org/\"\u003epa11y\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eAccessibility testing\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003enpm install -g pa11y\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"ci-specific-tools\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCI-Specific Tools\u003c/span\u003e \u003ca href=\"#ci-specific-tools\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTool\u003c/th\u003e\n\u003cth\u003ePurpose\u003c/th\u003e\n\u003cth\u003ePlatform\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/rhysd/actionlint\"\u003eactionlint\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eGitHub Actions validation\u003c/td\u003e\n\u003ctd\u003eGitHub\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/super-linter/super-linter\"\u003esuper-linter\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eMulti-language linting\u003c/td\u003e\n\u003ctd\u003eGitHub\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext Steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eStart with pre-commit hooks\u003c/strong\u003e - They provide immediate feedback during development\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAdd CI checks\u003c/strong\u003e - Ensure quality gates in your pull request workflow\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCustomize rules\u003c/strong\u003e - Adjust linting rules to match your style guide\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMonitor and iterate\u003c/strong\u003e - Review false positives and refine your configuration\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eChoose your next section based on your development workflow:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUsing Git locally? Start with \u003ca href=\"pre-commit-hooks/\"\u003ePre-commit Hooks\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUsing GitHub? Jump to \u003ca href=\"github-actions/\"\u003eGitHub Actions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUsing GitLab? See \u003ca href=\"gitlab-ci/\"\u003eGitLab CI\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n## Quality Assurance for Your markata-go Site\n\nMaintaining high-quality content is essential for any professional site. This guide covers tools and practices for validating frontmatter, linting Markdown, checking links, and ensuring accessibility in your markata-go site.\n\n## Table of Contents\n\n- [Why Quality Assurance?](#why-quality-assurance)\n- [Quick Setup](#quick-setup)\n- [Guide Sections](#guide-sections)\n- [Recommended Tool Stack](#recommended-tool-stack)\n\n---\n\n## Why Quality Assurance?\n\nContent quality issues can harm your site in several ways:\n\n| Issue | Impact |\n|-------|--------|\n| Invalid frontmatter | Build failures, missing metadata |\n| Broken links | Poor user experience, SEO penalties |\n| Inconsistent Markdown | Rendering issues, maintenance burden |\n| Missing alt text | Accessibility violations, SEO impact |\n| YAML syntax errors | Build failures, data loss |\n\nAutomated quality checks catch these issues before they reach production.\n\n---\n\n## Quick Setup\n\nGet started with content quality checks in under 5 minutes:\n\n### 1. Install pre-commit\n\n```bash\n# macOS\nbrew install pre-commit\n\n# pip (all platforms)\npip install pre-commit\n```\n\n### 2. Create Configuration\n\nCreate `.pre-commit-config.yaml` in your site root:\n\n```yaml\nrepos:\n  # YAML/Frontmatter validation\n  - repo: https://github.com/adrienverge/yamllint\n    rev: v1.35.1\n    hooks:\n      - id: yamllint\n        args: [--config-file, .yamllint.yml]\n        types: [markdown]\n\n  # Markdown linting\n  - repo: https://github.com/igorshubovych/markdownlint-cli\n    rev: v0.42.0\n    hooks:\n      - id: markdownlint\n        args: [--config, .markdownlint.json]\n```\n\n### 3. Add Linter Configs\n\nCreate `.yamllint.yml`:\n\n```yaml\nextends: relaxed\nrules:\n  line-length: disable\n  document-start: disable\n```\n\nCreate `.markdownlint.json`:\n\n```json\n{\n  \"MD013\": false,\n  \"MD033\": false,\n  \"MD041\": false\n}\n```\n\n### 4. Install and Run\n\n```bash\npre-commit install\npre-commit run --all-files\n```\n\nNow every commit will automatically validate your content!\n\n---\n\n## Guide Sections\n\nThis quality assurance documentation is organized into the following sections:\n\n### [Pre-commit Hooks](pre-commit-hooks/)\n\nSet up automated checks that run before every commit:\n\n- YAML frontmatter validation\n- Markdown linting with markdownlint\n- Link checking\n- Image alt text validation\n- Custom validation scripts\n\n### [GitHub Actions](github-actions/)\n\nContinuous integration workflows for GitHub:\n\n- Build validation on pull requests\n- Link checking across your entire site\n- Content quality gates\n- Automated reporting\n\n### [GitLab CI](gitlab-ci/)\n\nCI/CD pipelines for GitLab:\n\n- Pipeline configuration\n- Caching for faster builds\n- Merge request quality gates\n- Badge generation\n\n### [Custom Rules](custom-rules/)\n\nConfigure linting rules for your specific needs:\n\n- markdownlint rule customization\n- Custom frontmatter validation\n- Project-specific style guides\n- Rule inheritance and overrides\n\n### [Troubleshooting](troubleshooting/)\n\nCommon issues and solutions:\n\n- False positives and how to handle them\n- Performance optimization\n- Integration debugging\n- Migration from other tools\n\n### [Editor Integration](editor-integration/)\n\nUse lint output with your editor's quickfix features:\n\n- Vim/Neovim quickfix integration\n- VS Code problem matchers\n- Emacs compile-mode\n- Sublime Text build systems\n\n---\n\n## Recommended Tool Stack\n\nHere's the recommended set of tools for comprehensive content quality assurance:\n\n### Essential Tools\n\n| Tool | Purpose | Installation |\n|------|---------|--------------|\n| [pre-commit](https://pre-commit.com/) | Git hooks framework | `pip install pre-commit` |\n| [markdownlint-cli](https://github.com/igorshubovych/markdownlint-cli) | Markdown linting | `npm install -g markdownlint-cli` |\n| [yamllint](https://github.com/adrienverge/yamllint) | YAML validation | `pip install yamllint` |\n\n### Recommended Additions\n\n| Tool | Purpose | Installation |\n|------|---------|--------------|\n| [lychee](https://github.com/lycheeverse/lychee) | Fast link checking | `cargo install lychee` |\n| [htmltest](https://github.com/wjdp/htmltest) | HTML validation | `go install github.com/wjdp/htmltest@latest` |\n| [pa11y](https://pa11y.org/) | Accessibility testing | `npm install -g pa11y` |\n\n### CI-Specific Tools\n\n| Tool | Purpose | Platform |\n|------|---------|----------|\n| [actionlint](https://github.com/rhysd/actionlint) | GitHub Actions validation | GitHub |\n| [super-linter](https://github.com/super-linter/super-linter) | Multi-language linting | GitHub |\n\n---\n\n## Next Steps\n\n1. **Start with pre-commit hooks** - They provide immediate feedback during development\n2. **Add CI checks** - Ensure quality gates in your pull request workflow\n3. **Customize rules** - Adjust linting rules to match your style guide\n4. **Monitor and iterate** - Review false positives and refine your configuration\n\nChoose your next section based on your development workflow:\n\n- Using Git locally? Start with [Pre-commit Hooks](pre-commit-hooks/)\n- Using GitHub? Jump to [GitHub Actions](github-actions/)\n- Using GitLab? See [GitLab CI](gitlab-ci/)\n",
      "summary": "Overview of content quality assurance tools and practices for markata-go sites",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "documentation",
        "quality-assurance",
        "linting",
        "ci-cd"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/quality-assurance/gitlab-ci/",
      "url": "https://markata.dev/docs/guides/quality-assurance/gitlab-ci/",
      "title": "GitLab CI for Content Quality",
      "content_html": "\u003cp\u003eGitLab CI/CD provides powerful pipeline capabilities for validating your markata-go site content. This guide covers pipeline configuration, caching strategies, merge request quality gates, and badge generation.\u003c/p\u003e\n\u003ch2 id=\"table-of-contents\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTable of Contents\u003c/span\u003e \u003ca href=\"#table-of-contents\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#quick-start\"\u003eQuick Start\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#basic-pipeline-configuration\"\u003eBasic Pipeline Configuration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#build-validation-pipeline\"\u003eBuild Validation Pipeline\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#link-checking-pipeline\"\u003eLink Checking Pipeline\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#content-quality-gates\"\u003eContent Quality Gates\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#complete-quality-pipeline\"\u003eComplete Quality Pipeline\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#caching-strategies\"\u003eCaching Strategies\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#merge-request-integration\"\u003eMerge Request Integration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#badge-generation\"\u003eBadge Generation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#gitlab-pages-deployment\"\u003eGitLab Pages Deployment\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCreate \u003ccode\u003e.gitlab-ci.yml\u003c/code\u003e in your repository root:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003estages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003elint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003etest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003elint\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epython:3.12-slim\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebefore_script\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003epip install yamllint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eapt-get update \u0026amp;\u0026amp; apt-get install -y nodejs npm\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003enpm install -g markdownlint-cli\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkdownlint \u0026#39;**/*.md\u0026#39; --ignore node_modules --ignore public\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      for file in $(find . -name \u0026#34;*.md\u0026#34; -not -path \u0026#34;./node_modules/*\u0026#34;); do\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        frontmatter=$(sed -n \u0026#39;1,/^---$/p\u0026#39; \u0026#34;$file\u0026#34; | tail -n +2 | head -n -1)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        if [ -n \u0026#34;$frontmatter\u0026#34; ]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          echo \u0026#34;$frontmatter\u0026#34; | yamllint -d relaxed -\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        fi\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      done\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003echanges\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"basic-pipeline-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Pipeline Configuration\u003c/span\u003e \u003ca href=\"#basic-pipeline-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"pipeline-structure\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePipeline Structure\u003c/span\u003e \u003ca href=\"#pipeline-structure\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .gitlab-ci.yml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003estages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003elint       \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Fast checks\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ebuild      \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Build site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003etest       \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Post-build validation\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003edeploy     \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Deploy to production\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eSITE_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eGO_VERSION\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1.22\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edefault\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egolang:${GO_VERSION}-alpine\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebefore_script\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ego install github.com/waylonwalker/markata-go/cmd/markata-go@latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"environment-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment Variables\u003c/span\u003e \u003ca href=\"#environment-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigure these variables in GitLab Settings \u0026gt; CI/CD \u0026gt; Variables:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eSITE_URL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eProduction site URL\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehttps://example.com\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eDEPLOY_TOKEN\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDeployment credentials\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eglpat-xxx\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eSLACK_WEBHOOK\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNotifications URL\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehttps://hooks.slack.com/...\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"build-validation-pipeline\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Validation Pipeline\u003c/span\u003e \u003ca href=\"#build-validation-pipeline\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"basic-build-job\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Build Job\u003c/span\u003e \u003ca href=\"#basic-build-job\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .gitlab-ci.yml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003estages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003elint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eGO_VERSION\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1.22\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egolang:${GO_VERSION}-alpine\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebefore_script\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ego install github.com/waylonwalker/markata-go/cmd/markata-go@latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkata-go config validate\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eexpire_in\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eweek\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"build-with-environment-specific-urls\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild with Environment-Specific URLs\u003c/span\u003e \u003ca href=\"#build-with-environment-specific-urls\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egolang:1.22-alpine\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebefore_script\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ego install github.com/waylonwalker/markata-go/cmd/markata-go@latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;-\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      ${CI_MERGE_REQUEST_IID:+https://preview-${CI_MERGE_REQUEST_IID}.example.com}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      ${CI_MERGE_REQUEST_IID:-https://example.com}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eexpire_in\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eweek\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"link-checking-pipeline\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLink Checking Pipeline\u003c/span\u003e \u003ca href=\"#link-checking-pipeline\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"using-lychee\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing lychee\u003c/span\u003e \u003ca href=\"#using-lychee\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003echeck-links\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elycheeverse/lychee:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003ebuild]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      lychee \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        --verbose \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        --no-progress \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        --accept 200,204,301,302,307,308 \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        --timeout 30 \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        --max-retries 3 \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        --exclude-path node_modules \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        --exclude-path .git \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        --exclude \u0026#39;localhost\u0026#39; \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        --exclude \u0026#39;127\\.0\\.0\\.1\u0026#39; \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        --exclude \u0026#39;mailto:\u0026#39; \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        \u0026#39;./public/**/*.html\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eallow_failure\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ereports\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ejunit\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elychee-report.xml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ewhen\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ealways\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;schedule\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"scheduled-link-checks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eScheduled Link Checks\u003c/span\u003e \u003ca href=\"#scheduled-link-checks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd to your pipeline for weekly link rot detection:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003echeck-external-links\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elycheeverse/lychee:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      lychee \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        --verbose \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        --include-mail \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        --timeout 60 \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        --max-retries 5 \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        \u0026#39;./public/**/*.html\u0026#39; || true\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# Create issue if links are broken\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      if [ -f lychee/out.md ] \u0026amp;\u0026amp; [ -s lychee/out.md ]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        echo \u0026#34;Broken links detected. See artifacts for details.\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        exit 1\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      fi\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003elychee/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eexpire_in\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emonth\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;schedule\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eConfigure a scheduled pipeline in GitLab Settings \u0026gt; CI/CD \u0026gt; Schedules:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDescription: \u0026ldquo;Weekly link check\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eInterval: \u003ccode\u003e0 0 * * 0\u003c/code\u003e (weekly on Sunday)\u003c/li\u003e\n\u003cli\u003eTarget branch: \u003ccode\u003emain\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"content-quality-gates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContent Quality Gates\u003c/span\u003e \u003ca href=\"#content-quality-gates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"comprehensive-linting-job\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComprehensive Linting Job\u003c/span\u003e \u003ca href=\"#comprehensive-linting-job\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003elint\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epython:3.12-slim\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebefore_script\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003epip install yamllint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eapt-get update \u0026amp;\u0026amp; apt-get install -y nodejs npm\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003enpm install -g markdownlint-cli\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# Markdown linting\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkdownlint \u0026#39;**/*.md\u0026#39; --ignore node_modules --ignore public --config .markdownlint.json\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# YAML frontmatter validation\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      for file in $(find . -name \u0026#34;*.md\u0026#34; -not -path \u0026#34;./node_modules/*\u0026#34; -not -path \u0026#34;./public/*\u0026#34;); do\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        echo \u0026#34;Checking: $file\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        frontmatter=$(sed -n \u0026#39;1,/^---$/p\u0026#39; \u0026#34;$file\u0026#34; | tail -n +2 | head -n -1)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        if [ -n \u0026#34;$frontmatter\u0026#34; ]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          echo \u0026#34;$frontmatter\u0026#34; | yamllint -c .yamllint.yml - || exit 1\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        fi\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      done\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003echanges\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003efrontmatter-validation\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ealpine:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      errors=0\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      for file in $(find docs -name \u0026#34;*.md\u0026#34; 2\u0026gt;/dev/null); do\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        for field in title date published; do\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          if ! grep -q \u0026#34;^${field}:\u0026#34; \u0026#34;$file\u0026#34;; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            echo \u0026#34;ERROR: $file - Missing required field: $field\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            errors=$((errors + 1))\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          fi\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        done\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      done\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      if [ $errors -gt 0 ]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        echo \u0026#34;Found $errors frontmatter errors\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        exit 1\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      fi\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      echo \u0026#34;All frontmatter valid!\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003echanges\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ealt-text-check\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ealpine:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      errors=0\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      for file in $(find . -name \u0026#34;*.md\u0026#34; -not -path \u0026#34;./node_modules/*\u0026#34;); do\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        if grep -Pn \u0026#39;!\\[\\s*\\]\\(\u0026#39; \u0026#34;$file\u0026#34;; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          echo \u0026#34;ERROR: $file - Found image(s) without alt text\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          errors=$((errors + 1))\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        fi\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      done\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      if [ $errors -gt 0 ]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        echo \u0026#34;Found $errors images missing alt text\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        exit 1\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      fi\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      echo \u0026#34;All images have alt text!\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003echanges\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"spell-checking\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSpell Checking\u003c/span\u003e \u003ca href=\"#spell-checking\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003espellcheck\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003erust:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebefore_script\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ecargo install typos-cli\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003etypos ./docs --config .typos.toml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eallow_failure\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003echanges\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"complete-quality-pipeline\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComplete Quality Pipeline\u003c/span\u003e \u003ca href=\"#complete-quality-pipeline\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA comprehensive pipeline that runs all quality checks:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .gitlab-ci.yml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Complete content quality pipeline for markata-go sites\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003estages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003elint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003etest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eGO_VERSION\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1.22\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eNODE_VERSION\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;20\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eSITE_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Templates for reuse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e.go-setup\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egolang:${GO_VERSION}-alpine\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebefore_script\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ego install github.com/waylonwalker/markata-go/cmd/markata-go@latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e.node-setup\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enode:${NODE_VERSION}-alpine\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebefore_script\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003enpm install -g markdownlint-cli\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e.python-setup\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epython:3.12-slim\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebefore_script\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003epip install yamllint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Stage 1: Lint (parallel jobs)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emarkdown-lint\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eextends\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e.node-setup\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkdownlint \u0026#39;**/*.md\u0026#39; --ignore node_modules --ignore public --config .markdownlint.json\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003echanges\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eyaml-lint\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eextends\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e.python-setup\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eyamllint -c .yamllint.yml .\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003echanges\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;**/*.yml\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;**/*.yaml\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003efrontmatter\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ealpine:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      errors=0\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      for file in $(find docs -name \u0026#34;*.md\u0026#34; 2\u0026gt;/dev/null || true); do\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        for field in title date published; do\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          if ! grep -q \u0026#34;^${field}:\u0026#34; \u0026#34;$file\u0026#34; 2\u0026gt;/dev/null; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            echo \u0026#34;ERROR: $file - Missing: $field\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            errors=$((errors + 1))\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          fi\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        done\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      done\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      [ $errors -eq 0 ] || exit 1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003echanges\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Stage 2: Build\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eextends\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e.go-setup\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emarkdown-lint, yaml-lint, frontmatter]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkata-go config validate\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$SITE_URL\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eexpire_in\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eweek\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Stage 3: Test (post-build validation)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ehtml-validate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enode:${NODE_VERSION}-alpine\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003ebuild]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebefore_script\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003enpm install -g html-validate\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ehtml-validate \u0026#34;public/**/*.html\u0026#34; --config .htmlvalidate.json || true\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eallow_failure\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003echeck-links\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elycheeverse/lychee:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003ebuild]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      lychee \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        --verbose \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        --no-progress \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        --accept 200,204,301,302,307,308 \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        --exclude-path node_modules \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        --exclude \u0026#39;localhost\u0026#39; \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        \u0026#39;./public/**/*.html\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eallow_failure\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003elychee/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ewhen\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ealways\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Stage 4: Deploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003ebuild, html-validate, check-links]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Deploying to GitLab Pages\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eproduction\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$SITE_URL\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"caching-strategies\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCaching Strategies\u003c/span\u003e \u003ca href=\"#caching-strategies\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSpeed up your pipelines with effective caching.\u003c/p\u003e\n\u003ch3 id=\"go-module-cache\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGo Module Cache\u003c/span\u003e \u003ca href=\"#go-module-cache\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eGOPATH\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PROJECT_DIR/.go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egolang:1.22-alpine\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ego-modules-$CI_COMMIT_REF_SLUG\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003e.go/pkg/mod/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epolicy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epull-push\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ego install github.com/waylonwalker/markata-go/cmd/markata-go@latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"node-js-cache\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNode.js Cache\u003c/span\u003e \u003ca href=\"#node-js-cache\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003elint\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enode:20-alpine\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enode-modules-$CI_COMMIT_REF_SLUG\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003enode_modules/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epolicy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epull-push\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003enpm install markdownlint-cli\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003enpx markdownlint \u0026#39;**/*.md\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"combined-cache-strategy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCombined Cache Strategy\u003c/span\u003e \u003ca href=\"#combined-cache-strategy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eGOPATH\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PROJECT_DIR/.go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003enpm_config_cache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PROJECT_DIR/.npm\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edefault\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ego-$CI_COMMIT_REF_SLUG\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"l\"\u003e.go/pkg/mod/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003epolicy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epull-push\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enpm-$CI_COMMIT_REF_SLUG\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"l\"\u003e.npm/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003epolicy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epull-push\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"merge-request-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMerge Request Integration\u003c/span\u003e \u003ca href=\"#merge-request-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"merge-request-pipelines\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMerge Request Pipelines\u003c/span\u003e \u003ca href=\"#merge-request-pipelines\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigure pipelines to run on merge requests:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eworkflow\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;schedule\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003elint\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Running lint checks\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003echanges\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"merge-request-comments\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMerge Request Comments\u003c/span\u003e \u003ca href=\"#merge-request-comments\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eReport quality issues directly in merge request comments:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ereport-quality\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ealpine:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003elint, build]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      # Collect lint results\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      if [ -f lint-results.json ]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        echo \u0026#34;## Content Quality Report\u0026#34; \u0026gt; report.md\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        echo \u0026#34;\u0026#34; \u0026gt;\u0026gt; report.md\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        echo \u0026#34;### Linting Results\u0026#34; \u0026gt;\u0026gt; report.md\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        cat lint-results.json | jq -r \u0026#39;.[] | \u0026#34;- \\(.file): \\(.message)\u0026#34;\u0026#39; \u0026gt;\u0026gt; report.md\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      fi\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# Post comment to MR\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      if [ -f report.md ]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        curl --request POST \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          --header \u0026#34;PRIVATE-TOKEN: ${GITLAB_TOKEN}\u0026#34; \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          --form \u0026#34;body=$(cat report.md)\u0026#34; \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          \u0026#34;${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests/${CI_MERGE_REQUEST_IID}/notes\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      fi\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"required-approvals\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRequired Approvals\u003c/span\u003e \u003ca href=\"#required-approvals\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigure merge request approval rules in GitLab Settings \u0026gt; Merge Requests:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eRequire pipeline to succeed\u003c/strong\u003e before merging\u003c/li\u003e\n\u003cli\u003eSet \u003cstrong\u003erequired approvals\u003c/strong\u003e for content changes\u003c/li\u003e\n\u003cli\u003eConfigure \u003cstrong\u003ecode owners\u003c/strong\u003e for documentation directories\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eExample \u003ccode\u003eCODEOWNERS\u003c/code\u003e file:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e# .gitlab/CODEOWNERS\ndocs/       @docs-team\n*.md        @docs-team @content-reviewers\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch2 id=\"badge-generation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBadge Generation\u003c/span\u003e \u003ca href=\"#badge-generation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd status badges to your README.\u003c/p\u003e\n\u003ch3 id=\"pipeline-status-badge\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePipeline Status Badge\u003c/span\u003e \u003ca href=\"#pipeline-status-badge\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003e![Pipeline Status\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://gitlab.com/username/repo/badges/main/pipeline.svg\u003c/span\u003e)](https://gitlab.com/username/repo/-/pipelines)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"coverage-badge-if-applicable\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCoverage Badge (if applicable)\u003c/span\u003e \u003ca href=\"#coverage-badge-if-applicable\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003e![Coverage\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://gitlab.com/username/repo/badges/main/coverage.svg\u003c/span\u003e)](https://gitlab.com/username/repo/-/jobs)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"custom-badges\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Badges\u003c/span\u003e \u003ca href=\"#custom-badges\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGenerate custom badges for quality metrics:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003egenerate-badges\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ealpine:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# Count markdown files\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003efile_count=$(find docs -name \u0026#34;*.md\u0026#34; | wc -l)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# Generate badge JSON for shields.io\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      cat \u0026gt; public/badges/docs-count.json \u0026lt;\u0026lt; EOF\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        \u0026#34;schemaVersion\u0026#34;: 1,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        \u0026#34;label\u0026#34;: \u0026#34;docs\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        \u0026#34;message\u0026#34;: \u0026#34;${file_count} pages\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        \u0026#34;color\u0026#34;: \u0026#34;blue\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      EOF\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/badges/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse with shields.io:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eDocs Count\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://img.shields.io/endpoint?url=https://example.com/badges/docs-count.json\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"gitlab-pages-deployment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGitLab Pages Deployment\u003c/span\u003e \u003ca href=\"#gitlab-pages-deployment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"basic-pages-deployment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Pages Deployment\u003c/span\u003e \u003ca href=\"#basic-pages-deployment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Deploying to GitLab Pages\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"pages-with-review-apps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePages with Review Apps\u003c/span\u003e \u003ca href=\"#pages-with-review-apps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDeploy preview environments for merge requests:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epages:review\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003ebuild]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Deploying review app\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ereview/$CI_COMMIT_REF_SLUG\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://$CI_PROJECT_NAMESPACE.gitlab.io/-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/public/index.html\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eon_stop\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003estop:review\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eauto_stop_in\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eweek\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003estop:review\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Stopping review app\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ereview/$CI_COMMIT_REF_SLUG\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003estop\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ewhen\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emanual\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"common-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Issues\u003c/span\u003e \u003ca href=\"#common-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003ePipeline not triggering on MR\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eEnsure workflow rules are configured:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eworkflow\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCache not working\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCheck cache key and paths:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_REF_SLUG \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Use branch-specific keys\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003e.go/pkg/mod/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epolicy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epull-push \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Ensure both pull and push\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eJob stuck in pending\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCheck runner availability and tags:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003edocker \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Match available runners\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eArtifacts not available in downstream jobs\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eUse \u003ccode\u003eneeds\u003c/code\u003e to explicitly depend on artifacts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edeploy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003ejob\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"pre-commit-hooks/\"\u003ePre-commit Hooks\u003c/a\u003e - Local quality checks\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"github-actions/\"\u003eGitHub Actions\u003c/a\u003e - GitHub CI/CD configuration\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"custom-rules/\"\u003eCustom Rules\u003c/a\u003e - Configure linting rules\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"troubleshooting/\"\u003eTroubleshooting\u003c/a\u003e - Common issues and solutions\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nGitLab CI/CD provides powerful pipeline capabilities for validating your markata-go site content. This guide covers pipeline configuration, caching strategies, merge request quality gates, and badge generation.\n\n## Table of Contents\n\n- [Quick Start](#quick-start)\n- [Basic Pipeline Configuration](#basic-pipeline-configuration)\n- [Build Validation Pipeline](#build-validation-pipeline)\n- [Link Checking Pipeline](#link-checking-pipeline)\n- [Content Quality Gates](#content-quality-gates)\n- [Complete Quality Pipeline](#complete-quality-pipeline)\n- [Caching Strategies](#caching-strategies)\n- [Merge Request Integration](#merge-request-integration)\n- [Badge Generation](#badge-generation)\n- [GitLab Pages Deployment](#gitlab-pages-deployment)\n\n---\n\n## Quick Start\n\nCreate `.gitlab-ci.yml` in your repository root:\n\n```yaml\nstages:\n  - lint\n  - build\n  - test\n\nlint:\n  stage: lint\n  image: python:3.12-slim\n  before_script:\n    - pip install yamllint\n    - apt-get update \u0026\u0026 apt-get install -y nodejs npm\n    - npm install -g markdownlint-cli\n  script:\n    - markdownlint '**/*.md' --ignore node_modules --ignore public\n    - |\n      for file in $(find . -name \"*.md\" -not -path \"./node_modules/*\"); do\n        frontmatter=$(sed -n '1,/^---$/p' \"$file\" | tail -n +2 | head -n -1)\n        if [ -n \"$frontmatter\" ]; then\n          echo \"$frontmatter\" | yamllint -d relaxed -\n        fi\n      done\n  rules:\n    - changes:\n        - \"**/*.md\"\n```\n\n---\n\n## Basic Pipeline Configuration\n\n### Pipeline Structure\n\n```yaml\n# .gitlab-ci.yml\nstages:\n  - lint        # Fast checks\n  - build       # Build site\n  - test        # Post-build validation\n  - deploy      # Deploy to production\n\nvariables:\n  SITE_URL: https://example.com\n  GO_VERSION: \"1.22\"\n\ndefault:\n  image: golang:${GO_VERSION}-alpine\n  before_script:\n    - go install github.com/waylonwalker/markata-go/cmd/markata-go@latest\n```\n\n### Environment Variables\n\nConfigure these variables in GitLab Settings \u003e CI/CD \u003e Variables:\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| `SITE_URL` | Production site URL | `https://example.com` |\n| `DEPLOY_TOKEN` | Deployment credentials | `glpat-xxx` |\n| `SLACK_WEBHOOK` | Notifications URL | `https://hooks.slack.com/...` |\n\n---\n\n## Build Validation Pipeline\n\n### Basic Build Job\n\n```yaml\n# .gitlab-ci.yml\nstages:\n  - lint\n  - build\n\nvariables:\n  GO_VERSION: \"1.22\"\n\nbuild:\n  stage: build\n  image: golang:${GO_VERSION}-alpine\n  \n  before_script:\n    - go install github.com/waylonwalker/markata-go/cmd/markata-go@latest\n  \n  script:\n    - markata-go config validate\n    - markata-go build --clean\n  \n  artifacts:\n    paths:\n      - public/\n    expire_in: 1 week\n  \n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n```\n\n### Build with Environment-Specific URLs\n\n```yaml\nbuild:\n  stage: build\n  image: golang:1.22-alpine\n  \n  before_script:\n    - go install github.com/waylonwalker/markata-go/cmd/markata-go@latest\n  \n  script:\n    - markata-go build --clean\n  \n  variables:\n    MARKATA_GO_URL: \u003e-\n      ${CI_MERGE_REQUEST_IID:+https://preview-${CI_MERGE_REQUEST_IID}.example.com}\n      ${CI_MERGE_REQUEST_IID:-https://example.com}\n  \n  artifacts:\n    paths:\n      - public/\n    expire_in: 1 week\n```\n\n---\n\n## Link Checking Pipeline\n\n### Using lychee\n\n```yaml\ncheck-links:\n  stage: test\n  image: lycheeverse/lychee:latest\n  needs: [build]\n  \n  script:\n    - |\n      lychee \\\n        --verbose \\\n        --no-progress \\\n        --accept 200,204,301,302,307,308 \\\n        --timeout 30 \\\n        --max-retries 3 \\\n        --exclude-path node_modules \\\n        --exclude-path .git \\\n        --exclude 'localhost' \\\n        --exclude '127\\.0\\.0\\.1' \\\n        --exclude 'mailto:' \\\n        './public/**/*.html'\n  \n  allow_failure: true\n  \n  artifacts:\n    reports:\n      junit: lychee-report.xml\n    when: always\n  \n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n    - if: $CI_PIPELINE_SOURCE == \"schedule\"\n```\n\n### Scheduled Link Checks\n\nAdd to your pipeline for weekly link rot detection:\n\n```yaml\ncheck-external-links:\n  stage: test\n  image: lycheeverse/lychee:latest\n  \n  script:\n    - |\n      lychee \\\n        --verbose \\\n        --include-mail \\\n        --timeout 60 \\\n        --max-retries 5 \\\n        './public/**/*.html' || true\n    \n    # Create issue if links are broken\n    - |\n      if [ -f lychee/out.md ] \u0026\u0026 [ -s lychee/out.md ]; then\n        echo \"Broken links detected. See artifacts for details.\"\n        exit 1\n      fi\n  \n  artifacts:\n    paths:\n      - lychee/\n    expire_in: 1 month\n  \n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"schedule\"\n```\n\nConfigure a scheduled pipeline in GitLab Settings \u003e CI/CD \u003e Schedules:\n- Description: \"Weekly link check\"\n- Interval: `0 0 * * 0` (weekly on Sunday)\n- Target branch: `main`\n\n---\n\n## Content Quality Gates\n\n### Comprehensive Linting Job\n\n```yaml\nlint:\n  stage: lint\n  image: python:3.12-slim\n  \n  before_script:\n    - pip install yamllint\n    - apt-get update \u0026\u0026 apt-get install -y nodejs npm\n    - npm install -g markdownlint-cli\n  \n  script:\n    # Markdown linting\n    - markdownlint '**/*.md' --ignore node_modules --ignore public --config .markdownlint.json\n    \n    # YAML frontmatter validation\n    - |\n      for file in $(find . -name \"*.md\" -not -path \"./node_modules/*\" -not -path \"./public/*\"); do\n        echo \"Checking: $file\"\n        frontmatter=$(sed -n '1,/^---$/p' \"$file\" | tail -n +2 | head -n -1)\n        if [ -n \"$frontmatter\" ]; then\n          echo \"$frontmatter\" | yamllint -c .yamllint.yml - || exit 1\n        fi\n      done\n  \n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n      changes:\n        - \"**/*.md\"\n\nfrontmatter-validation:\n  stage: lint\n  image: alpine:latest\n  \n  script:\n    - |\n      errors=0\n      for file in $(find docs -name \"*.md\" 2\u003e/dev/null); do\n        for field in title date published; do\n          if ! grep -q \"^${field}:\" \"$file\"; then\n            echo \"ERROR: $file - Missing required field: $field\"\n            errors=$((errors + 1))\n          fi\n        done\n      done\n      \n      if [ $errors -gt 0 ]; then\n        echo \"Found $errors frontmatter errors\"\n        exit 1\n      fi\n      echo \"All frontmatter valid!\"\n  \n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n      changes:\n        - \"**/*.md\"\n\nalt-text-check:\n  stage: lint\n  image: alpine:latest\n  \n  script:\n    - |\n      errors=0\n      for file in $(find . -name \"*.md\" -not -path \"./node_modules/*\"); do\n        if grep -Pn '!\\[\\s*\\]\\(' \"$file\"; then\n          echo \"ERROR: $file - Found image(s) without alt text\"\n          errors=$((errors + 1))\n        fi\n      done\n      \n      if [ $errors -gt 0 ]; then\n        echo \"Found $errors images missing alt text\"\n        exit 1\n      fi\n      echo \"All images have alt text!\"\n  \n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n      changes:\n        - \"**/*.md\"\n```\n\n### Spell Checking\n\n```yaml\nspellcheck:\n  stage: lint\n  image: rust:latest\n  \n  before_script:\n    - cargo install typos-cli\n  \n  script:\n    - typos ./docs --config .typos.toml\n  \n  allow_failure: true\n  \n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n      changes:\n        - \"**/*.md\"\n```\n\n---\n\n## Complete Quality Pipeline\n\nA comprehensive pipeline that runs all quality checks:\n\n```yaml\n# .gitlab-ci.yml\n# Complete content quality pipeline for markata-go sites\n\nstages:\n  - lint\n  - build\n  - test\n  - deploy\n\nvariables:\n  GO_VERSION: \"1.22\"\n  NODE_VERSION: \"20\"\n  SITE_URL: https://example.com\n\n# ============================================\n# Templates for reuse\n# ============================================\n\n.go-setup:\n  image: golang:${GO_VERSION}-alpine\n  before_script:\n    - go install github.com/waylonwalker/markata-go/cmd/markata-go@latest\n\n.node-setup:\n  image: node:${NODE_VERSION}-alpine\n  before_script:\n    - npm install -g markdownlint-cli\n\n.python-setup:\n  image: python:3.12-slim\n  before_script:\n    - pip install yamllint\n\n# ============================================\n# Stage 1: Lint (parallel jobs)\n# ============================================\n\nmarkdown-lint:\n  extends: .node-setup\n  stage: lint\n  \n  script:\n    - markdownlint '**/*.md' --ignore node_modules --ignore public --config .markdownlint.json\n  \n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n      changes:\n        - \"**/*.md\"\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n\nyaml-lint:\n  extends: .python-setup\n  stage: lint\n  \n  script:\n    - yamllint -c .yamllint.yml .\n  \n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n      changes:\n        - \"**/*.md\"\n        - \"**/*.yml\"\n        - \"**/*.yaml\"\n\nfrontmatter:\n  stage: lint\n  image: alpine:latest\n  \n  script:\n    - |\n      errors=0\n      for file in $(find docs -name \"*.md\" 2\u003e/dev/null || true); do\n        for field in title date published; do\n          if ! grep -q \"^${field}:\" \"$file\" 2\u003e/dev/null; then\n            echo \"ERROR: $file - Missing: $field\"\n            errors=$((errors + 1))\n          fi\n        done\n      done\n      [ $errors -eq 0 ] || exit 1\n  \n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n      changes:\n        - \"**/*.md\"\n\n# ============================================\n# Stage 2: Build\n# ============================================\n\nbuild:\n  extends: .go-setup\n  stage: build\n  needs: [markdown-lint, yaml-lint, frontmatter]\n  \n  script:\n    - markata-go config validate\n    - markata-go build --clean\n  \n  variables:\n    MARKATA_GO_URL: $SITE_URL\n  \n  artifacts:\n    paths:\n      - public/\n    expire_in: 1 week\n  \n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n\n# ============================================\n# Stage 3: Test (post-build validation)\n# ============================================\n\nhtml-validate:\n  stage: test\n  image: node:${NODE_VERSION}-alpine\n  needs: [build]\n  \n  before_script:\n    - npm install -g html-validate\n  \n  script:\n    - html-validate \"public/**/*.html\" --config .htmlvalidate.json || true\n  \n  allow_failure: true\n  \n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n\ncheck-links:\n  stage: test\n  image: lycheeverse/lychee:latest\n  needs: [build]\n  \n  script:\n    - |\n      lychee \\\n        --verbose \\\n        --no-progress \\\n        --accept 200,204,301,302,307,308 \\\n        --exclude-path node_modules \\\n        --exclude 'localhost' \\\n        './public/**/*.html'\n  \n  allow_failure: true\n  \n  artifacts:\n    paths:\n      - lychee/\n    when: always\n  \n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n\n# ============================================\n# Stage 4: Deploy\n# ============================================\n\npages:\n  stage: deploy\n  needs: [build, html-validate, check-links]\n  \n  script:\n    - echo \"Deploying to GitLab Pages\"\n  \n  artifacts:\n    paths:\n      - public/\n  \n  environment:\n    name: production\n    url: $SITE_URL\n  \n  rules:\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n```\n\n---\n\n## Caching Strategies\n\nSpeed up your pipelines with effective caching.\n\n### Go Module Cache\n\n```yaml\nvariables:\n  GOPATH: $CI_PROJECT_DIR/.go\n\nbuild:\n  stage: build\n  image: golang:1.22-alpine\n  \n  cache:\n    key: go-modules-$CI_COMMIT_REF_SLUG\n    paths:\n      - .go/pkg/mod/\n    policy: pull-push\n  \n  script:\n    - go install github.com/waylonwalker/markata-go/cmd/markata-go@latest\n    - markata-go build --clean\n```\n\n### Node.js Cache\n\n```yaml\nlint:\n  stage: lint\n  image: node:20-alpine\n  \n  cache:\n    key: node-modules-$CI_COMMIT_REF_SLUG\n    paths:\n      - node_modules/\n    policy: pull-push\n  \n  script:\n    - npm install markdownlint-cli\n    - npx markdownlint '**/*.md'\n```\n\n### Combined Cache Strategy\n\n```yaml\nvariables:\n  GOPATH: $CI_PROJECT_DIR/.go\n  npm_config_cache: $CI_PROJECT_DIR/.npm\n\ndefault:\n  cache:\n    - key: go-$CI_COMMIT_REF_SLUG\n      paths:\n        - .go/pkg/mod/\n      policy: pull-push\n    - key: npm-$CI_COMMIT_REF_SLUG\n      paths:\n        - .npm/\n      policy: pull-push\n```\n\n---\n\n## Merge Request Integration\n\n### Merge Request Pipelines\n\nConfigure pipelines to run on merge requests:\n\n```yaml\nworkflow:\n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n    - if: $CI_PIPELINE_SOURCE == \"schedule\"\n\nlint:\n  stage: lint\n  script:\n    - echo \"Running lint checks\"\n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n      changes:\n        - \"**/*.md\"\n```\n\n### Merge Request Comments\n\nReport quality issues directly in merge request comments:\n\n```yaml\nreport-quality:\n  stage: test\n  image: alpine:latest\n  needs: [lint, build]\n  \n  script:\n    - |\n      # Collect lint results\n      if [ -f lint-results.json ]; then\n        echo \"## Content Quality Report\" \u003e report.md\n        echo \"\" \u003e\u003e report.md\n        echo \"### Linting Results\" \u003e\u003e report.md\n        cat lint-results.json | jq -r '.[] | \"- \\(.file): \\(.message)\"' \u003e\u003e report.md\n      fi\n    \n    # Post comment to MR\n    - |\n      if [ -f report.md ]; then\n        curl --request POST \\\n          --header \"PRIVATE-TOKEN: ${GITLAB_TOKEN}\" \\\n          --form \"body=$(cat report.md)\" \\\n          \"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests/${CI_MERGE_REQUEST_IID}/notes\"\n      fi\n  \n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n```\n\n### Required Approvals\n\nConfigure merge request approval rules in GitLab Settings \u003e Merge Requests:\n\n1. **Require pipeline to succeed** before merging\n2. Set **required approvals** for content changes\n3. Configure **code owners** for documentation directories\n\nExample `CODEOWNERS` file:\n\n```\n# .gitlab/CODEOWNERS\ndocs/       @docs-team\n*.md        @docs-team @content-reviewers\n```\n\n---\n\n## Badge Generation\n\nAdd status badges to your README.\n\n### Pipeline Status Badge\n\n```markdown\n[![Pipeline Status](https://gitlab.com/username/repo/badges/main/pipeline.svg)](https://gitlab.com/username/repo/-/pipelines)\n```\n\n### Coverage Badge (if applicable)\n\n```markdown\n[![Coverage](https://gitlab.com/username/repo/badges/main/coverage.svg)](https://gitlab.com/username/repo/-/jobs)\n```\n\n### Custom Badges\n\nGenerate custom badges for quality metrics:\n\n```yaml\ngenerate-badges:\n  stage: deploy\n  image: alpine:latest\n  \n  script:\n    # Count markdown files\n    - file_count=$(find docs -name \"*.md\" | wc -l)\n    \n    # Generate badge JSON for shields.io\n    - |\n      cat \u003e public/badges/docs-count.json \u003c\u003c EOF\n      {\n        \"schemaVersion\": 1,\n        \"label\": \"docs\",\n        \"message\": \"${file_count} pages\",\n        \"color\": \"blue\"\n      }\n      EOF\n  \n  artifacts:\n    paths:\n      - public/badges/\n  \n  rules:\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n```\n\nUse with shields.io:\n\n```markdown\n![Docs Count](https://img.shields.io/endpoint?url=https://example.com/badges/docs-count.json)\n```\n\n---\n\n## GitLab Pages Deployment\n\n### Basic Pages Deployment\n\n```yaml\npages:\n  stage: deploy\n  \n  script:\n    - echo \"Deploying to GitLab Pages\"\n  \n  artifacts:\n    paths:\n      - public/\n  \n  rules:\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n```\n\n### Pages with Review Apps\n\nDeploy preview environments for merge requests:\n\n```yaml\npages:review:\n  stage: deploy\n  needs: [build]\n  \n  script:\n    - echo \"Deploying review app\"\n  \n  artifacts:\n    paths:\n      - public/\n  \n  environment:\n    name: review/$CI_COMMIT_REF_SLUG\n    url: https://$CI_PROJECT_NAMESPACE.gitlab.io/-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/public/index.html\n    on_stop: stop:review\n    auto_stop_in: 1 week\n  \n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n\nstop:review:\n  stage: deploy\n  \n  script:\n    - echo \"Stopping review app\"\n  \n  environment:\n    name: review/$CI_COMMIT_REF_SLUG\n    action: stop\n  \n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n      when: manual\n```\n\n---\n\n## Troubleshooting\n\n### Common Issues\n\n**Pipeline not triggering on MR**\n\nEnsure workflow rules are configured:\n\n```yaml\nworkflow:\n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n```\n\n**Cache not working**\n\nCheck cache key and paths:\n\n```yaml\ncache:\n  key: $CI_COMMIT_REF_SLUG  # Use branch-specific keys\n  paths:\n    - .go/pkg/mod/\n  policy: pull-push  # Ensure both pull and push\n```\n\n**Job stuck in pending**\n\nCheck runner availability and tags:\n\n```yaml\nbuild:\n  tags:\n    - docker  # Match available runners\n```\n\n**Artifacts not available in downstream jobs**\n\nUse `needs` to explicitly depend on artifacts:\n\n```yaml\ndeploy:\n  needs:\n    - job: build\n      artifacts: true\n```\n\n---\n\n## See Also\n\n- [Pre-commit Hooks](pre-commit-hooks/) - Local quality checks\n- [GitHub Actions](github-actions/) - GitHub CI/CD configuration\n- [Custom Rules](custom-rules/) - Configure linting rules\n- [Troubleshooting](troubleshooting/) - Common issues and solutions\n",
      "summary": "CI/CD pipelines for content validation, link checking, and quality gates in GitLab",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "documentation",
        "quality-assurance",
        "gitlab-ci",
        "ci-cd"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/quality-assurance/github-actions/",
      "url": "https://markata.dev/docs/guides/quality-assurance/github-actions/",
      "title": "GitHub Actions for Content Quality",
      "content_html": "\u003cp\u003eGitHub Actions provides powerful CI/CD capabilities for validating your markata-go site content. This guide covers workflows for build validation, link checking, and content quality gates.\u003c/p\u003e\n\u003ch2 id=\"table-of-contents\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTable of Contents\u003c/span\u003e \u003ca href=\"#table-of-contents\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#quick-start\"\u003eQuick Start\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#build-validation-workflow\"\u003eBuild Validation Workflow\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#link-checking-workflow\"\u003eLink Checking Workflow\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#content-quality-gates\"\u003eContent Quality Gates\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#complete-quality-pipeline\"\u003eComplete Quality Pipeline\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#reusable-workflows\"\u003eReusable Workflows\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#status-badges\"\u003eStatus Badges\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCreate \u003ccode\u003e.github/workflows/content-quality.yml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eContent Quality\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003elint\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eLint Markdown\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDavidAnson/markdownlint-cli2-action@v16\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eglobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            **/*.md\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            !node_modules\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            !public\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCheck YAML frontmatter\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          pip install yamllint\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          find . -name \u0026#34;*.md\u0026#34; -exec grep -l \u0026#34;^---\u0026#34; {} \\; | \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            xargs -I {} sh -c \u0026#39;sed -n \u0026#34;/^---$/,/^---$/p\u0026#34; {} | yamllint -\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"build-validation-workflow\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Validation Workflow\u003c/span\u003e \u003ca href=\"#build-validation-workflow\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEnsure your site builds successfully on every push and pull request.\u003c/p\u003e\n\u003ch3 id=\"basic-build-check\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Build Check\u003c/span\u003e \u003ca href=\"#basic-build-check\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .github/workflows/build.yml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild Validation\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s1\"\u003e\u0026#39;**.md\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s1\"\u003e\u0026#39;**.toml\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s1\"\u003e\u0026#39;templates/**\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s1\"\u003e\u0026#39;static/**\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCheckout\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-go@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ego-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1.22\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ego install github.com/waylonwalker/markata-go/cmd/markata-go@latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eValidate config\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go config validate\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ github.event_name == \u0026#39;pull_request\u0026#39; \u0026amp;\u0026amp; format(\u0026#39;https://preview-{0}.example.com\u0026#39;, github.event.number) || \u0026#39;https://example.com\u0026#39; }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eUpload build artifact\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/upload-artifact@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esite-build\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eretention-days\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e7\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"build-with-cache\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild with Cache\u003c/span\u003e \u003ca href=\"#build-with-cache\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSpeed up builds by caching Go modules and the markata-go binary:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .github/workflows/build-cached.yml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild (Cached)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-go@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ego-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1.22\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCache markata-go binary\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/cache@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-cache\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e~/go/bin/markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go-${{ runner.os }}-${{ hashFiles(\u0026#39;go.sum\u0026#39;) }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003erestore-keys\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            markata-go-${{ runner.os }}-\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esteps.markata-cache.outputs.cache-hit != \u0026#39;true\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ego install github.com/waylonwalker/markata-go/cmd/markata-go@latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e~/go/bin/markata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"link-checking-workflow\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLink Checking Workflow\u003c/span\u003e \u003ca href=\"#link-checking-workflow\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCheck for broken links across your entire site.\u003c/p\u003e\n\u003ch3 id=\"using-lychee-recommended\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing lychee (Recommended)\u003c/span\u003e \u003ca href=\"#using-lychee-recommended\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/lycheeverse/lychee\"\u003elychee\u003c/a\u003e is fast and handles many edge cases:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .github/workflows/links.yml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eLink Checker\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eschedule\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# Run weekly to catch external link rot\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003ecron\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;0 0 * * 0\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003echeck-links\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-go@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ego-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1.22\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall and build\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          go install github.com/waylonwalker/markata-go/cmd/markata-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          markata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCheck links\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elycheeverse/lychee-action@v1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;-\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --verbose\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --no-progress\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --accept 200,204,301,302,307,308\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --timeout 30\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --max-retries 3\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --exclude-path node_modules\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --exclude-path .git\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --exclude \u0026#39;https://localhost.*\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --exclude \u0026#39;https://127\\.0\\.0\\.1.*\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --exclude \u0026#39;mailto:.*\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            \u0026#39;./public/**/*.html\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003efail\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eGITHUB_TOKEN\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCreate issue on failure\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003efailure() \u0026amp;\u0026amp; github.event_name == \u0026#39;schedule\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epeter-evans/create-issue-from-file@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBroken links detected\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003econtent-filepath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e./lychee/out.md\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003elabels\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebug, documentation\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"using-markdown-link-check\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing markdown-link-check\u003c/span\u003e \u003ca href=\"#using-markdown-link-check\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor checking Markdown files directly (without building):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .github/workflows/markdown-links.yml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eMarkdown Link Check\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;**.md\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;**.md\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003echeck-links\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCheck Markdown links\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egaurav-nelson/github-action-markdown-link-check@v1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003econfig-file\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;.markdown-link-check.json\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003euse-quiet-mode\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;yes\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003euse-verbose-mode\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;yes\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003efolder-path\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;docs/\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003efile-extension\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;.md\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"link-check-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLink Check Configuration\u003c/span\u003e \u003ca href=\"#link-check-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003e.markdown-link-check.json\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;ignorePatterns\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^https://localhost\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^https://127\\\\.0\\\\.0\\\\.1\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^#\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^mailto:\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;replacementPatterns\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^/docs/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;replacement\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/docs/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;httpHeaders\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;urls\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://github.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://api.github.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;headers\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;Accept\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;text/html, application/vnd.github.v3+json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;timeout\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;20s\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;retryOn429\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;retryCount\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;fallbackRetryDelay\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;10s\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;aliveStatusCodes\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e200\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e206\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e301\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e302\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e307\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e308\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"content-quality-gates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContent Quality Gates\u003c/span\u003e \u003ca href=\"#content-quality-gates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEnforce quality standards before merging pull requests.\u003c/p\u003e\n\u003ch3 id=\"comprehensive-linting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComprehensive Linting\u003c/span\u003e \u003ca href=\"#comprehensive-linting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .github/workflows/lint.yml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eContent Lint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;**.md\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003emarkdown-lint\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eLint Markdown files\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDavidAnson/markdownlint-cli2-action@v16\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e.markdownlint.json\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eglobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            **/*.md\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            !node_modules/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            !public/**\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eyaml-lint\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Python\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-python@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epython-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;3.12\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall yamllint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epip install yamllint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eLint YAML frontmatter\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          for file in $(find . -name \u0026#34;*.md\u0026#34; -not -path \u0026#34;./node_modules/*\u0026#34; -not -path \u0026#34;./public/*\u0026#34;); do\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            echo \u0026#34;Checking: $file\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            # Extract frontmatter and lint it\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            frontmatter=$(sed -n \u0026#39;1,/^---$/p\u0026#39; \u0026#34;$file\u0026#34; | tail -n +2 | head -n -1)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            if [ -n \u0026#34;$frontmatter\u0026#34; ]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              echo \u0026#34;$frontmatter\u0026#34; | yamllint -c .yamllint.yml -\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            fi\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          done\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003efrontmatter-check\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCheck required frontmatter\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          errors=0\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          for file in $(find docs -name \u0026#34;*.md\u0026#34;); do\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            # Check for required fields\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            for field in title date published; do\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              if ! grep -q \u0026#34;^${field}:\u0026#34; \u0026#34;$file\u0026#34;; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e                echo \u0026#34;::error file=$file::Missing required field: $field\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e                errors=$((errors + 1))\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              fi\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            done\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          done\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          exit $errors\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ealt-text-check\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCheck image alt text\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          errors=0\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          for file in $(find . -name \u0026#34;*.md\u0026#34; -not -path \u0026#34;./node_modules/*\u0026#34;); do\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            # Find images with empty alt text\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            if grep -Pn \u0026#39;!\\[\\s*\\]\\(\u0026#39; \u0026#34;$file\u0026#34;; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              echo \u0026#34;::error file=$file::Found image without alt text\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              errors=$((errors + 1))\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            fi\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          done\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          exit $errors\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"spell-checking\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSpell Checking\u003c/span\u003e \u003ca href=\"#spell-checking\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .github/workflows/spelling.yml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSpell Check\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;**.md\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003espellcheck\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCheck spelling\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecrate-ci/typos@master\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e./docs\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e.typos.toml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCreate \u003ccode\u003e.typos.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .typos.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003edefault\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eextend-words\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Add custom words that aren\u0026#39;t typos\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;markata\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efrontmatter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;frontmatter\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egoldmark\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;goldmark\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eextend-exclude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;*.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;*.toml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;public/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;node_modules/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"complete-quality-pipeline\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComplete Quality Pipeline\u003c/span\u003e \u003ca href=\"#complete-quality-pipeline\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA comprehensive workflow that runs all quality checks:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .github/workflows/quality.yml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eContent Quality Pipeline\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003econcurrency\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003egroup\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ github.workflow }}-${{ github.ref }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecancel-in-progress\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Stage 1: Fast checks (run in parallel)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003emarkdown-lint\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eMarkdown Lint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDavidAnson/markdownlint-cli2-action@v16\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e.markdownlint.json\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eglobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;**/*.md\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eyaml-lint\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eYAML Lint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epip install yamllint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eyamllint -c .yamllint.yml .\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003efrontmatter\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eFrontmatter Validation\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eValidate frontmatter\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          errors=0\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          for file in $(find docs -name \u0026#34;*.md\u0026#34; 2\u0026gt;/dev/null || true); do\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            for field in title date published; do\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              if ! grep -q \u0026#34;^${field}:\u0026#34; \u0026#34;$file\u0026#34; 2\u0026gt;/dev/null; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e                echo \u0026#34;::error file=$file::Missing: $field\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e                errors=$((errors + 1))\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              fi\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            done\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          done\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          [ $errors -eq 0 ] || exit 1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003espelling\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSpell Check\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecrate-ci/typos@master\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Stage 2: Build (depends on lint)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild Site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emarkdown-lint, yaml-lint, frontmatter]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-go@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ego-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1.22\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ego install github.com/waylonwalker/markata-go/cmd/markata-go@latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eUpload artifact\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/upload-artifact@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Stage 3: Post-build checks\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ehtml-validate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eHTML Validation\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDownload build\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/download-artifact@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Node.js\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-node@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003enode-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;20\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall html-validate\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enpm install -g html-validate\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eValidate HTML\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          html-validate \u0026#34;public/**/*.html\u0026#34; --config .htmlvalidate.json || true\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003econtinue-on-error\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003elinks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eLink Check\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDownload build\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/download-artifact@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCheck links\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elycheeverse/lychee-action@v1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;-\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --verbose\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --no-progress\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --accept 200,204,301,302,307,308\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --exclude-path node_modules\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --exclude \u0026#39;localhost\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            \u0026#39;./public/**/*.html\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003efail\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eGITHUB_TOKEN\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Stage 4: Deploy (only on main)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# ============================================\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edeploy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003ebuild, html-validate, links]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub.ref == \u0026#39;refs/heads/main\u0026#39; \u0026amp;\u0026amp; github.event_name == \u0026#39;push\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epermissions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eread\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003epages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eid-token\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub-pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ steps.deployment.outputs.page_url }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDownload build\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/download-artifact@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/configure-pages@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eUpload to Pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/upload-pages-artifact@v3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy to GitHub Pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeployment\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/deploy-pages@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"html-validation-config\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHTML Validation Config\u003c/span\u003e \u003ca href=\"#html-validation-config\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003e.htmlvalidate.json\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;extends\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;html-validate:recommended\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;rules\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;no-trailing-whitespace\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;off\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;void-style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;off\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;attribute-boolean-style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;off\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"reusable-workflows\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReusable Workflows\u003c/span\u003e \u003ca href=\"#reusable-workflows\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCreate reusable workflows for consistency across multiple repositories.\u003c/p\u003e\n\u003ch3 id=\"reusable-quality-check\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReusable Quality Check\u003c/span\u003e \u003ca href=\"#reusable-quality-check\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .github/workflows/reusable-quality.yml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eReusable Quality Check\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eworkflow_call\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003einputs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003esite-url\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Site URL for build\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erequired\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003enode-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Node.js version\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erequired\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003edefault\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;20\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003equality\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-go@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ego-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1.22\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Node.js\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-node@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003enode-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ inputs.node-version }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall tools\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          go install github.com/waylonwalker/markata-go/cmd/markata-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          npm install -g markdownlint-cli\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eLint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkdownlint \u0026#39;**/*.md\u0026#39; --ignore node_modules --ignore public\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ inputs.site-url }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eUpload artifact\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/upload-artifact@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"using-the-reusable-workflow\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing the Reusable Workflow\u003c/span\u003e \u003ca href=\"#using-the-reusable-workflow\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .github/workflows/ci.yml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCI\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003equality\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e./.github/workflows/reusable-quality.yml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003esite-url\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"status-badges\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStatus Badges\u003c/span\u003e \u003ca href=\"#status-badges\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd status badges to your README:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# My Site\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003e![Content Quality\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://github.com/username/repo/actions/workflows/quality.yml/badge.svg\u003c/span\u003e)](https://github.com/username/repo/actions/workflows/quality.yml)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003e![Links\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://github.com/username/repo/actions/workflows/links.yml/badge.svg\u003c/span\u003e)](https://github.com/username/repo/actions/workflows/links.yml)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003e![Deploy\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://github.com/username/repo/actions/workflows/deploy.yml/badge.svg\u003c/span\u003e)](https://github.com/username/repo/actions/workflows/deploy.yml)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"pre-commit-hooks/\"\u003ePre-commit Hooks\u003c/a\u003e - Local quality checks\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"gitlab-ci/\"\u003eGitLab CI\u003c/a\u003e - GitLab CI/CD configuration\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"troubleshooting/\"\u003eTroubleshooting\u003c/a\u003e - Common issues and solutions\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nGitHub Actions provides powerful CI/CD capabilities for validating your markata-go site content. This guide covers workflows for build validation, link checking, and content quality gates.\n\n## Table of Contents\n\n- [Quick Start](#quick-start)\n- [Build Validation Workflow](#build-validation-workflow)\n- [Link Checking Workflow](#link-checking-workflow)\n- [Content Quality Gates](#content-quality-gates)\n- [Complete Quality Pipeline](#complete-quality-pipeline)\n- [Reusable Workflows](#reusable-workflows)\n- [Status Badges](#status-badges)\n\n---\n\n## Quick Start\n\nCreate `.github/workflows/content-quality.yml`:\n\n```yaml\nname: Content Quality\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n\njobs:\n  lint:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Lint Markdown\n        uses: DavidAnson/markdownlint-cli2-action@v16\n        with:\n          globs: |\n            **/*.md\n            !node_modules\n            !public\n\n      - name: Check YAML frontmatter\n        run: |\n          pip install yamllint\n          find . -name \"*.md\" -exec grep -l \"^---\" {} \\; | \\\n            xargs -I {} sh -c 'sed -n \"/^---$/,/^---$/p\" {} | yamllint -'\n```\n\n---\n\n## Build Validation Workflow\n\nEnsure your site builds successfully on every push and pull request.\n\n### Basic Build Check\n\n```yaml\n# .github/workflows/build.yml\nname: Build Validation\n\non:\n  push:\n    branches: [main]\n    paths:\n      - '**.md'\n      - '**.toml'\n      - 'templates/**'\n      - 'static/**'\n  pull_request:\n    branches: [main]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    \n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Setup Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: '1.22'\n          cache: true\n\n      - name: Install markata-go\n        run: go install github.com/waylonwalker/markata-go/cmd/markata-go@latest\n\n      - name: Validate config\n        run: markata-go config validate\n\n      - name: Build site\n        run: markata-go build --clean\n        env:\n          MARKATA_GO_URL: ${{ github.event_name == 'pull_request' \u0026\u0026 format('https://preview-{0}.example.com', github.event.number) || 'https://example.com' }}\n\n      - name: Upload build artifact\n        uses: actions/upload-artifact@v4\n        with:\n          name: site-build\n          path: public/\n          retention-days: 7\n```\n\n### Build with Cache\n\nSpeed up builds by caching Go modules and the markata-go binary:\n\n```yaml\n# .github/workflows/build-cached.yml\nname: Build (Cached)\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    \n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Setup Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: '1.22'\n          cache: true\n\n      - name: Cache markata-go binary\n        uses: actions/cache@v4\n        id: markata-cache\n        with:\n          path: ~/go/bin/markata-go\n          key: markata-go-${{ runner.os }}-${{ hashFiles('go.sum') }}\n          restore-keys: |\n            markata-go-${{ runner.os }}-\n\n      - name: Install markata-go\n        if: steps.markata-cache.outputs.cache-hit != 'true'\n        run: go install github.com/waylonwalker/markata-go/cmd/markata-go@latest\n\n      - name: Build\n        run: ~/go/bin/markata-go build --clean\n```\n\n---\n\n## Link Checking Workflow\n\nCheck for broken links across your entire site.\n\n### Using lychee (Recommended)\n\n[lychee](https://github.com/lycheeverse/lychee) is fast and handles many edge cases:\n\n```yaml\n# .github/workflows/links.yml\nname: Link Checker\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n  schedule:\n    # Run weekly to catch external link rot\n    - cron: '0 0 * * 0'\n\njobs:\n  check-links:\n    runs-on: ubuntu-latest\n    \n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Setup Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: '1.22'\n          cache: true\n\n      - name: Install and build\n        run: |\n          go install github.com/waylonwalker/markata-go/cmd/markata-go@latest\n          markata-go build --clean\n        env:\n          MARKATA_GO_URL: https://example.com\n\n      - name: Check links\n        uses: lycheeverse/lychee-action@v1\n        with:\n          args: \u003e-\n            --verbose\n            --no-progress\n            --accept 200,204,301,302,307,308\n            --timeout 30\n            --max-retries 3\n            --exclude-path node_modules\n            --exclude-path .git\n            --exclude 'https://localhost.*'\n            --exclude 'https://127\\.0\\.0\\.1.*'\n            --exclude 'mailto:.*'\n            './public/**/*.html'\n          fail: true\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Create issue on failure\n        if: failure() \u0026\u0026 github.event_name == 'schedule'\n        uses: peter-evans/create-issue-from-file@v5\n        with:\n          title: Broken links detected\n          content-filepath: ./lychee/out.md\n          labels: bug, documentation\n```\n\n### Using markdown-link-check\n\nFor checking Markdown files directly (without building):\n\n```yaml\n# .github/workflows/markdown-links.yml\nname: Markdown Link Check\n\non:\n  push:\n    branches: [main]\n    paths: ['**.md']\n  pull_request:\n    branches: [main]\n    paths: ['**.md']\n\njobs:\n  check-links:\n    runs-on: ubuntu-latest\n    \n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Check Markdown links\n        uses: gaurav-nelson/github-action-markdown-link-check@v1\n        with:\n          config-file: '.markdown-link-check.json'\n          use-quiet-mode: 'yes'\n          use-verbose-mode: 'yes'\n          folder-path: 'docs/'\n          file-extension: '.md'\n```\n\n### Link Check Configuration\n\nCreate `.markdown-link-check.json`:\n\n```json\n{\n  \"ignorePatterns\": [\n    { \"pattern\": \"^https://localhost\" },\n    { \"pattern\": \"^https://127\\\\.0\\\\.0\\\\.1\" },\n    { \"pattern\": \"^#\" },\n    { \"pattern\": \"^mailto:\" }\n  ],\n  \"replacementPatterns\": [\n    {\n      \"pattern\": \"^/docs/\",\n      \"replacement\": \"https://example.com/docs/\"\n    }\n  ],\n  \"httpHeaders\": [\n    {\n      \"urls\": [\"https://github.com\", \"https://api.github.com\"],\n      \"headers\": {\n        \"Accept\": \"text/html, application/vnd.github.v3+json\"\n      }\n    }\n  ],\n  \"timeout\": \"20s\",\n  \"retryOn429\": true,\n  \"retryCount\": 3,\n  \"fallbackRetryDelay\": \"10s\",\n  \"aliveStatusCodes\": [200, 206, 301, 302, 307, 308]\n}\n```\n\n---\n\n## Content Quality Gates\n\nEnforce quality standards before merging pull requests.\n\n### Comprehensive Linting\n\n```yaml\n# .github/workflows/lint.yml\nname: Content Lint\n\non:\n  pull_request:\n    branches: [main]\n    paths: ['**.md']\n\njobs:\n  markdown-lint:\n    runs-on: ubuntu-latest\n    \n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Lint Markdown files\n        uses: DavidAnson/markdownlint-cli2-action@v16\n        with:\n          config: .markdownlint.json\n          globs: |\n            **/*.md\n            !node_modules/**\n            !public/**\n\n  yaml-lint:\n    runs-on: ubuntu-latest\n    \n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Setup Python\n        uses: actions/setup-python@v5\n        with:\n          python-version: '3.12'\n\n      - name: Install yamllint\n        run: pip install yamllint\n\n      - name: Lint YAML frontmatter\n        run: |\n          for file in $(find . -name \"*.md\" -not -path \"./node_modules/*\" -not -path \"./public/*\"); do\n            echo \"Checking: $file\"\n            # Extract frontmatter and lint it\n            frontmatter=$(sed -n '1,/^---$/p' \"$file\" | tail -n +2 | head -n -1)\n            if [ -n \"$frontmatter\" ]; then\n              echo \"$frontmatter\" | yamllint -c .yamllint.yml -\n            fi\n          done\n\n  frontmatter-check:\n    runs-on: ubuntu-latest\n    \n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Check required frontmatter\n        run: |\n          errors=0\n          for file in $(find docs -name \"*.md\"); do\n            # Check for required fields\n            for field in title date published; do\n              if ! grep -q \"^${field}:\" \"$file\"; then\n                echo \"::error file=$file::Missing required field: $field\"\n                errors=$((errors + 1))\n              fi\n            done\n          done\n          exit $errors\n\n  alt-text-check:\n    runs-on: ubuntu-latest\n    \n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Check image alt text\n        run: |\n          errors=0\n          for file in $(find . -name \"*.md\" -not -path \"./node_modules/*\"); do\n            # Find images with empty alt text\n            if grep -Pn '!\\[\\s*\\]\\(' \"$file\"; then\n              echo \"::error file=$file::Found image without alt text\"\n              errors=$((errors + 1))\n            fi\n          done\n          exit $errors\n```\n\n### Spell Checking\n\n```yaml\n# .github/workflows/spelling.yml\nname: Spell Check\n\non:\n  pull_request:\n    branches: [main]\n    paths: ['**.md']\n\njobs:\n  spellcheck:\n    runs-on: ubuntu-latest\n    \n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Check spelling\n        uses: crate-ci/typos@master\n        with:\n          files: ./docs\n          config: .typos.toml\n```\n\nCreate `.typos.toml`:\n\n```toml\n# .typos.toml\n[default.extend-words]\n# Add custom words that aren't typos\nmarkata = \"markata\"\nfrontmatter = \"frontmatter\"\ngoldmark = \"goldmark\"\n\n[files]\nextend-exclude = [\n    \"*.json\",\n    \"*.toml\",\n    \"public/\",\n    \"node_modules/\",\n]\n```\n\n---\n\n## Complete Quality Pipeline\n\nA comprehensive workflow that runs all quality checks:\n\n```yaml\n# .github/workflows/quality.yml\nname: Content Quality Pipeline\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n\njobs:\n  # ============================================\n  # Stage 1: Fast checks (run in parallel)\n  # ============================================\n  \n  markdown-lint:\n    name: Markdown Lint\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: DavidAnson/markdownlint-cli2-action@v16\n        with:\n          config: .markdownlint.json\n          globs: '**/*.md'\n\n  yaml-lint:\n    name: YAML Lint\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - run: pip install yamllint\n      - run: yamllint -c .yamllint.yml .\n\n  frontmatter:\n    name: Frontmatter Validation\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - name: Validate frontmatter\n        run: |\n          errors=0\n          for file in $(find docs -name \"*.md\" 2\u003e/dev/null || true); do\n            for field in title date published; do\n              if ! grep -q \"^${field}:\" \"$file\" 2\u003e/dev/null; then\n                echo \"::error file=$file::Missing: $field\"\n                errors=$((errors + 1))\n              fi\n            done\n          done\n          [ $errors -eq 0 ] || exit 1\n\n  spelling:\n    name: Spell Check\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: crate-ci/typos@master\n\n  # ============================================\n  # Stage 2: Build (depends on lint)\n  # ============================================\n  \n  build:\n    name: Build Site\n    needs: [markdown-lint, yaml-lint, frontmatter]\n    runs-on: ubuntu-latest\n    \n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Setup Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: '1.22'\n          cache: true\n\n      - name: Install markata-go\n        run: go install github.com/waylonwalker/markata-go/cmd/markata-go@latest\n\n      - name: Build site\n        run: markata-go build --clean\n        env:\n          MARKATA_GO_URL: https://example.com\n\n      - name: Upload artifact\n        uses: actions/upload-artifact@v4\n        with:\n          name: site\n          path: public/\n\n  # ============================================\n  # Stage 3: Post-build checks\n  # ============================================\n  \n  html-validate:\n    name: HTML Validation\n    needs: build\n    runs-on: ubuntu-latest\n    \n    steps:\n      - uses: actions/checkout@v4\n      \n      - name: Download build\n        uses: actions/download-artifact@v4\n        with:\n          name: site\n          path: public/\n\n      - name: Setup Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: '20'\n\n      - name: Install html-validate\n        run: npm install -g html-validate\n\n      - name: Validate HTML\n        run: |\n          html-validate \"public/**/*.html\" --config .htmlvalidate.json || true\n        continue-on-error: true\n\n  links:\n    name: Link Check\n    needs: build\n    runs-on: ubuntu-latest\n    \n    steps:\n      - uses: actions/checkout@v4\n      \n      - name: Download build\n        uses: actions/download-artifact@v4\n        with:\n          name: site\n          path: public/\n\n      - name: Check links\n        uses: lycheeverse/lychee-action@v1\n        with:\n          args: \u003e-\n            --verbose\n            --no-progress\n            --accept 200,204,301,302,307,308\n            --exclude-path node_modules\n            --exclude 'localhost'\n            './public/**/*.html'\n          fail: false\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n  # ============================================\n  # Stage 4: Deploy (only on main)\n  # ============================================\n  \n  deploy:\n    name: Deploy\n    needs: [build, html-validate, links]\n    if: github.ref == 'refs/heads/main' \u0026\u0026 github.event_name == 'push'\n    runs-on: ubuntu-latest\n    \n    permissions:\n      contents: read\n      pages: write\n      id-token: write\n    \n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    \n    steps:\n      - name: Download build\n        uses: actions/download-artifact@v4\n        with:\n          name: site\n          path: public/\n\n      - name: Setup Pages\n        uses: actions/configure-pages@v5\n\n      - name: Upload to Pages\n        uses: actions/upload-pages-artifact@v3\n        with:\n          path: public/\n\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v4\n```\n\n### HTML Validation Config\n\nCreate `.htmlvalidate.json`:\n\n```json\n{\n  \"extends\": [\"html-validate:recommended\"],\n  \"rules\": {\n    \"no-trailing-whitespace\": \"off\",\n    \"void-style\": \"off\",\n    \"attribute-boolean-style\": \"off\"\n  }\n}\n```\n\n---\n\n## Reusable Workflows\n\nCreate reusable workflows for consistency across multiple repositories.\n\n### Reusable Quality Check\n\n```yaml\n# .github/workflows/reusable-quality.yml\nname: Reusable Quality Check\n\non:\n  workflow_call:\n    inputs:\n      site-url:\n        description: 'Site URL for build'\n        required: true\n        type: string\n      node-version:\n        description: 'Node.js version'\n        required: false\n        type: string\n        default: '20'\n\njobs:\n  quality:\n    runs-on: ubuntu-latest\n    \n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Setup Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: '1.22'\n          cache: true\n\n      - name: Setup Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ inputs.node-version }}\n\n      - name: Install tools\n        run: |\n          go install github.com/waylonwalker/markata-go/cmd/markata-go@latest\n          npm install -g markdownlint-cli\n\n      - name: Lint\n        run: markdownlint '**/*.md' --ignore node_modules --ignore public\n\n      - name: Build\n        run: markata-go build --clean\n        env:\n          MARKATA_GO_URL: ${{ inputs.site-url }}\n\n      - name: Upload artifact\n        uses: actions/upload-artifact@v4\n        with:\n          name: site\n          path: public/\n```\n\n### Using the Reusable Workflow\n\n```yaml\n# .github/workflows/ci.yml\nname: CI\n\non:\n  push:\n    branches: [main]\n  pull_request:\n\njobs:\n  quality:\n    uses: ./.github/workflows/reusable-quality.yml\n    with:\n      site-url: https://example.com\n```\n\n---\n\n## Status Badges\n\nAdd status badges to your README:\n\n```markdown\n# My Site\n\n[![Content Quality](https://github.com/username/repo/actions/workflows/quality.yml/badge.svg)](https://github.com/username/repo/actions/workflows/quality.yml)\n[![Links](https://github.com/username/repo/actions/workflows/links.yml/badge.svg)](https://github.com/username/repo/actions/workflows/links.yml)\n[![Deploy](https://github.com/username/repo/actions/workflows/deploy.yml/badge.svg)](https://github.com/username/repo/actions/workflows/deploy.yml)\n```\n\n---\n\n## See Also\n\n- [Pre-commit Hooks](pre-commit-hooks/) - Local quality checks\n- [GitLab CI](gitlab-ci/) - GitLab CI/CD configuration\n- [Troubleshooting](troubleshooting/) - Common issues and solutions\n",
      "summary": "CI/CD workflows for content validation, link checking, and quality gates in GitHub",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "documentation",
        "quality-assurance",
        "github-actions",
        "ci-cd"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/quality-assurance/editor-integration/",
      "url": "https://markata.dev/docs/guides/quality-assurance/editor-integration/",
      "title": "Editor Integration",
      "content_html": "\u003cp\u003eUse the Language Server Protocol (LSP) for live wikilink completions, broken-link diagnostics, hover details, and go-to-definition. Use \u003ccode\u003emarkata-go lint\u003c/code\u003e when you also need content-quality checks in an editor\u0026rsquo;s quickfix or Problems panel.\u003c/p\u003e\n\u003ch2 id=\"start-with-a-health-check\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStart With A Health Check\u003c/span\u003e \u003ca href=\"#start-with-a-health-check\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFrom the root of your site, run:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lsp doctor\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe command verifies the local binary and validates any discovered\nmarkata-go configuration. It does not modify your editor configuration. Your\neditor—not the configuration file—supplies the LSP workspace root.\u003c/p\u003e\n\u003cp\u003eIt also detects supported editors installed on your \u003ccode\u003ePATH\u003c/code\u003e. For Neovim, Helix,\nand Emacs, it loads the editor configuration for a deeper check by default:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lsp doctor\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis can run editor startup and plugin code. Skip it when needed while still\ndetecting editors:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lsp doctor --no-verify-editor\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe report labels each detected editor as configured, unconfigured, or\ninconclusive. VS Code, Cursor, and Zed are detected but do not have stable\nheadless LSP verification APIs.\u003c/p\u003e\n\u003cp\u003eWhen verification is skipped and a headless-verifiable editor is detected, the\nreport prints the default doctor follow-up command to stderr. This keeps the\nprimary diagnostic report on stdout while making the next interactive action\neasy to spot.\u003c/p\u003e\n\u003cp\u003eIn an interactive terminal, the report uses your configured site palette for\npass, information, warning, and failure states. The textual labels remain\npresent for accessibility and plain output.\u003c/p\u003e\n\u003cp\u003eEvery LSP client uses the same stable values:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSetting\u003c/th\u003e\n\u003cth\u003eValue\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eCommand\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emarkata-go lsp\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFile type\u003c/td\u003e\n\u003ctd\u003eMarkdown\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWorkspace root\u003c/td\u003e\n\u003ctd\u003eDirectory containing \u003ccode\u003emarkata-go.toml\u003c/code\u003e (or the site root)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003ePrint a maintained starting snippet with:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lsp setup --editor neovim\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOmit \u003ccode\u003e--editor\u003c/code\u003e to print snippets for every supported editor installed on your\n\u003ccode\u003ePATH\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lsp setup\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen more than one editor is found, each snippet has a clear heading. Interactive\nterminal output is syntax highlighted; redirected output remains plain text for\ncopying into configuration files.\u003c/p\u003e\n\u003cp\u003eAvailable editors are \u003ccode\u003egeneric\u003c/code\u003e, \u003ccode\u003eneovim\u003c/code\u003e, \u003ccode\u003ehelix\u003c/code\u003e, \u003ccode\u003eemacs\u003c/code\u003e, \u003ccode\u003ezed\u003c/code\u003e, and\n\u003ccode\u003evscode\u003c/code\u003e. The command only prints guidance: it deliberately does not rewrite\neditor settings because editor versions, extensions, and configuration layouts\nvary. When using an agent, have it inspect the editor configuration already in\nthe repository or home directory, then adapt the generated snippet.\u003c/p\u003e\n\u003ch2 id=\"language-server-setup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLanguage Server Setup\u003c/span\u003e \u003ca href=\"#language-server-setup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"neovim\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNeovim\u003c/span\u003e \u003ca href=\"#neovim\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor Neovim 0.11 or later, add the output of this command to \u003ccode\u003einit.lua\u003c/code\u003e or a\nloaded Lua module:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lsp setup --editor neovim\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"helix\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHelix\u003c/span\u003e \u003ca href=\"#helix\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAppend the generated TOML to \u003ccode\u003e~/.config/helix/languages.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lsp setup --editor helix\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRestart Helix after changing the file.\u003c/p\u003e\n\u003ch3 id=\"emacs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEmacs\u003c/span\u003e \u003ca href=\"#emacs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWith Eglot enabled, add the generated Elisp to your Emacs init file:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lsp setup --editor emacs\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"vs-code-cursor-and-zed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVS Code, Cursor, And Zed\u003c/span\u003e \u003ca href=\"#vs-code-cursor-and-zed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThese editors need an installed LSP client or a Markata-aware extension before\nthey can launch an arbitrary stdio language server. Print the required command,\narguments, file type, and workspace-root values, then apply them using the\nconfiguration format required by the installed extension:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lsp setup --editor vscode\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lsp setup --editor zed\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDo not use an editor task as an LSP replacement: tasks run once and cannot\nprovide completion, hover, or navigation.\u003c/p\u003e\n\u003ch3 id=\"other-editors\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOther Editors\u003c/span\u003e \u003ca href=\"#other-editors\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse the generic contract when your editor is not listed:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lsp setup --editor generic\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eConfigure the editor\u0026rsquo;s LSP client to launch \u003ccode\u003emarkata-go lsp\u003c/code\u003e over standard I/O\nfor Markdown documents. Use its native workspace-root setting to point at the\nsite root.\u003c/p\u003e\n\u003ch2 id=\"lint-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLint Integration\u003c/span\u003e \u003ca href=\"#lint-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ccode\u003emarkata-go lint\u003c/code\u003e command outputs issues in a format compatible with many editors\u0026rsquo; error navigation features. The remaining sections show how to integrate those checks with popular editors.\u003c/p\u003e\n\u003ch2 id=\"vim-neovim-quickfix\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVim / Neovim Quickfix\u003c/span\u003e \u003ca href=\"#vim-neovim-quickfix\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eVim and Neovim have built-in quickfix support for navigating errors and warnings.\u003c/p\u003e\n\u003ch3 id=\"basic-usage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Usage\u003c/span\u003e \u003ca href=\"#basic-usage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026#34; Set markata-go as the make program\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"k\"\u003eset\u003c/span\u003e \u003cspan class=\"nx\"\u003emakeprg\u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ego\u003c/span\u003e\\ \u003cspan class=\"nx\"\u003elint\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026#34; Run lint and populate quickfix\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nx\"\u003emake\u003c/span\u003e \u003cspan class=\"nx\"\u003edocs\u003c/span\u003e\u003cspan class=\"sr\"\u003e/**/\u003c/span\u003e*.\u003cspan class=\"nx\"\u003emd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026#34; Open quickfix window\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nx\"\u003ecwindow\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026#34; Navigate errors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nx\"\u003ecnext\u003c/span\u003e      \u003cspan class=\"c\"\u003e\u0026#34; Go to next error\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nx\"\u003ecprev\u003c/span\u003e      \u003cspan class=\"c\"\u003e\u0026#34; Go to previous error\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nx\"\u003ecfirst\u003c/span\u003e     \u003cspan class=\"c\"\u003e\u0026#34; Go to first error\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nx\"\u003eclast\u003c/span\u003e      \u003cspan class=\"c\"\u003e\u0026#34; Go to last error\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"custom-error-format\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Error Format\u003c/span\u003e \u003ca href=\"#custom-error-format\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor perfect parsing of markata-go lint output, add this to your \u003ccode\u003e~/.vimrc\u003c/code\u003e or \u003ccode\u003einit.vim\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026#34; Add markata-go lint error format\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eset\u003c/span\u003e \u003cspan class=\"nx\"\u003eerrorformat\u003c/span\u003e\u003cspan class=\"p\"\u003e+=\u003c/span\u003e%\u003cspan class=\"nx\"\u003ef\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eset\u003c/span\u003e \u003cspan class=\"nx\"\u003eerrorformat\u003c/span\u003e\u003cspan class=\"p\"\u003e+=\u003c/span\u003e\\ \\ %\u003cspan class=\"nx\"\u003etarning\u003c/span\u003e\\ [\u003cspan class=\"nx\"\u003eline\u003c/span\u003e\\ %\u003cspan class=\"nx\"\u003el\u003c/span\u003e\\\\\u003cspan class=\"p\"\u003e,\u003c/span\u003e\\ \u003cspan class=\"nx\"\u003ecol\u003c/span\u003e\\ %\u003cspan class=\"nx\"\u003ec\u003c/span\u003e]:\\ %\u003cspan class=\"nx\"\u003em\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eset\u003c/span\u003e \u003cspan class=\"nx\"\u003eerrorformat\u003c/span\u003e\u003cspan class=\"p\"\u003e+=\u003c/span\u003e\\ \\ %\u003cspan class=\"nx\"\u003etrror\u003c/span\u003e\\ [\u003cspan class=\"nx\"\u003eline\u003c/span\u003e\\ %\u003cspan class=\"nx\"\u003el\u003c/span\u003e\\\\\u003cspan class=\"p\"\u003e,\u003c/span\u003e\\ \u003cspan class=\"nx\"\u003ecol\u003c/span\u003e\\ %\u003cspan class=\"nx\"\u003ec\u003c/span\u003e]:\\ %\u003cspan class=\"nx\"\u003em\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"one-liner-command\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOne-liner Command\u003c/span\u003e \u003ca href=\"#one-liner-command\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eQuick way to run lint and populate quickfix:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nx\"\u003ecgetexpr\u003c/span\u003e \u003cspan class=\"nx\"\u003esystem\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;markata-go lint docs/**/*.md\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nx\"\u003ecwindow\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"neovim-lua-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNeovim Lua Configuration\u003c/span\u003e \u003ca href=\"#neovim-lua-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor Neovim users with Lua config:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e-- ~/.config/nvim/lua/lint.lua or init.lua\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e-- Function to run markata-go lint\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003elocal\u003c/span\u003e \u003cspan class=\"kr\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003emarkata_lint\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003evim.cmd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;cgetexpr system(\u0026#34;markata-go lint docs/**/*.md\u0026#34;)\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003evim.cmd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;cwindow\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e-- Create a user command\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003evim.api\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003envim_create_user_command\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;MarkataLint\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003emarkata_lint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e-- Optional: keybinding\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003evim.keymap\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;n\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;leader\u0026gt;ml\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003emarkata_lint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003edesc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Run markata-go lint\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"lint-current-file\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLint Current File\u003c/span\u003e \u003ca href=\"#lint-current-file\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTo lint only the current file:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nx\"\u003ecgetexpr\u003c/span\u003e \u003cspan class=\"nx\"\u003esystem\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;markata-go lint \u0026#39;\u003c/span\u003e . \u003cspan class=\"nx\"\u003eexpand\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;%\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr in Lua:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003elocal\u003c/span\u003e \u003cspan class=\"kr\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003elint_current_file\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elocal\u003c/span\u003e \u003cspan class=\"n\"\u003efile\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003evim.fn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eexpand\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;%\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003evim.cmd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;cgetexpr system(\u0026#34;markata-go lint \u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e..\u003c/span\u003e \u003cspan class=\"n\"\u003efile\u003c/span\u003e \u003cspan class=\"o\"\u003e..\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#34;)\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003evim.cmd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;cwindow\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"vs-code-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVS Code Integration\u003c/span\u003e \u003ca href=\"#vs-code-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eVS Code can use tasks with problem matchers to integrate with markata-go lint.\u003c/p\u003e\n\u003ch3 id=\"task-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTask Configuration\u003c/span\u003e \u003ca href=\"#task-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003e.vscode/tasks.json\u003c/code\u003e in your project:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2.0.0\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;tasks\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;label\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Lint Markdown\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;shell\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;command\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;markata-go lint docs/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;group\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;build\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;problemMatcher\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;owner\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;markata-go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;fileLocation\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;relative\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;${workspaceFolder}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;regexp\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^(.+):$\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;file\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;regexp\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^\\\\s+(warning|error)\\\\s+\\\\[line\\\\s+(\\\\d+),\\\\s+col\\\\s+(\\\\d+)\\\\]:\\\\s+(.+)$\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;severity\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;line\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;column\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;message\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;loop\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;label\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Lint Current File\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;shell\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;command\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;markata-go lint ${file}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;group\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;build\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;problemMatcher\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;owner\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;markata-go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;fileLocation\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;relative\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;${workspaceFolder}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;regexp\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^(.+):$\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;file\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;regexp\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^\\\\s+(warning|error)\\\\s+\\\\[line\\\\s+(\\\\d+),\\\\s+col\\\\s+(\\\\d+)\\\\]:\\\\s+(.+)$\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;severity\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;line\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;column\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;message\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;loop\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"running-the-task\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRunning the Task\u003c/span\u003e \u003ca href=\"#running-the-task\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003ePress \u003ccode\u003eCtrl+Shift+B\u003c/code\u003e (or \u003ccode\u003eCmd+Shift+B\u003c/code\u003e on Mac)\u003c/li\u003e\n\u003cli\u003eSelect \u0026ldquo;Lint Markdown\u0026rdquo; from the task list\u003c/li\u003e\n\u003cli\u003eErrors appear in the Problems panel\u003c/li\u003e\n\u003cli\u003eClick on errors to jump to the file and line\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"keyboard-shortcut\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKeyboard Shortcut\u003c/span\u003e \u003ca href=\"#keyboard-shortcut\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd a keybinding in \u003ccode\u003ekeybindings.json\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;key\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ctrl+shift+l\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;command\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;workbench.action.tasks.runTask\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;args\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Lint Markdown\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"emacs-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEmacs Integration\u003c/span\u003e \u003ca href=\"#emacs-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEmacs can use \u003ccode\u003ecompile-mode\u003c/code\u003e to run lint and navigate errors.\u003c/p\u003e\n\u003ch3 id=\"basic-usage-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Usage\u003c/span\u003e \u003ca href=\"#basic-usage-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e;; Run markata-go lint\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eM-x\u003c/span\u003e \u003cspan class=\"nv\"\u003ecompile\u003c/span\u003e \u003cspan class=\"nv\"\u003eRET\u003c/span\u003e \u003cspan class=\"nv\"\u003emarkata-go\u003c/span\u003e \u003cspan class=\"nv\"\u003elint\u003c/span\u003e \u003cspan class=\"nv\"\u003edocs/**/*.md\u003c/span\u003e \u003cspan class=\"nv\"\u003eRET\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e;; Navigate errors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eM-g\u003c/span\u003e \u003cspan class=\"nv\"\u003en\u003c/span\u003e  \u003cspan class=\"c1\"\u003e; next-error\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eM-g\u003c/span\u003e \u003cspan class=\"nv\"\u003ep\u003c/span\u003e  \u003cspan class=\"c1\"\u003e; previous-error\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"custom-compilation-regexp\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Compilation Regexp\u003c/span\u003e \u003ca href=\"#custom-compilation-regexp\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd to your Emacs config:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eadd-to-list\u003c/span\u003e \u003cspan class=\"ss\"\u003e\u0026#39;compilation-error-regexp-alist-alist\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             \u003cspan class=\"o\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003emarkata-go\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e               \u003cspan class=\"s\"\u003e\u0026#34;^\\\\(.*\\\\):\\n  \\\\(warning\\\\|error\\\\) \\\\[line \\\\([0-9]+\\\\), col \\\\([0-9]+\\\\)\\\\]: \\\\(.*\\\\)$\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e               \u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eadd-to-list\u003c/span\u003e \u003cspan class=\"ss\"\u003e\u0026#39;compilation-error-regexp-alist\u003c/span\u003e \u003cspan class=\"ss\"\u003e\u0026#39;markata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"flycheck-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFlycheck Integration\u003c/span\u003e \u003ca href=\"#flycheck-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor on-the-fly linting with Flycheck:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eflycheck-define-checker\u003c/span\u003e \u003cspan class=\"nv\"\u003emarkata-go\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s\"\u003e\u0026#34;A markdown linter using markata-go.\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nb\"\u003e:command\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;markata-go\u0026#34;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;lint\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003esource\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nb\"\u003e:error-patterns\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"nv\"\u003ewarning\u003c/span\u003e \u003cspan class=\"nv\"\u003eline-start\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003efile-name\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;:\\n\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s\"\u003e\u0026#34;  warning [line \u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eline\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;, col \u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003ecolumn\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;]: \u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nf\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"nv\"\u003eline-end\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ne\"\u003eerror\u003c/span\u003e \u003cspan class=\"nv\"\u003eline-start\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003efile-name\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;:\\n\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"s\"\u003e\u0026#34;  error [line \u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eline\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;, col \u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003ecolumn\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;]: \u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nf\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"nv\"\u003eline-end\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nb\"\u003e:modes\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003emarkdown-mode\u003c/span\u003e \u003cspan class=\"nv\"\u003egfm-mode\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003eadd-to-list\u003c/span\u003e \u003cspan class=\"ss\"\u003e\u0026#39;flycheck-checkers\u003c/span\u003e \u003cspan class=\"ss\"\u003e\u0026#39;markata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"sublime-text-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSublime Text Integration\u003c/span\u003e \u003ca href=\"#sublime-text-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCreate a build system for markata-go lint.\u003c/p\u003e\n\u003ch3 id=\"build-system-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild System Configuration\u003c/span\u003e \u003ca href=\"#build-system-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003ePackages/User/markata-go.sublime-build\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;cmd\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;markata-go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;lint\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;$file\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;working_dir\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;$project_path\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;file_regex\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^(.+):\\n  (warning|error) \\\\[line (\\\\d+), col (\\\\d+)\\\\]: (.*)$\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;selector\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;text.html.markdown\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"usage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eOpen a Markdown file\u003c/li\u003e\n\u003cli\u003ePress \u003ccode\u003eCtrl+B\u003c/code\u003e (or \u003ccode\u003eCmd+B\u003c/code\u003e on Mac)\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003eF4\u003c/code\u003e / \u003ccode\u003eShift+F4\u003c/code\u003e to navigate errors\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"tips-and-best-practices\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTips and Best Practices\u003c/span\u003e \u003ca href=\"#tips-and-best-practices\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"lint-on-save\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLint on Save\u003c/span\u003e \u003ca href=\"#lint-on-save\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eMost editors support running commands on file save. Configure your editor to run \u003ccode\u003emarkata-go lint\u003c/code\u003e on the current file when saving for immediate feedback.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eVim/Neovim autocommand:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eaugroup\u003c/span\u003e \u003cspan class=\"nx\"\u003eMarkataLint\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eautocmd\u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eautocmd\u003c/span\u003e \u003cspan class=\"nx\"\u003eBufWritePost\u003c/span\u003e *.\u003cspan class=\"nx\"\u003emd\u003c/span\u003e \u003cspan class=\"nx\"\u003ecgetexpr\u003c/span\u003e \u003cspan class=\"nx\"\u003esystem\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;markata-go lint \u0026#39;\u003c/span\u003e . \u003cspan class=\"nx\"\u003eexpand\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;%\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eaugroup\u003c/span\u003e \u003cspan class=\"nx\"\u003eEND\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eVS Code setting (settings.json):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;emeraldwalk.runonsave\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;commands\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;match\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\\\\.md$\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;cmd\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;markata-go lint ${file}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"project-wide-lint\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProject-wide Lint\u003c/span\u003e \u003ca href=\"#project-wide-lint\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor CI/CD or pre-commit hooks, lint all files:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lint\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis uses the glob patterns from your \u003ccode\u003emarkata-go.toml\u003c/code\u003e configuration.\u003c/p\u003e\n\u003ch3 id=\"exit-codes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExit Codes\u003c/span\u003e \u003ca href=\"#exit-codes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe lint command uses standard exit codes:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCode\u003c/th\u003e\n\u003cth\u003eMeaning\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e0\u003c/td\u003e\n\u003ctd\u003eNo issues found\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003ctd\u003eIssues found\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2\u003c/td\u003e\n\u003ctd\u003eError running lint\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eUse these in scripts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e markata-go lint\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;All good!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Issues found, check the output\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n\nUse the Language Server Protocol (LSP) for live wikilink completions, broken-link diagnostics, hover details, and go-to-definition. Use `markata-go lint` when you also need content-quality checks in an editor's quickfix or Problems panel.\n\n## Start With A Health Check\n\nFrom the root of your site, run:\n\n```bash\nmarkata-go lsp doctor\n```\n\nThe command verifies the local binary and validates any discovered\nmarkata-go configuration. It does not modify your editor configuration. Your\neditor—not the configuration file—supplies the LSP workspace root.\n\nIt also detects supported editors installed on your `PATH`. For Neovim, Helix,\nand Emacs, it loads the editor configuration for a deeper check by default:\n\n```bash\nmarkata-go lsp doctor\n```\n\nThis can run editor startup and plugin code. Skip it when needed while still\ndetecting editors:\n\n```bash\nmarkata-go lsp doctor --no-verify-editor\n```\n\nThe report labels each detected editor as configured, unconfigured, or\ninconclusive. VS Code, Cursor, and Zed are detected but do not have stable\nheadless LSP verification APIs.\n\nWhen verification is skipped and a headless-verifiable editor is detected, the\nreport prints the default doctor follow-up command to stderr. This keeps the\nprimary diagnostic report on stdout while making the next interactive action\neasy to spot.\n\nIn an interactive terminal, the report uses your configured site palette for\npass, information, warning, and failure states. The textual labels remain\npresent for accessibility and plain output.\n\nEvery LSP client uses the same stable values:\n\n| Setting | Value |\n| --- | --- |\n| Command | `markata-go lsp` |\n| File type | Markdown |\n| Workspace root | Directory containing `markata-go.toml` (or the site root) |\n\nPrint a maintained starting snippet with:\n\n```bash\nmarkata-go lsp setup --editor neovim\n```\n\nOmit `--editor` to print snippets for every supported editor installed on your\n`PATH`:\n\n```bash\nmarkata-go lsp setup\n```\n\nWhen more than one editor is found, each snippet has a clear heading. Interactive\nterminal output is syntax highlighted; redirected output remains plain text for\ncopying into configuration files.\n\nAvailable editors are `generic`, `neovim`, `helix`, `emacs`, `zed`, and\n`vscode`. The command only prints guidance: it deliberately does not rewrite\neditor settings because editor versions, extensions, and configuration layouts\nvary. When using an agent, have it inspect the editor configuration already in\nthe repository or home directory, then adapt the generated snippet.\n\n## Language Server Setup\n\n### Neovim\n\nFor Neovim 0.11 or later, add the output of this command to `init.lua` or a\nloaded Lua module:\n\n```bash\nmarkata-go lsp setup --editor neovim\n```\n\n### Helix\n\nAppend the generated TOML to `~/.config/helix/languages.toml`:\n\n```bash\nmarkata-go lsp setup --editor helix\n```\n\nRestart Helix after changing the file.\n\n### Emacs\n\nWith Eglot enabled, add the generated Elisp to your Emacs init file:\n\n```bash\nmarkata-go lsp setup --editor emacs\n```\n\n### VS Code, Cursor, And Zed\n\nThese editors need an installed LSP client or a Markata-aware extension before\nthey can launch an arbitrary stdio language server. Print the required command,\narguments, file type, and workspace-root values, then apply them using the\nconfiguration format required by the installed extension:\n\n```bash\nmarkata-go lsp setup --editor vscode\nmarkata-go lsp setup --editor zed\n```\n\nDo not use an editor task as an LSP replacement: tasks run once and cannot\nprovide completion, hover, or navigation.\n\n### Other Editors\n\nUse the generic contract when your editor is not listed:\n\n```bash\nmarkata-go lsp setup --editor generic\n```\n\nConfigure the editor's LSP client to launch `markata-go lsp` over standard I/O\nfor Markdown documents. Use its native workspace-root setting to point at the\nsite root.\n\n## Lint Integration\n\nThe `markata-go lint` command outputs issues in a format compatible with many editors' error navigation features. The remaining sections show how to integrate those checks with popular editors.\n\n## Vim / Neovim Quickfix\n\nVim and Neovim have built-in quickfix support for navigating errors and warnings.\n\n### Basic Usage\n\n```vim\n\" Set markata-go as the make program\n:set makeprg=markata-go\\ lint\n\n\" Run lint and populate quickfix\n:make docs/**/*.md\n\n\" Open quickfix window\n:cwindow\n\n\" Navigate errors\n:cnext      \" Go to next error\n:cprev      \" Go to previous error\n:cfirst     \" Go to first error\n:clast      \" Go to last error\n```\n\n### Custom Error Format\n\nFor perfect parsing of markata-go lint output, add this to your `~/.vimrc` or `init.vim`:\n\n```vim\n\" Add markata-go lint error format\nset errorformat+=%f:\nset errorformat+=\\ \\ %tarning\\ [line\\ %l\\\\,\\ col\\ %c]:\\ %m\nset errorformat+=\\ \\ %trror\\ [line\\ %l\\\\,\\ col\\ %c]:\\ %m\n```\n\n### One-liner Command\n\nQuick way to run lint and populate quickfix:\n\n```vim\n:cgetexpr system('markata-go lint docs/**/*.md')\n:cwindow\n```\n\n### Neovim Lua Configuration\n\nFor Neovim users with Lua config:\n\n```lua\n-- ~/.config/nvim/lua/lint.lua or init.lua\n\n-- Function to run markata-go lint\nlocal function markata_lint()\n  vim.cmd('cgetexpr system(\"markata-go lint docs/**/*.md\")')\n  vim.cmd('cwindow')\nend\n\n-- Create a user command\nvim.api.nvim_create_user_command('MarkataLint', markata_lint, {})\n\n-- Optional: keybinding\nvim.keymap.set('n', '\u003cleader\u003eml', markata_lint, { desc = 'Run markata-go lint' })\n```\n\n### Lint Current File\n\nTo lint only the current file:\n\n```vim\n:cgetexpr system('markata-go lint ' . expand('%'))\n```\n\nOr in Lua:\n\n```lua\nlocal function lint_current_file()\n  local file = vim.fn.expand('%')\n  vim.cmd('cgetexpr system(\"markata-go lint ' .. file .. '\")')\n  vim.cmd('cwindow')\nend\n```\n\n## VS Code Integration\n\nVS Code can use tasks with problem matchers to integrate with markata-go lint.\n\n### Task Configuration\n\nCreate `.vscode/tasks.json` in your project:\n\n```json\n{\n  \"version\": \"2.0.0\",\n  \"tasks\": [\n    {\n      \"label\": \"Lint Markdown\",\n      \"type\": \"shell\",\n      \"command\": \"markata-go lint docs/**/*.md\",\n      \"group\": \"build\",\n      \"problemMatcher\": {\n        \"owner\": \"markata-go\",\n        \"fileLocation\": [\"relative\", \"${workspaceFolder}\"],\n        \"pattern\": [\n          {\n            \"regexp\": \"^(.+):$\",\n            \"file\": 1\n          },\n          {\n            \"regexp\": \"^\\\\s+(warning|error)\\\\s+\\\\[line\\\\s+(\\\\d+),\\\\s+col\\\\s+(\\\\d+)\\\\]:\\\\s+(.+)$\",\n            \"severity\": 1,\n            \"line\": 2,\n            \"column\": 3,\n            \"message\": 4,\n            \"loop\": true\n          }\n        ]\n      }\n    },\n    {\n      \"label\": \"Lint Current File\",\n      \"type\": \"shell\",\n      \"command\": \"markata-go lint ${file}\",\n      \"group\": \"build\",\n      \"problemMatcher\": {\n        \"owner\": \"markata-go\",\n        \"fileLocation\": [\"relative\", \"${workspaceFolder}\"],\n        \"pattern\": [\n          {\n            \"regexp\": \"^(.+):$\",\n            \"file\": 1\n          },\n          {\n            \"regexp\": \"^\\\\s+(warning|error)\\\\s+\\\\[line\\\\s+(\\\\d+),\\\\s+col\\\\s+(\\\\d+)\\\\]:\\\\s+(.+)$\",\n            \"severity\": 1,\n            \"line\": 2,\n            \"column\": 3,\n            \"message\": 4,\n            \"loop\": true\n          }\n        ]\n      }\n    }\n  ]\n}\n```\n\n### Running the Task\n\n1. Press `Ctrl+Shift+B` (or `Cmd+Shift+B` on Mac)\n2. Select \"Lint Markdown\" from the task list\n3. Errors appear in the Problems panel\n4. Click on errors to jump to the file and line\n\n### Keyboard Shortcut\n\nAdd a keybinding in `keybindings.json`:\n\n```json\n{\n  \"key\": \"ctrl+shift+l\",\n  \"command\": \"workbench.action.tasks.runTask\",\n  \"args\": \"Lint Markdown\"\n}\n```\n\n## Emacs Integration\n\nEmacs can use `compile-mode` to run lint and navigate errors.\n\n### Basic Usage\n\n```elisp\n;; Run markata-go lint\nM-x compile RET markata-go lint docs/**/*.md RET\n\n;; Navigate errors\nM-g n  ; next-error\nM-g p  ; previous-error\n```\n\n### Custom Compilation Regexp\n\nAdd to your Emacs config:\n\n```elisp\n(add-to-list 'compilation-error-regexp-alist-alist\n             '(markata-go\n               \"^\\\\(.*\\\\):\\n  \\\\(warning\\\\|error\\\\) \\\\[line \\\\([0-9]+\\\\), col \\\\([0-9]+\\\\)\\\\]: \\\\(.*\\\\)$\"\n               1 3 4 2))\n\n(add-to-list 'compilation-error-regexp-alist 'markata-go)\n```\n\n### Flycheck Integration\n\nFor on-the-fly linting with Flycheck:\n\n```elisp\n(flycheck-define-checker markata-go\n  \"A markdown linter using markata-go.\"\n  :command (\"markata-go\" \"lint\" source)\n  :error-patterns\n  ((warning line-start (file-name) \":\\n\"\n            \"  warning [line \" line \", col \" column \"]: \" (message) line-end)\n   (error line-start (file-name) \":\\n\"\n          \"  error [line \" line \", col \" column \"]: \" (message) line-end))\n  :modes (markdown-mode gfm-mode))\n\n(add-to-list 'flycheck-checkers 'markata-go)\n```\n\n## Sublime Text Integration\n\nCreate a build system for markata-go lint.\n\n### Build System Configuration\n\nCreate `Packages/User/markata-go.sublime-build`:\n\n```json\n{\n  \"cmd\": [\"markata-go\", \"lint\", \"$file\"],\n  \"working_dir\": \"$project_path\",\n  \"file_regex\": \"^(.+):\\n  (warning|error) \\\\[line (\\\\d+), col (\\\\d+)\\\\]: (.*)$\",\n  \"selector\": \"text.html.markdown\"\n}\n```\n\n### Usage\n\n1. Open a Markdown file\n2. Press `Ctrl+B` (or `Cmd+B` on Mac)\n3. Use `F4` / `Shift+F4` to navigate errors\n\n## Tips and Best Practices\n\n### Lint on Save\n\nMost editors support running commands on file save. Configure your editor to run `markata-go lint` on the current file when saving for immediate feedback.\n\n**Vim/Neovim autocommand:**\n\n```vim\naugroup MarkataLint\n  autocmd!\n  autocmd BufWritePost *.md cgetexpr system('markata-go lint ' . expand('%'))\naugroup END\n```\n\n**VS Code setting (settings.json):**\n\n```json\n{\n  \"emeraldwalk.runonsave\": {\n    \"commands\": [\n      {\n        \"match\": \"\\\\.md$\",\n        \"cmd\": \"markata-go lint ${file}\"\n      }\n    ]\n  }\n}\n```\n\n### Project-wide Lint\n\nFor CI/CD or pre-commit hooks, lint all files:\n\n```bash\nmarkata-go lint\n```\n\nThis uses the glob patterns from your `markata-go.toml` configuration.\n\n### Exit Codes\n\nThe lint command uses standard exit codes:\n\n| Code | Meaning |\n|------|---------|\n| 0 | No issues found |\n| 1 | Issues found |\n| 2 | Error running lint |\n\nUse these in scripts:\n\n```bash\nif markata-go lint; then\n  echo \"All good!\"\nelse\n  echo \"Issues found, check the output\"\nfi\n```\n",
      "summary": "Set up markata-go LSP features and lint feedback in your editor",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "guides",
        "quality-assurance",
        "lint",
        "vim",
        "neovim",
        "vscode"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/quality-assurance/custom-rules/",
      "url": "https://markata.dev/docs/guides/quality-assurance/custom-rules/",
      "title": "Custom Linting Rules",
      "content_html": "\u003cp\u003eThis guide covers how to configure linting rules for your specific needs, including markdownlint customization, custom frontmatter validation, and creating project-specific style guides.\u003c/p\u003e\n\u003ch2 id=\"table-of-contents\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTable of Contents\u003c/span\u003e \u003ca href=\"#table-of-contents\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#markdownlint-configuration\"\u003emarkdownlint Configuration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#custom-markdownlint-rules\"\u003eCustom markdownlint Rules\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#frontmatter-validation-rules\"\u003eFrontmatter Validation Rules\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#project-style-guides\"\u003eProject Style Guides\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#rule-inheritance-and-overrides\"\u003eRule Inheritance and Overrides\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#creating-custom-validators\"\u003eCreating Custom Validators\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"markdownlint-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003emarkdownlint Configuration\u003c/span\u003e \u003ca href=\"#markdownlint-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"configuration-file-formats\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration File Formats\u003c/span\u003e \u003ca href=\"#configuration-file-formats\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkdownlint supports multiple configuration formats:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eJSON (\u003ccode\u003e.markdownlint.json\u003c/code\u003e)\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD013\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD033\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;allowed_elements\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;details\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;summary\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;kbd\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eYAML (\u003ccode\u003e.markdownlint.yaml\u003c/code\u003e)\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edefault\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eMD013\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eMD033\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eallowed_elements\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003edetails\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003esummary\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ekbd\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eJavaScript (\u003ccode\u003e.markdownlint.cjs\u003c/code\u003e)\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emodule\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eexports\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eMD013\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eMD033\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eallowed_elements\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;details\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;summary\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;kbd\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"complete-rule-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComplete Rule Reference\u003c/span\u003e \u003ca href=\"#complete-rule-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eHere\u0026rsquo;s a comprehensive configuration covering all common rules:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD001\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD003\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;atx\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD004\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dash\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD005\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD007\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;indent\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;start_indented\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD009\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;br_spaces\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;list_item_empty_lines\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD010\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;code_blocks\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;spaces_per_tab\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD011\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD012\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;maximum\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD013\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;line_length\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e120\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;heading_line_length\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;code_block_line_length\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e120\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;code_blocks\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;tables\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD014\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD018\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD019\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD020\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD021\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD022\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;lines_above\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;lines_below\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD023\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD024\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;siblings_only\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD025\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;level\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;front_matter_title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^\\\\s*title\\\\s*[:=]\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD026\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;punctuation\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.,;:!\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD027\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD028\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD029\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ordered\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD030\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;ul_single\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;ol_single\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;ul_multi\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;ol_multi\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD031\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;list_items\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD032\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD033\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;allowed_elements\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;a\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;abbr\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;audio\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;b\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;br\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;caption\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;cite\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;code\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;col\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;colgroup\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dd\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;del\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;details\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dfn\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;div\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dl\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dt\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;em\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;figcaption\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;figure\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;h1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;h2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;h3\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;h4\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;h5\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;h6\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;hr\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;i\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;iframe\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;img\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ins\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;kbd\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;li\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;mark\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ol\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;p\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;picture\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pre\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;q\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;s\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;samp\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;small\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;span\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;strong\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;sub\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;summary\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;sup\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;table\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;tbody\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;td\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tfoot\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;th\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;thead\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tr\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;u\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ul\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;var\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD034\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD035\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;---\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD036\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;punctuation\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.,;:!?\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD037\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD038\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD039\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD040\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD041\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD042\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD043\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD044\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;names\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;markata-go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;GitHub\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;GitLab\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;JavaScript\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;TypeScript\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;code_blocks\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD045\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD046\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;fenced\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD047\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD048\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;backtick\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD049\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;underscore\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD050\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;asterisk\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD051\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD052\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD053\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"rule-categories\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRule Categories\u003c/span\u003e \u003ca href=\"#rule-categories\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCategory\u003c/th\u003e\n\u003cth\u003eRules\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eHeadings\u003c/td\u003e\n\u003ctd\u003eMD001-MD003, MD018-MD025\u003c/td\u003e\n\u003ctd\u003eHeading structure and style\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLists\u003c/td\u003e\n\u003ctd\u003eMD004-MD007, MD029-MD032\u003c/td\u003e\n\u003ctd\u003eList formatting\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWhitespace\u003c/td\u003e\n\u003ctd\u003eMD009-MD012, MD027-MD028\u003c/td\u003e\n\u003ctd\u003eSpacing and blank lines\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCode\u003c/td\u003e\n\u003ctd\u003eMD014, MD031, MD038, MD040, MD046, MD048\u003c/td\u003e\n\u003ctd\u003eCode blocks and inline code\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLinks\u003c/td\u003e\n\u003ctd\u003eMD034, MD039, MD042, MD051-MD053\u003c/td\u003e\n\u003ctd\u003eLink formatting\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eEmphasis\u003c/td\u003e\n\u003ctd\u003eMD036-MD037, MD049-MD050\u003c/td\u003e\n\u003ctd\u003eBold/italic style\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"custom-markdownlint-rules\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom markdownlint Rules\u003c/span\u003e \u003ca href=\"#custom-markdownlint-rules\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"creating-a-custom-rule\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCreating a Custom Rule\u003c/span\u003e \u003ca href=\"#creating-a-custom-rule\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCustom rules are JavaScript modules. Create \u003ccode\u003ecustom-rules/no-todo-comments.js\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// custom-rules/no-todo-comments.js\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emodule\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eexports\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003enames\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;no-todo-comments\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003edescription\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Disallow TODO comments in content\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003etags\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;content\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;todo\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003erule\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eonError\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etokens\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eforEach\u003c/span\u003e\u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"nx\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;inline\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003etodoMatch\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ematch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sr\"\u003e/\\bTODO\\b/i\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etodoMatch\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nx\"\u003eonError\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nx\"\u003elineNumber\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elineNumber\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nx\"\u003edetail\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Remove TODO comment before publishing\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"registering-custom-rules\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRegistering Custom Rules\u003c/span\u003e \u003ca href=\"#registering-custom-rules\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIn \u003ccode\u003e.markdownlint.cjs\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003enoTodoComments\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003erequire\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;./custom-rules/no-todo-comments\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003erequireDescription\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003erequire\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;./custom-rules/require-description\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emodule\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eexports\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eMD013\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003ecustomRules\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003enoTodoComments\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003erequireDescription\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;no-todo-comments\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;require-description\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eminLength\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"example-custom-rules\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample Custom Rules\u003c/span\u003e \u003ca href=\"#example-custom-rules\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eRequire minimum content length:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// custom-rules/min-content-length.js\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emodule\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eexports\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003enames\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;min-content-length\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003edescription\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Enforce minimum content length\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003etags\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;content\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;length\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003erule\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eonError\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003eminLength\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eminLength\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"mi\"\u003e300\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003econtent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elines\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\\n\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e// Remove frontmatter\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003ebodyMatch\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ematch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sr\"\u003e/^---[\\s\\S]*?---\\n([\\s\\S]*)$/\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003ebody\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ebodyMatch\u003c/span\u003e \u003cspan class=\"o\"\u003e?\u003c/span\u003e \u003cspan class=\"nx\"\u003ebodyMatch\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e// Remove code blocks and count words\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003etextOnly\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ereplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sr\"\u003e/```[\\s\\S]*?```/g\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003ereplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sr\"\u003e/`[^`]+`/g\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003ewordCount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003etextOnly\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esplit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sr\"\u003e/\\s+/\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eBoolean\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003elength\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ewordCount\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"nx\"\u003eminLength\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003eonError\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nx\"\u003elineNumber\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nx\"\u003edetail\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"sb\"\u003e`Content has \u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003ewordCount\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e words, minimum is \u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003eminLength\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e`\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCheck heading hierarchy:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// custom-rules/heading-hierarchy.js\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emodule\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eexports\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003enames\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;heading-hierarchy\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003edescription\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Ensure headings follow proper hierarchy\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003etags\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;headings\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;structure\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003erule\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eonError\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nx\"\u003elastLevel\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etokens\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e\u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"nx\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;heading_open\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eforEach\u003c/span\u003e\u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"nx\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003elevel\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eparseInt\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etag\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esubstring\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003elastLevel\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"nx\"\u003elevel\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003elastLevel\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nx\"\u003eonError\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nx\"\u003elineNumber\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elineNumber\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nx\"\u003edetail\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"sb\"\u003e`Heading level jumped from h\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003elastLevel\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e to h\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003elevel\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e`\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eline\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nx\"\u003elastLevel\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003elevel\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"frontmatter-validation-rules\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFrontmatter Validation Rules\u003c/span\u003e \u003ca href=\"#frontmatter-validation-rules\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"yaml-schema-validation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eYAML Schema Validation\u003c/span\u003e \u003ca href=\"#yaml-schema-validation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate a JSON Schema for frontmatter validation. Create \u003ccode\u003efrontmatter-schema.json\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;$schema\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;http://json-schema.org/draft-07/schema#\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;markata-go Frontmatter\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;object\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;required\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;properties\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;string\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;minLength\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;maxLength\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;string\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;minLength\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;maxLength\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e160\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;string\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^\\\\d{4}-\\\\d{2}-\\\\d{2}$\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;published\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;boolean\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;slug\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;string\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^/[a-z0-9-/]+/?$\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;tags\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;array\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;items\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;string\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^[a-z0-9-]+$\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;minItems\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;uniqueItems\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;author\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;string\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;image\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;string\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;format\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;uri-reference\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;draft\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;boolean\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;additionalProperties\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"validation-script\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eValidation Script\u003c/span\u003e \u003ca href=\"#validation-script\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003escripts/validate-frontmatter-schema.sh\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# scripts/validate-frontmatter-schema.sh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Validates frontmatter against JSON Schema\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eset\u003c/span\u003e -e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Requires: pip install check-jsonschema pyyaml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eschema_file\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;frontmatter-schema.json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eerrors\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e file in \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$@\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e[[\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e !\u003cspan class=\"o\"\u003e=\u003c/span\u003e *.md \u003cspan class=\"o\"\u003e]]\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Extract frontmatter\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003efrontmatter\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003esed -n \u003cspan class=\"s1\"\u003e\u0026#39;/^---$/,/^---$/p\u0026#39;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e sed \u003cspan class=\"s1\"\u003e\u0026#39;1d;$d\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e -z \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$frontmatter\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;WARNING: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e - No frontmatter found\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Convert to JSON and validate\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$frontmatter\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e python3 -c \u003cspan class=\"s2\"\u003e\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003eimport sys, yaml, json\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003edata = yaml.safe_load(sys.stdin.read())\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003eprint(json.dumps(data))\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u0026gt; /tmp/frontmatter.json\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e ! check-jsonschema --schemafile \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$schema_file\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e /tmp/frontmatter.json 2\u0026gt;/dev/null\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ERROR: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$file\u003c/span\u003e\u003cspan class=\"s2\"\u003e - Frontmatter validation failed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        check-jsonschema --schemafile \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$schema_file\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e /tmp/frontmatter.json 2\u0026gt;\u003cspan class=\"p\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e sed \u003cspan class=\"s1\"\u003e\u0026#39;s/^/  /\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e((\u003c/span\u003eerrors++\u003cspan class=\"o\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e \u003cspan class=\"nv\"\u003e$errors\u003c/span\u003e -gt \u003cspan class=\"m\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Found \u003c/span\u003e\u003cspan class=\"nv\"\u003e$errors\u003c/span\u003e\u003cspan class=\"s2\"\u003e frontmatter validation error(s)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eexit\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;All frontmatter valid!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"pre-commit-hook\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePre-commit Hook\u003c/span\u003e \u003ca href=\"#pre-commit-hook\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003erepos\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elocal\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003evalidate-frontmatter-schema\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eValidate Frontmatter Schema\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eentry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebash scripts/validate-frontmatter-schema.sh\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003elanguage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esystem\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\\.(md|markdown)$\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003epass_filenames\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eadditional_dependencies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003echeck-jsonschema\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003epyyaml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"project-style-guides\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProject Style Guides\u003c/span\u003e \u003ca href=\"#project-style-guides\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"documentation-style-guide\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocumentation Style Guide\u003c/span\u003e \u003ca href=\"#documentation-style-guide\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate a comprehensive style configuration for documentation projects:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD003\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;atx\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD004\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dash\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD007\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;indent\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD013\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD022\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;lines_above\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;lines_below\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD024\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;siblings_only\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD025\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;front_matter_title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^\\\\s*title\\\\s*[:=]\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD033\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;allowed_elements\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;details\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;summary\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;kbd\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;br\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;sup\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;sub\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;img\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;audio\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;iframe\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;table\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;thead\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tbody\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tr\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;th\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;td\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD036\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD041\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD044\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;names\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;markata-go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;GitHub\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;GitLab\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;JavaScript\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;TypeScript\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;Go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;Markdown\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;YAML\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;TOML\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;JSON\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;code_blocks\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD046\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;fenced\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD048\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;backtick\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"blog-style-guide\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBlog Style Guide\u003c/span\u003e \u003ca href=\"#blog-style-guide\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor blog-style content with more flexibility:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD003\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;atx\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD004\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dash\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD013\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD022\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;lines_above\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;lines_below\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD024\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;siblings_only\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD033\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD036\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD041\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD046\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;fenced\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD048\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;backtick\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"api-documentation-style\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAPI Documentation Style\u003c/span\u003e \u003ca href=\"#api-documentation-style\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor technical API documentation:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD003\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;atx\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD004\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dash\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD007\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;indent\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD013\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;line_length\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;code_blocks\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;tables\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD022\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;lines_above\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;lines_below\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD024\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD025\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;front_matter_title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^\\\\s*title\\\\s*[:=]\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD033\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;allowed_elements\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;br\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;code\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pre\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD036\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD041\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD040\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD046\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;fenced\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD048\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;backtick\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"rule-inheritance-and-overrides\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRule Inheritance and Overrides\u003c/span\u003e \u003ca href=\"#rule-inheritance-and-overrides\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"base-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBase Configuration\u003c/span\u003e \u003ca href=\"#base-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate a base configuration in \u003ccode\u003econfig/.markdownlint-base.json\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD013\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD033\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD041\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"extending-base-config\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExtending Base Config\u003c/span\u003e \u003ca href=\"#extending-base-config\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eIn project root \u003ccode\u003e.markdownlint.json\u003c/code\u003e:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;extends\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;config/.markdownlint-base.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD024\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;siblings_only\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD044\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;names\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;MyProject\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;code_blocks\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"directory-specific-overrides\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDirectory-Specific Overrides\u003c/span\u003e \u003ca href=\"#directory-specific-overrides\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate override files for specific directories:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ccode\u003edocs/.markdownlint.json\u003c/code\u003e:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;extends\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;../.markdownlint.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD013\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;line_length\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD025\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;front_matter_title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^\\\\s*title\\\\s*[:=]\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003eblog/.markdownlint.json\u003c/code\u003e:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;extends\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;../.markdownlint.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD013\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;MD033\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"inline-overrides\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInline Overrides\u003c/span\u003e \u003ca href=\"#inline-overrides\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDisable rules for specific sections:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!-- markdownlint-disable MD033 --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;details\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;summary\u0026gt;Click to expand\u0026lt;/summary\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis content uses raw HTML.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;/details\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!-- markdownlint-enable MD033 --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDisable rules for entire file:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!-- markdownlint-disable-file MD013 MD033 --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# This File Has Custom Rules\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLong lines are allowed here...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"creating-custom-validators\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCreating Custom Validators\u003c/span\u003e \u003ca href=\"#creating-custom-validators\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"python-validator\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePython Validator\u003c/span\u003e \u003ca href=\"#python-validator\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate a reusable Python validator:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ch\"\u003e#!/usr/bin/env python3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# scripts/validate_content.py\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;Content validation for markata-go sites.\u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003eargparse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003ere\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003esys\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003epathlib\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003ePath\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003etyping\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTuple\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003eyaml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eextract_frontmatter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eTuple\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003edict\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e]:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;Extract frontmatter and body from content.\u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ematch\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ere\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"k\"\u003ematch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003er\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;^---\\n(.*?)\\n---\\n(.*)$\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ere\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDOTALL\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"k\"\u003ematch\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e{},\u003c/span\u003e \u003cspan class=\"n\"\u003econtent\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003efrontmatter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eyaml\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esafe_load\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003ematch\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egroup\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003efrontmatter\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"p\"\u003e{},\u003c/span\u003e \u003cspan class=\"k\"\u003ematch\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egroup\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eexcept\u003c/span\u003e \u003cspan class=\"n\"\u003eyaml\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eYAMLError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e{},\u003c/span\u003e \u003cspan class=\"n\"\u003econtent\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003echeck_required_fields\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efrontmatter\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003edict\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003erequired\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efile_path\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ePath\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e]:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;Check for required frontmatter fields.\u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eerrors\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003efield\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003erequired\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003efield\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003efrontmatter\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eerrors\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003efile_path\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e: Missing required field \u0026#39;\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003efield\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#39;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eerrors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003echeck_description_length\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efrontmatter\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003edict\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003emin_length\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003emax_length\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efile_path\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ePath\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e]:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;Check description length for SEO.\u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eerrors\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edescription\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efrontmatter\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;description\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003edescription\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003emin_length\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eerrors\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003efile_path\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e: Description too short \u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;(\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e \u0026lt; \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003emin_length\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003edescription\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003emax_length\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eerrors\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003efile_path\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e: Description too long \u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;(\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e \u0026gt; \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003emax_length\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eerrors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003echeck_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efrontmatter\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003edict\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eallowed_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efile_path\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ePath\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e]:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;Check that tags are from allowed list.\u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ewarnings\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etags\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efrontmatter\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;tags\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e[])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003etag\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eallowed_tags\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003etag\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eallowed_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ewarnings\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003efile_path\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e: Unknown tag \u0026#39;\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003etag\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ewarnings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003echeck_images_have_alt\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003efile_path\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ePath\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e]:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;Check that all images have alt text.\u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eerrors\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Find images with empty alt text\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eempty_alt\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ere\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efindall\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003er\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;!\\[\\s*\\]\\([^)]+\\)\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eempty_alt\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eerrors\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003efile_path\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e: Image missing alt text: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e\u003cspan class=\"p\"\u003e[:\u003c/span\u003e\u003cspan class=\"mi\"\u003e50\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e...\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eerrors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003evalidate_file\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efile_path\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ePath\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003edict\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eTuple\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e]]:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;Validate a single file.\u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eerrors\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ewarnings\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003econtent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efile_path\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eread_text\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efrontmatter\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebody\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eextract_frontmatter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Required fields\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003erequired\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;required_fields\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;title\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;date\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;published\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eerrors\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eextend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003echeck_required_fields\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003efrontmatter\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erequired\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003efile_path\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Description length\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edesc_min\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;description_min_length\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edesc_max\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;description_max_length\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e160\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eerrors\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eextend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003echeck_description_length\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003efrontmatter\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edesc_min\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edesc_max\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003efile_path\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Tags\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eallowed_tags\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;allowed_tags\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e[])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ewarnings\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eextend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003echeck_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003efrontmatter\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eallowed_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003efile_path\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Images\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;require_alt_text\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eerrors\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eextend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003echeck_images_have_alt\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003efile_path\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eerrors\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ewarnings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eparser\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eargparse\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eArgumentParser\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Validate content files\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eparser\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eadd_argument\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;files\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003enargs\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;+\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ehelp\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Files to validate\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eparser\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eadd_argument\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;--config\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;-c\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;.content-lint.yaml\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ehelp\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Configuration file\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eparser\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eadd_argument\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;--strict\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;store_true\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ehelp\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Treat warnings as errors\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eargs\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eparser\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eparse_args\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Load config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003econfig\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003econfig_path\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ePath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003econfig_path\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eexists\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003econfig\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eyaml\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esafe_load\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econfig_path\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eread_text\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eall_errors\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eall_warnings\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003efile_arg\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003efile_path\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ePath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003efile_arg\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"n\"\u003efile_path\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esuffix\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;.md\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eerrors\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ewarnings\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003evalidate_file\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003efile_path\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eall_errors\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eextend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eerrors\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eall_warnings\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eextend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ewarnings\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Output results\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003eerror\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eall_errors\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ERROR: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eerror\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ewarning\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eall_warnings\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;WARNING: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003ewarning\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Exit code\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eall_errors\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estrict\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003eall_warnings\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003esys\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eexit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Validated \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e files successfully\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esys\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eexit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"vm\"\u003e__name__\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;__main__\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"configuration-file\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration File\u003c/span\u003e \u003ca href=\"#configuration-file\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003e.content-lint.yaml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .content-lint.yaml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003erequired_fields\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003etitle\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003edate\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003epublished\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription_min_length\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e50\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription_max_length\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e160\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003erequire_alt_text\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eallowed_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003edocumentation\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003etutorial\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003eguide\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ereference\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003eblog\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003eannouncement\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003equality-assurance\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"pre-commit-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePre-commit Integration\u003c/span\u003e \u003ca href=\"#pre-commit-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003erepos\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elocal\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003econtent-validator\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eValidate Content\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eentry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epython scripts/validate_content.py\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003elanguage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epython\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\\.(md|markdown)$\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003epass_filenames\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eadditional_dependencies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003epyyaml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"pre-commit-hooks/\"\u003ePre-commit Hooks\u003c/a\u003e - Local quality checks\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"github-actions/\"\u003eGitHub Actions\u003c/a\u003e - CI/CD integration\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"gitlab-ci/\"\u003eGitLab CI\u003c/a\u003e - GitLab pipelines\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"troubleshooting/\"\u003eTroubleshooting\u003c/a\u003e - Common issues and solutions\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nThis guide covers how to configure linting rules for your specific needs, including markdownlint customization, custom frontmatter validation, and creating project-specific style guides.\n\n## Table of Contents\n\n- [markdownlint Configuration](#markdownlint-configuration)\n- [Custom markdownlint Rules](#custom-markdownlint-rules)\n- [Frontmatter Validation Rules](#frontmatter-validation-rules)\n- [Project Style Guides](#project-style-guides)\n- [Rule Inheritance and Overrides](#rule-inheritance-and-overrides)\n- [Creating Custom Validators](#creating-custom-validators)\n\n---\n\n## markdownlint Configuration\n\n### Configuration File Formats\n\nmarkdownlint supports multiple configuration formats:\n\n**JSON (`.markdownlint.json`)**\n\n```json\n{\n  \"default\": true,\n  \"MD013\": false,\n  \"MD033\": {\n    \"allowed_elements\": [\"details\", \"summary\", \"kbd\"]\n  }\n}\n```\n\n**YAML (`.markdownlint.yaml`)**\n\n```yaml\ndefault: true\nMD013: false\nMD033:\n  allowed_elements:\n    - details\n    - summary\n    - kbd\n```\n\n**JavaScript (`.markdownlint.cjs`)**\n\n```javascript\nmodule.exports = {\n  default: true,\n  MD013: false,\n  MD033: {\n    allowed_elements: ['details', 'summary', 'kbd'],\n  },\n};\n```\n\n### Complete Rule Reference\n\nHere's a comprehensive configuration covering all common rules:\n\n```json\n{\n  \"default\": true,\n\n  \"MD001\": true,\n  \"MD003\": { \"style\": \"atx\" },\n  \"MD004\": { \"style\": \"dash\" },\n  \"MD005\": true,\n  \"MD007\": { \"indent\": 2, \"start_indented\": false },\n  \"MD009\": { \"br_spaces\": 2, \"list_item_empty_lines\": false },\n  \"MD010\": { \"code_blocks\": true, \"spaces_per_tab\": 2 },\n  \"MD011\": true,\n  \"MD012\": { \"maximum\": 2 },\n\n  \"MD013\": {\n    \"line_length\": 120,\n    \"heading_line_length\": 80,\n    \"code_block_line_length\": 120,\n    \"code_blocks\": false,\n    \"tables\": false\n  },\n\n  \"MD014\": true,\n\n  \"MD018\": true,\n  \"MD019\": true,\n  \"MD020\": true,\n  \"MD021\": true,\n  \"MD022\": { \"lines_above\": 1, \"lines_below\": 1 },\n  \"MD023\": true,\n  \"MD024\": { \"siblings_only\": true },\n  \"MD025\": { \"level\": 1, \"front_matter_title\": \"^\\\\s*title\\\\s*[:=]\" },\n  \"MD026\": { \"punctuation\": \".,;:!\" },\n  \"MD027\": true,\n  \"MD028\": true,\n\n  \"MD029\": { \"style\": \"ordered\" },\n  \"MD030\": { \"ul_single\": 1, \"ol_single\": 1, \"ul_multi\": 1, \"ol_multi\": 1 },\n  \"MD031\": { \"list_items\": true },\n  \"MD032\": true,\n\n  \"MD033\": {\n    \"allowed_elements\": [\n      \"a\", \"abbr\", \"audio\", \"b\", \"br\", \"caption\",\n      \"cite\", \"code\", \"col\", \"colgroup\", \"dd\", \"del\",\n      \"details\", \"dfn\", \"div\", \"dl\", \"dt\", \"em\",\n      \"figcaption\", \"figure\", \"h1\", \"h2\", \"h3\", \"h4\",\n      \"h5\", \"h6\", \"hr\", \"i\", \"iframe\", \"img\", \"ins\",\n      \"kbd\", \"li\", \"mark\", \"ol\", \"p\", \"picture\", \"pre\",\n      \"q\", \"s\", \"samp\", \"small\", \"source\", \"span\",\n      \"strong\", \"sub\", \"summary\", \"sup\", \"table\",\n      \"tbody\", \"td\", \"tfoot\", \"th\", \"thead\", \"tr\",\n      \"u\", \"ul\", \"var\", \"video\"\n    ]\n  },\n\n  \"MD034\": true,\n  \"MD035\": { \"style\": \"---\" },\n  \"MD036\": { \"punctuation\": \".,;:!?\" },\n  \"MD037\": true,\n  \"MD038\": true,\n  \"MD039\": true,\n  \"MD040\": true,\n  \"MD041\": false,\n  \"MD042\": true,\n  \"MD043\": false,\n  \"MD044\": {\n    \"names\": [\"markata-go\", \"GitHub\", \"GitLab\", \"JavaScript\", \"TypeScript\"],\n    \"code_blocks\": false\n  },\n  \"MD045\": true,\n  \"MD046\": { \"style\": \"fenced\" },\n  \"MD047\": true,\n  \"MD048\": { \"style\": \"backtick\" },\n  \"MD049\": { \"style\": \"underscore\" },\n  \"MD050\": { \"style\": \"asterisk\" },\n  \"MD051\": true,\n  \"MD052\": true,\n  \"MD053\": true\n}\n```\n\n### Rule Categories\n\n| Category | Rules | Description |\n|----------|-------|-------------|\n| Headings | MD001-MD003, MD018-MD025 | Heading structure and style |\n| Lists | MD004-MD007, MD029-MD032 | List formatting |\n| Whitespace | MD009-MD012, MD027-MD028 | Spacing and blank lines |\n| Code | MD014, MD031, MD038, MD040, MD046, MD048 | Code blocks and inline code |\n| Links | MD034, MD039, MD042, MD051-MD053 | Link formatting |\n| Emphasis | MD036-MD037, MD049-MD050 | Bold/italic style |\n\n---\n\n## Custom markdownlint Rules\n\n### Creating a Custom Rule\n\nCustom rules are JavaScript modules. Create `custom-rules/no-todo-comments.js`:\n\n```javascript\n// custom-rules/no-todo-comments.js\nmodule.exports = {\n  names: ['no-todo-comments'],\n  description: 'Disallow TODO comments in content',\n  tags: ['content', 'todo'],\n  function: function rule(params, onError) {\n    params.tokens.forEach((token) =\u003e {\n      if (token.type === 'inline') {\n        const todoMatch = token.content.match(/\\bTODO\\b/i);\n        if (todoMatch) {\n          onError({\n            lineNumber: token.lineNumber,\n            detail: 'Remove TODO comment before publishing',\n            context: token.content,\n          });\n        }\n      }\n    });\n  },\n};\n```\n\n### Registering Custom Rules\n\nIn `.markdownlint.cjs`:\n\n```javascript\nconst noTodoComments = require('./custom-rules/no-todo-comments');\nconst requireDescription = require('./custom-rules/require-description');\n\nmodule.exports = {\n  default: true,\n  MD013: false,\n  customRules: [noTodoComments, requireDescription],\n  'no-todo-comments': true,\n  'require-description': { minLength: 50 },\n};\n```\n\n### Example Custom Rules\n\n**Require minimum content length:**\n\n```javascript\n// custom-rules/min-content-length.js\nmodule.exports = {\n  names: ['min-content-length'],\n  description: 'Enforce minimum content length',\n  tags: ['content', 'length'],\n  function: function rule(params, onError) {\n    const minLength = params.config.minLength || 300;\n    const content = params.lines.join('\\n');\n    \n    // Remove frontmatter\n    const bodyMatch = content.match(/^---[\\s\\S]*?---\\n([\\s\\S]*)$/);\n    const body = bodyMatch ? bodyMatch[1] : content;\n    \n    // Remove code blocks and count words\n    const textOnly = body.replace(/```[\\s\\S]*?```/g, '').replace(/`[^`]+`/g, '');\n    const wordCount = textOnly.split(/\\s+/).filter(Boolean).length;\n    \n    if (wordCount \u003c minLength) {\n      onError({\n        lineNumber: 1,\n        detail: `Content has ${wordCount} words, minimum is ${minLength}`,\n      });\n    }\n  },\n};\n```\n\n**Check heading hierarchy:**\n\n```javascript\n// custom-rules/heading-hierarchy.js\nmodule.exports = {\n  names: ['heading-hierarchy'],\n  description: 'Ensure headings follow proper hierarchy',\n  tags: ['headings', 'structure'],\n  function: function rule(params, onError) {\n    let lastLevel = 0;\n    \n    params.tokens\n      .filter((token) =\u003e token.type === 'heading_open')\n      .forEach((token) =\u003e {\n        const level = parseInt(token.tag.substring(1), 10);\n        \n        if (lastLevel \u003e 0 \u0026\u0026 level \u003e lastLevel + 1) {\n          onError({\n            lineNumber: token.lineNumber,\n            detail: `Heading level jumped from h${lastLevel} to h${level}`,\n            context: token.line,\n          });\n        }\n        \n        lastLevel = level;\n      });\n  },\n};\n```\n\n---\n\n## Frontmatter Validation Rules\n\n### YAML Schema Validation\n\nCreate a JSON Schema for frontmatter validation. Create `frontmatter-schema.json`:\n\n```json\n{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"title\": \"markata-go Frontmatter\",\n  \"type\": \"object\",\n  \"required\": [\"title\", \"date\", \"published\"],\n  \"properties\": {\n    \"title\": {\n      \"type\": \"string\",\n      \"minLength\": 1,\n      \"maxLength\": 100\n    },\n    \"description\": {\n      \"type\": \"string\",\n      \"minLength\": 50,\n      \"maxLength\": 160\n    },\n    \"date\": {\n      \"type\": \"string\",\n      \"pattern\": \"^\\\\d{4}-\\\\d{2}-\\\\d{2}$\"\n    },\n    \"published\": {\n      \"type\": \"boolean\"\n    },\n    \"slug\": {\n      \"type\": \"string\",\n      \"pattern\": \"^/[a-z0-9-/]+/?$\"\n    },\n    \"tags\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"string\",\n        \"pattern\": \"^[a-z0-9-]+$\"\n      },\n      \"minItems\": 1,\n      \"uniqueItems\": true\n    },\n    \"author\": {\n      \"type\": \"string\"\n    },\n    \"image\": {\n      \"type\": \"string\",\n      \"format\": \"uri-reference\"\n    },\n    \"draft\": {\n      \"type\": \"boolean\"\n    }\n  },\n  \"additionalProperties\": true\n}\n```\n\n### Validation Script\n\nCreate `scripts/validate-frontmatter-schema.sh`:\n\n```bash\n#!/bin/bash\n# scripts/validate-frontmatter-schema.sh\n# Validates frontmatter against JSON Schema\n\nset -e\n\n# Requires: pip install check-jsonschema pyyaml\n\nschema_file=\"frontmatter-schema.json\"\nerrors=0\n\nfor file in \"$@\"; do\n    [[ \"$file\" != *.md ]] \u0026\u0026 continue\n    \n    # Extract frontmatter\n    frontmatter=$(sed -n '/^---$/,/^---$/p' \"$file\" | sed '1d;$d')\n    \n    if [ -z \"$frontmatter\" ]; then\n        echo \"WARNING: $file - No frontmatter found\"\n        continue\n    fi\n    \n    # Convert to JSON and validate\n    echo \"$frontmatter\" | python3 -c \"\nimport sys, yaml, json\ndata = yaml.safe_load(sys.stdin.read())\nprint(json.dumps(data))\n\" \u003e /tmp/frontmatter.json\n    \n    if ! check-jsonschema --schemafile \"$schema_file\" /tmp/frontmatter.json 2\u003e/dev/null; then\n        echo \"ERROR: $file - Frontmatter validation failed\"\n        check-jsonschema --schemafile \"$schema_file\" /tmp/frontmatter.json 2\u003e\u00261 | sed 's/^/  /'\n        ((errors++))\n    fi\ndone\n\nif [ $errors -gt 0 ]; then\n    echo \"\"\n    echo \"Found $errors frontmatter validation error(s)\"\n    exit 1\nfi\n\necho \"All frontmatter valid!\"\n```\n\n### Pre-commit Hook\n\n```yaml\nrepos:\n  - repo: local\n    hooks:\n      - id: validate-frontmatter-schema\n        name: Validate Frontmatter Schema\n        entry: bash scripts/validate-frontmatter-schema.sh\n        language: system\n        files: \\.(md|markdown)$\n        pass_filenames: true\n        additional_dependencies:\n          - check-jsonschema\n          - pyyaml\n```\n\n---\n\n## Project Style Guides\n\n### Documentation Style Guide\n\nCreate a comprehensive style configuration for documentation projects:\n\n```json\n{\n  \"default\": true,\n  \n  \"MD003\": { \"style\": \"atx\" },\n  \"MD004\": { \"style\": \"dash\" },\n  \"MD007\": { \"indent\": 2 },\n  \n  \"MD013\": false,\n  \n  \"MD022\": { \"lines_above\": 1, \"lines_below\": 1 },\n  \"MD024\": { \"siblings_only\": true },\n  \"MD025\": { \"front_matter_title\": \"^\\\\s*title\\\\s*[:=]\" },\n  \n  \"MD033\": {\n    \"allowed_elements\": [\n      \"details\", \"summary\", \"kbd\", \"br\", \"sup\", \"sub\",\n      \"img\", \"video\", \"audio\", \"source\", \"iframe\",\n      \"table\", \"thead\", \"tbody\", \"tr\", \"th\", \"td\"\n    ]\n  },\n  \n  \"MD036\": false,\n  \"MD041\": false,\n  \n  \"MD044\": {\n    \"names\": [\n      \"markata-go\",\n      \"GitHub\",\n      \"GitLab\",\n      \"JavaScript\",\n      \"TypeScript\",\n      \"Go\",\n      \"Markdown\",\n      \"YAML\",\n      \"TOML\",\n      \"JSON\"\n    ],\n    \"code_blocks\": false\n  },\n  \n  \"MD046\": { \"style\": \"fenced\" },\n  \"MD048\": { \"style\": \"backtick\" }\n}\n```\n\n### Blog Style Guide\n\nFor blog-style content with more flexibility:\n\n```json\n{\n  \"default\": true,\n  \n  \"MD003\": { \"style\": \"atx\" },\n  \"MD004\": { \"style\": \"dash\" },\n  \n  \"MD013\": false,\n  \n  \"MD022\": { \"lines_above\": 1, \"lines_below\": 1 },\n  \"MD024\": { \"siblings_only\": true },\n  \n  \"MD033\": false,\n  \n  \"MD036\": false,\n  \"MD041\": false,\n  \n  \"MD046\": { \"style\": \"fenced\" },\n  \"MD048\": { \"style\": \"backtick\" }\n}\n```\n\n### API Documentation Style\n\nFor technical API documentation:\n\n```json\n{\n  \"default\": true,\n  \n  \"MD003\": { \"style\": \"atx\" },\n  \"MD004\": { \"style\": \"dash\" },\n  \"MD007\": { \"indent\": 2 },\n  \n  \"MD013\": {\n    \"line_length\": 100,\n    \"code_blocks\": false,\n    \"tables\": false\n  },\n  \n  \"MD022\": { \"lines_above\": 1, \"lines_below\": 1 },\n  \"MD024\": false,\n  \"MD025\": { \"front_matter_title\": \"^\\\\s*title\\\\s*[:=]\" },\n  \n  \"MD033\": {\n    \"allowed_elements\": [\"br\", \"code\", \"pre\"]\n  },\n  \n  \"MD036\": false,\n  \"MD041\": false,\n  \n  \"MD040\": true,\n  \"MD046\": { \"style\": \"fenced\" },\n  \"MD048\": { \"style\": \"backtick\" }\n}\n```\n\n---\n\n## Rule Inheritance and Overrides\n\n### Base Configuration\n\nCreate a base configuration in `config/.markdownlint-base.json`:\n\n```json\n{\n  \"default\": true,\n  \"MD013\": false,\n  \"MD033\": false,\n  \"MD041\": false\n}\n```\n\n### Extending Base Config\n\n**In project root `.markdownlint.json`:**\n\n```json\n{\n  \"extends\": \"config/.markdownlint-base.json\",\n  \"MD024\": { \"siblings_only\": true },\n  \"MD044\": {\n    \"names\": [\"MyProject\"],\n    \"code_blocks\": false\n  }\n}\n```\n\n### Directory-Specific Overrides\n\nCreate override files for specific directories:\n\n**`docs/.markdownlint.json`:**\n\n```json\n{\n  \"extends\": \"../.markdownlint.json\",\n  \"MD013\": {\n    \"line_length\": 100\n  },\n  \"MD025\": {\n    \"front_matter_title\": \"^\\\\s*title\\\\s*[:=]\"\n  }\n}\n```\n\n**`blog/.markdownlint.json`:**\n\n```json\n{\n  \"extends\": \"../.markdownlint.json\",\n  \"MD013\": false,\n  \"MD033\": false\n}\n```\n\n### Inline Overrides\n\nDisable rules for specific sections:\n\n```markdown\n\u003c!-- markdownlint-disable MD033 --\u003e\n\u003cdetails\u003e\n\u003csummary\u003eClick to expand\u003c/summary\u003e\n\nThis content uses raw HTML.\n\n\u003c/details\u003e\n\u003c!-- markdownlint-enable MD033 --\u003e\n```\n\nDisable rules for entire file:\n\n```markdown\n\u003c!-- markdownlint-disable-file MD013 MD033 --\u003e\n\n# This File Has Custom Rules\n\nLong lines are allowed here...\n```\n\n---\n\n## Creating Custom Validators\n\n### Python Validator\n\nCreate a reusable Python validator:\n\n```python\n#!/usr/bin/env python3\n# scripts/validate_content.py\n\"\"\"Content validation for markata-go sites.\"\"\"\n\nimport argparse\nimport re\nimport sys\nfrom pathlib import Path\nfrom typing import List, Tuple\n\nimport yaml\n\n\ndef extract_frontmatter(content: str) -\u003e Tuple[dict, str]:\n    \"\"\"Extract frontmatter and body from content.\"\"\"\n    match = re.match(r'^---\\n(.*?)\\n---\\n(.*)$', content, re.DOTALL)\n    if not match:\n        return {}, content\n    \n    try:\n        frontmatter = yaml.safe_load(match.group(1))\n        return frontmatter or {}, match.group(2)\n    except yaml.YAMLError:\n        return {}, content\n\n\ndef check_required_fields(\n    frontmatter: dict,\n    required: List[str],\n    file_path: Path\n) -\u003e List[str]:\n    \"\"\"Check for required frontmatter fields.\"\"\"\n    errors = []\n    for field in required:\n        if field not in frontmatter:\n            errors.append(f\"{file_path}: Missing required field '{field}'\")\n    return errors\n\n\ndef check_description_length(\n    frontmatter: dict,\n    min_length: int,\n    max_length: int,\n    file_path: Path\n) -\u003e List[str]:\n    \"\"\"Check description length for SEO.\"\"\"\n    errors = []\n    description = frontmatter.get('description', '')\n    \n    if description and len(description) \u003c min_length:\n        errors.append(\n            f\"{file_path}: Description too short \"\n            f\"({len(description)} \u003c {min_length})\"\n        )\n    \n    if description and len(description) \u003e max_length:\n        errors.append(\n            f\"{file_path}: Description too long \"\n            f\"({len(description)} \u003e {max_length})\"\n        )\n    \n    return errors\n\n\ndef check_tags(\n    frontmatter: dict,\n    allowed_tags: List[str],\n    file_path: Path\n) -\u003e List[str]:\n    \"\"\"Check that tags are from allowed list.\"\"\"\n    warnings = []\n    tags = frontmatter.get('tags', [])\n    \n    for tag in tags:\n        if allowed_tags and tag not in allowed_tags:\n            warnings.append(\n                f\"{file_path}: Unknown tag '{tag}'\"\n            )\n    \n    return warnings\n\n\ndef check_images_have_alt(body: str, file_path: Path) -\u003e List[str]:\n    \"\"\"Check that all images have alt text.\"\"\"\n    errors = []\n    \n    # Find images with empty alt text\n    empty_alt = re.findall(r'!\\[\\s*\\]\\([^)]+\\)', body)\n    for img in empty_alt:\n        errors.append(f\"{file_path}: Image missing alt text: {img[:50]}...\")\n    \n    return errors\n\n\ndef validate_file(\n    file_path: Path,\n    config: dict\n) -\u003e Tuple[List[str], List[str]]:\n    \"\"\"Validate a single file.\"\"\"\n    errors = []\n    warnings = []\n    \n    content = file_path.read_text()\n    frontmatter, body = extract_frontmatter(content)\n    \n    # Required fields\n    required = config.get('required_fields', ['title', 'date', 'published'])\n    errors.extend(check_required_fields(frontmatter, required, file_path))\n    \n    # Description length\n    desc_min = config.get('description_min_length', 50)\n    desc_max = config.get('description_max_length', 160)\n    errors.extend(check_description_length(\n        frontmatter, desc_min, desc_max, file_path\n    ))\n    \n    # Tags\n    allowed_tags = config.get('allowed_tags', [])\n    warnings.extend(check_tags(frontmatter, allowed_tags, file_path))\n    \n    # Images\n    if config.get('require_alt_text', True):\n        errors.extend(check_images_have_alt(body, file_path))\n    \n    return errors, warnings\n\n\ndef main():\n    parser = argparse.ArgumentParser(description='Validate content files')\n    parser.add_argument('files', nargs='+', help='Files to validate')\n    parser.add_argument(\n        '--config', '-c',\n        default='.content-lint.yaml',\n        help='Configuration file'\n    )\n    parser.add_argument(\n        '--strict',\n        action='store_true',\n        help='Treat warnings as errors'\n    )\n    args = parser.parse_args()\n    \n    # Load config\n    config = {}\n    config_path = Path(args.config)\n    if config_path.exists():\n        config = yaml.safe_load(config_path.read_text())\n    \n    all_errors = []\n    all_warnings = []\n    \n    for file_arg in args.files:\n        file_path = Path(file_arg)\n        if not file_path.suffix == '.md':\n            continue\n        \n        errors, warnings = validate_file(file_path, config)\n        all_errors.extend(errors)\n        all_warnings.extend(warnings)\n    \n    # Output results\n    for error in all_errors:\n        print(f\"ERROR: {error}\")\n    \n    for warning in all_warnings:\n        print(f\"WARNING: {warning}\")\n    \n    # Exit code\n    if all_errors or (args.strict and all_warnings):\n        sys.exit(1)\n    \n    print(f\"Validated {len(args.files)} files successfully\")\n    sys.exit(0)\n\n\nif __name__ == '__main__':\n    main()\n```\n\n### Configuration File\n\nCreate `.content-lint.yaml`:\n\n```yaml\n# .content-lint.yaml\nrequired_fields:\n  - title\n  - date\n  - published\n\ndescription_min_length: 50\ndescription_max_length: 160\n\nrequire_alt_text: true\n\nallowed_tags:\n  - documentation\n  - tutorial\n  - guide\n  - reference\n  - blog\n  - announcement\n  - quality-assurance\n```\n\n### Pre-commit Integration\n\n```yaml\nrepos:\n  - repo: local\n    hooks:\n      - id: content-validator\n        name: Validate Content\n        entry: python scripts/validate_content.py\n        language: python\n        files: \\.(md|markdown)$\n        pass_filenames: true\n        additional_dependencies:\n          - pyyaml\n```\n\n---\n\n## See Also\n\n- [Pre-commit Hooks](pre-commit-hooks/) - Local quality checks\n- [GitHub Actions](github-actions/) - CI/CD integration\n- [GitLab CI](gitlab-ci/) - GitLab pipelines\n- [Troubleshooting](troubleshooting/) - Common issues and solutions\n",
      "summary": "Configure and create custom linting rules for markdownlint, frontmatter validation, and project-specific style guides",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "documentation",
        "quality-assurance",
        "linting",
        "configuration"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/",
      "url": "https://markata.dev/docs/guides/",
      "title": "Guides Hub",
      "content_html": "\u003cp\u003eWelcome to the markata-go documentation! Choose a learning path based on your goals, or browse individual guides below.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eThe \u003ca href=\"/docs/guides/icons/\"\u003eIcon Shortcodes\u003c/a\u003e guide and\n\u003ca href=\"/docs/guides/markdown-containers/\"\u003eMarkdown Containers\u003c/a\u003e show how to build\nresponsive icon cards, feature rows and architecture diagrams entirely in\nMarkdown. Coding agents can follow\n\u003ca href=\"/docs/guides/agent-skills/\"\u003ethe bundled Markata skill\u003c/a\u003e for these patterns.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"learning-paths\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLearning Paths\u003c/span\u003e \u003ca href=\"#learning-paths\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"beginner-path\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBeginner Path\u003c/span\u003e \u003ca href=\"#beginner-path\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eTime: ~30 minutes\u003c/strong\u003e | Get your first site running\u003c/p\u003e\n\u003cp\u003ePerfect if you\u0026rsquo;re new to markata-go or static site generators in general.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eStep\u003c/th\u003e\n\u003cth\u003eGuide\u003c/th\u003e\n\u003cth\u003eTime\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/getting-started/\"\u003eGetting Started\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e10 min\u003c/td\u003e\n\u003ctd\u003eInstallation and first site\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/quickstart/\"\u003eQuickstart\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e5 min\u003c/td\u003e\n\u003ctd\u003eBuild and serve your site\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/frontmatter/\"\u003eFrontmatter\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e10 min\u003c/td\u003e\n\u003ctd\u003eUnderstanding post metadata\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e4\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/markdown/\"\u003eMarkdown Features\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e5 min\u003c/td\u003e\n\u003ctd\u003eWriting content with Markdown\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eAfter completing:\u003c/strong\u003e You\u0026rsquo;ll have a working site with your first posts.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"blogger-path\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBlogger Path\u003c/span\u003e \u003ca href=\"#blogger-path\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eTime: ~45 minutes\u003c/strong\u003e | Create a polished blog\u003c/p\u003e\n\u003cp\u003eFor writers and content creators who want a beautiful, functional blog.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eStep\u003c/th\u003e\n\u003cth\u003eGuide\u003c/th\u003e\n\u003cth\u003eTime\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/getting-started/\"\u003eGetting Started\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e10 min\u003c/td\u003e\n\u003ctd\u003eInstallation and setup\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/themes/\"\u003eThemes and Styling\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e10 min\u003c/td\u003e\n\u003ctd\u003eCustomize your site\u0026rsquo;s look\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/feeds/\"\u003eFeeds\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e10 min\u003c/td\u003e\n\u003ctd\u003eRSS, archives, and tag pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e4\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/syndication-feeds/\"\u003eSyndication Feeds\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e5 min\u003c/td\u003e\n\u003ctd\u003eRSS/Atom configuration\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e5\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/deployment/\"\u003eDeployment\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e10 min\u003c/td\u003e\n\u003ctd\u003eGo live on GitHub Pages, Netlify, etc.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eAfter completing:\u003c/strong\u003e You\u0026rsquo;ll have a deployed blog with RSS feeds and custom styling.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"documentation-site-path\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocumentation Site Path\u003c/span\u003e \u003ca href=\"#documentation-site-path\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eTime: ~1 hour\u003c/strong\u003e | Build a documentation site\u003c/p\u003e\n\u003cp\u003eFor teams and projects that need structured documentation.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eStep\u003c/th\u003e\n\u003cth\u003eGuide\u003c/th\u003e\n\u003cth\u003eTime\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/getting-started/\"\u003eGetting Started\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e10 min\u003c/td\u003e\n\u003ctd\u003eInstallation and setup\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfiguration\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e15 min\u003c/td\u003e\n\u003ctd\u003eSite-wide settings\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/sidebars/\"\u003eSidebars\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e10 min\u003c/td\u003e\n\u003ctd\u003eNavigation sidebars\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e4\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/templates/\"\u003eTemplates\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e15 min\u003c/td\u003e\n\u003ctd\u003eCustom layouts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e5\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/search/\"\u003eSearch\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e10 min\u003c/td\u003e\n\u003ctd\u003eAdd site search\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eAfter completing:\u003c/strong\u003e You\u0026rsquo;ll have a documentation site with navigation, search, and custom templates.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"developer-path\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeveloper Path\u003c/span\u003e \u003ca href=\"#developer-path\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eTime: ~2 hours\u003c/strong\u003e | Master markata-go\u003c/p\u003e\n\u003cp\u003eFor developers who want full control and customization.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eStep\u003c/th\u003e\n\u003cth\u003eGuide\u003c/th\u003e\n\u003cth\u003eTime\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/getting-started/\"\u003eGetting Started\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e10 min\u003c/td\u003e\n\u003ctd\u003eInstallation and setup\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfiguration\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e15 min\u003c/td\u003e\n\u003ctd\u003eComplete config reference\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/templates/\"\u003eTemplates\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e20 min\u003c/td\u003e\n\u003ctd\u003eTemplate system and filters\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e4\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/feeds/\"\u003eFeeds\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e15 min\u003c/td\u003e\n\u003ctd\u003eAdvanced feed configuration\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e5\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/plugin-development/\"\u003ePlugin Development\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e30 min\u003c/td\u003e\n\u003ctd\u003eCreate custom plugins\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e6\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/dynamic-content/\"\u003eDynamic Content\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e15 min\u003c/td\u003e\n\u003ctd\u003eJinja expressions in content\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e7\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/deployment/\"\u003eDeployment\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e15 min\u003c/td\u003e\n\u003ctd\u003eCI/CD and self-hosting\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eAfter completing:\u003c/strong\u003e You\u0026rsquo;ll understand the full architecture and can extend markata-go for any use case.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"all-guides-by-topic\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAll Guides by Topic\u003c/span\u003e \u003ca href=\"#all-guides-by-topic\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"getting-started\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGetting Started\u003c/span\u003e \u003ca href=\"#getting-started\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/getting-started/\"\u003eGetting Started\u003c/a\u003e - Complete installation and first site tutorial\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/quickstart/\"\u003eQuickstart\u003c/a\u003e - 5-minute quick start\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/quick-reference/\"\u003eQuick Reference\u003c/a\u003e - Common commands and snippets\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"content-creation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContent Creation\u003c/span\u003e \u003ca href=\"#content-creation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/frontmatter/\"\u003eFrontmatter\u003c/a\u003e - Post metadata and custom fields\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/markdown/\"\u003eMarkdown Features\u003c/a\u003e - Tables, code blocks, admonitions, wikilinks\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/image-library/\"\u003eImage Library\u003c/a\u003e - Search and reuse site images\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/webawesome/\"\u003eWeb Awesome Components\u003c/a\u003e - Image comparisons and raw Web Awesome components\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/post-formats/\"\u003ePost Formats\u003c/a\u003e - HTML, Markdown, and OG card outputs\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfiguration\u003c/a\u003e - Complete configuration reference\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/feeds/\"\u003eFeeds\u003c/a\u003e - Creating filtered, sorted, paginated collections\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/syndication-feeds/\"\u003eSyndication Feeds\u003c/a\u003e - RSS, Atom, and JSON feed setup\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"appearance\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAppearance\u003c/span\u003e \u003ca href=\"#appearance\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/themes/\"\u003eThemes and Styling\u003c/a\u003e - Color palettes, CSS variables, custom styles\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/templates/\"\u003eTemplates\u003c/a\u003e - Pongo2/Jinja2 template customization\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/sidebars/\"\u003eSidebars\u003c/a\u003e - Table of contents and feed navigation\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"features\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeatures\u003c/span\u003e \u003ca href=\"#features\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/search/\"\u003eSearch\u003c/a\u003e - Pagefind integration for site search\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/content-diagnostics/\"\u003eContent Diagnostics\u003c/a\u003e - Inspect build dispositions and reason codes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/view-transitions/\"\u003eView Transitions\u003c/a\u003e - Smooth page navigation animations\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/resource-hints/\"\u003eResource Hints\u003c/a\u003e - Auto-generate dns-prefetch and preconnect\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/youtube/\"\u003eYouTube Embeds\u003c/a\u003e - Embedding YouTube videos\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/webawesome/\"\u003eWeb Awesome Components\u003c/a\u003e - Image comparisons with CDN or vendored assets\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/dynamic-content/\"\u003eDynamic Content\u003c/a\u003e - Jinja expressions in Markdown\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/structured-data/\"\u003eStructured Data\u003c/a\u003e - JSON-LD and SEO\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"deployment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeployment\u003c/span\u003e \u003ca href=\"#deployment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/deployment/\"\u003eDeployment\u003c/a\u003e - GitHub Pages, Netlify, Vercel, Docker\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/self-hosting/\"\u003eSelf-Hosting\u003c/a\u003e - nginx, Caddy, and manual deployment\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/nginx-redirects/\"\u003eNginx-native Redirects\u003c/a\u003e - Generate and safely deploy \u003ccode\u003eredirects.conf\u003c/code\u003e with HTML fallbacks\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"advanced\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdvanced\u003c/span\u003e \u003ca href=\"#advanced\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/agent-skills/\"\u003eAgent Skills\u003c/a\u003e - Install the bundled markata-go site skill for coding agents\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/plugin-development/\"\u003ePlugin Development\u003c/a\u003e - Creating custom plugins\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/static-visualizations/\"\u003eStatic SVG Foundation\u003c/a\u003e - Developer-only backend SVG contract and adapter roadmap\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/migration/\"\u003eMigration\u003c/a\u003e - Migrating from other static site generators\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/performance/\"\u003ePerformance and Profiling\u003c/a\u003e - Benchmarking and profiling builds\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/reference/resource-hints-implementation/\"\u003eResource Hints Implementation\u003c/a\u003e - Technical details\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"quick-links\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Links\u003c/span\u003e \u003ca href=\"#quick-links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTask\u003c/th\u003e\n\u003cth\u003eGuide\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eInstall markata-go\u003c/td\u003e\n\u003ctd\u003e[Getting Started](/docs/getting-started/\u003ca href=\"/tags/installation/\" class=\"hashtag-tag\" data-tag=\"installation\" data-count=1 data-reading-time=2 data-reading-time-text=\"2 minutes\"\u003e#installation\u003c/a\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eChange site colors\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/themes/#available-palettes\"\u003eThemes\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAdd RSS feed\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/syndication-feeds/\"\u003eSyndication Feeds\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFix excessive dns-prefetch\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/resource-hints-quick-fix/\"\u003eResource Hints Quick Fix\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDeploy to GitHub Pages\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/deployment/#deploying-to-github-pages\"\u003eDeployment\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eConfigure nginx redirects\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/nginx-redirects/\"\u003eNginx-native Redirects\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCreate a custom template\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/templates/#template-inheritance\"\u003eTemplates\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eInstall the agent skill\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/agent-skills/\"\u003eAgent Skills\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFilter posts by tag\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/docs/guides/feeds/#filtering-posts\"\u003eFeeds\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"need-help\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNeed Help?\u003c/span\u003e \u003ca href=\"#need-help\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/docs/troubleshooting/\"\u003eTroubleshooting\u003c/a\u003e\u003c/strong\u003e - Common issues and solutions\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/docs/guides/quick-reference/\"\u003eQuick Reference\u003c/a\u003e\u003c/strong\u003e - Common commands and config snippets\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/issues\"\u003eGitHub Issues\u003c/a\u003e\u003c/strong\u003e - Report bugs or request features\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nWelcome to the markata-go documentation! Choose a learning path based on your goals, or browse individual guides below.\n\n---\n\nThe [Icon Shortcodes](/docs/guides/icons/) guide and\n[Markdown Containers](/docs/guides/markdown-containers/) show how to build\nresponsive icon cards, feature rows and architecture diagrams entirely in\nMarkdown. Coding agents can follow\n[the bundled Markata skill](/docs/guides/agent-skills/) for these patterns.\n\n---\n\n## Learning Paths\n\n### Beginner Path\n**Time: ~30 minutes** | Get your first site running\n\nPerfect if you're new to markata-go or static site generators in general.\n\n| Step | Guide | Time | Description |\n|------|-------|------|-------------|\n| 1 | [Getting Started](/docs/getting-started/) | 10 min | Installation and first site |\n| 2 | [Quickstart](/docs/quickstart/) | 5 min | Build and serve your site |\n| 3 | [Frontmatter](/docs/guides/frontmatter/) | 10 min | Understanding post metadata |\n| 4 | [Markdown Features](/docs/guides/markdown/) | 5 min | Writing content with Markdown |\n\n**After completing:** You'll have a working site with your first posts.\n\n---\n\n### Blogger Path\n**Time: ~45 minutes** | Create a polished blog\n\nFor writers and content creators who want a beautiful, functional blog.\n\n| Step | Guide | Time | Description |\n|------|-------|------|-------------|\n| 1 | [Getting Started](/docs/getting-started/) | 10 min | Installation and setup |\n| 2 | [Themes and Styling](/docs/guides/themes/) | 10 min | Customize your site's look |\n| 3 | [Feeds](/docs/guides/feeds/) | 10 min | RSS, archives, and tag pages |\n| 4 | [Syndication Feeds](/docs/guides/syndication-feeds/) | 5 min | RSS/Atom configuration |\n| 5 | [Deployment](/docs/guides/deployment/) | 10 min | Go live on GitHub Pages, Netlify, etc. |\n\n**After completing:** You'll have a deployed blog with RSS feeds and custom styling.\n\n---\n\n### Documentation Site Path\n**Time: ~1 hour** | Build a documentation site\n\nFor teams and projects that need structured documentation.\n\n| Step | Guide | Time | Description |\n|------|-------|------|-------------|\n| 1 | [Getting Started](/docs/getting-started/) | 10 min | Installation and setup |\n| 2 | [Configuration](/docs/guides/configuration/) | 15 min | Site-wide settings |\n| 3 | [Sidebars](/docs/guides/sidebars/) | 10 min | Navigation sidebars |\n| 4 | [Templates](/docs/guides/templates/) | 15 min | Custom layouts |\n| 5 | [Search](/docs/guides/search/) | 10 min | Add site search |\n\n**After completing:** You'll have a documentation site with navigation, search, and custom templates.\n\n---\n\n### Developer Path\n**Time: ~2 hours** | Master markata-go\n\nFor developers who want full control and customization.\n\n| Step | Guide | Time | Description |\n|------|-------|------|-------------|\n| 1 | [Getting Started](/docs/getting-started/) | 10 min | Installation and setup |\n| 2 | [Configuration](/docs/guides/configuration/) | 15 min | Complete config reference |\n| 3 | [Templates](/docs/guides/templates/) | 20 min | Template system and filters |\n| 4 | [Feeds](/docs/guides/feeds/) | 15 min | Advanced feed configuration |\n| 5 | [Plugin Development](/docs/guides/plugin-development/) | 30 min | Create custom plugins |\n| 6 | [Dynamic Content](/docs/guides/dynamic-content/) | 15 min | Jinja expressions in content |\n| 7 | [Deployment](/docs/guides/deployment/) | 15 min | CI/CD and self-hosting |\n\n**After completing:** You'll understand the full architecture and can extend markata-go for any use case.\n\n---\n\n## All Guides by Topic\n\n### Getting Started\n- [Getting Started](/docs/getting-started/) - Complete installation and first site tutorial\n- [Quickstart](/docs/quickstart/) - 5-minute quick start\n- [Quick Reference](/docs/guides/quick-reference/) - Common commands and snippets\n\n### Content Creation\n- [Frontmatter](/docs/guides/frontmatter/) - Post metadata and custom fields\n- [Markdown Features](/docs/guides/markdown/) - Tables, code blocks, admonitions, wikilinks\n- [Image Library](/docs/guides/image-library/) - Search and reuse site images\n- [Web Awesome Components](/docs/guides/webawesome/) - Image comparisons and raw Web Awesome components\n- [Post Formats](/docs/guides/post-formats/) - HTML, Markdown, and OG card outputs\n\n### Configuration\n- [Configuration](/docs/guides/configuration/) - Complete configuration reference\n- [Feeds](/docs/guides/feeds/) - Creating filtered, sorted, paginated collections\n- [Syndication Feeds](/docs/guides/syndication-feeds/) - RSS, Atom, and JSON feed setup\n\n### Appearance\n- [Themes and Styling](/docs/guides/themes/) - Color palettes, CSS variables, custom styles\n- [Templates](/docs/guides/templates/) - Pongo2/Jinja2 template customization\n- [Sidebars](/docs/guides/sidebars/) - Table of contents and feed navigation\n\n### Features\n- [Search](/docs/guides/search/) - Pagefind integration for site search\n- [Content Diagnostics](/docs/guides/content-diagnostics/) - Inspect build dispositions and reason codes\n- [View Transitions](/docs/guides/view-transitions/) - Smooth page navigation animations\n- [Resource Hints](/docs/guides/resource-hints/) - Auto-generate dns-prefetch and preconnect\n- [YouTube Embeds](/docs/guides/youtube/) - Embedding YouTube videos\n- [Web Awesome Components](/docs/guides/webawesome/) - Image comparisons with CDN or vendored assets\n- [Dynamic Content](/docs/guides/dynamic-content/) - Jinja expressions in Markdown\n- [Structured Data](/docs/guides/structured-data/) - JSON-LD and SEO\n\n### Deployment\n- [Deployment](/docs/guides/deployment/) - GitHub Pages, Netlify, Vercel, Docker\n- [Self-Hosting](/docs/guides/self-hosting/) - nginx, Caddy, and manual deployment\n- [Nginx-native Redirects](/docs/guides/nginx-redirects/) - Generate and safely deploy `redirects.conf` with HTML fallbacks\n\n### Advanced\n- [Agent Skills](/docs/guides/agent-skills/) - Install the bundled markata-go site skill for coding agents\n- [Plugin Development](/docs/guides/plugin-development/) - Creating custom plugins\n- [Static SVG Foundation](/docs/guides/static-visualizations/) - Developer-only backend SVG contract and adapter roadmap\n- [Migration](/docs/guides/migration/) - Migrating from other static site generators\n- [Performance and Profiling](/docs/guides/performance/) - Benchmarking and profiling builds\n- [Resource Hints Implementation](/docs/reference/resource-hints-implementation/) - Technical details\n\n---\n\n## Quick Links\n\n| Task | Guide |\n|------|-------|\n| Install markata-go | [Getting Started](/docs/getting-started/\u003ca href=\"/tags/installation/\" class=\"hashtag-tag\" data-tag=\"installation\" data-count=1 data-reading-time=2 data-reading-time-text=\"2 minutes\"\u003e#installation\u003c/a\u003e) |\n| Change site colors | [Themes](/docs/guides/themes/#available-palettes) |\n| Add RSS feed | [Syndication Feeds](/docs/guides/syndication-feeds/) |\n| Fix excessive dns-prefetch | [Resource Hints Quick Fix](/docs/guides/resource-hints-quick-fix/) |\n| Deploy to GitHub Pages | [Deployment](/docs/guides/deployment/#deploying-to-github-pages) |\n| Configure nginx redirects | [Nginx-native Redirects](/docs/guides/nginx-redirects/) |\n| Create a custom template | [Templates](/docs/guides/templates/#template-inheritance) |\n| Install the agent skill | [Agent Skills](/docs/guides/agent-skills/) |\n| Filter posts by tag | [Feeds](/docs/guides/feeds/#filtering-posts) |\n\n---\n\n## Need Help?\n\n- **[Troubleshooting](/docs/troubleshooting/)** - Common issues and solutions\n- **[Quick Reference](/docs/guides/quick-reference/)** - Common commands and config snippets\n- **[GitHub Issues](https://github.com/WaylonWalker/markata-go/issues)** - Report bugs or request features\n",
      "summary": "Documentation hub with learning paths for different user types - from beginners to advanced developers",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "documentation",
        "guides",
        "learning"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/deployment/vercel/",
      "url": "https://markata.dev/docs/guides/deployment/vercel/",
      "title": "Deploy to Vercel",
      "content_html": "\u003cp\u003eVercel provides zero-configuration deployments with excellent performance and edge capabilities. It\u0026rsquo;s known for its speed and developer experience.\u003c/p\u003e\n\u003ch2 id=\"prerequisites\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrerequisites\u003c/span\u003e \u003ca href=\"#prerequisites\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eA Vercel account (free tier available)\u003c/li\u003e\n\u003cli\u003eYour markata-go site in a Git repository (GitHub, GitLab, or Bitbucket)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"cost\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCost\u003c/span\u003e \u003ca href=\"#cost\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTier\u003c/th\u003e\n\u003cth\u003eBandwidth\u003c/th\u003e\n\u003cth\u003eBuilds\u003c/th\u003e\n\u003cth\u003eEdge Functions\u003c/th\u003e\n\u003cth\u003ePrice\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eHobby\u003c/td\u003e\n\u003ctd\u003e100 GB/mo\u003c/td\u003e\n\u003ctd\u003e6,000 min/mo\u003c/td\u003e\n\u003ctd\u003e100,000 exec/mo\u003c/td\u003e\n\u003ctd\u003e$0\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePro\u003c/td\u003e\n\u003ctd\u003e1 TB/mo\u003c/td\u003e\n\u003ctd\u003eUnlimited\u003c/td\u003e\n\u003ctd\u003e1M exec/mo\u003c/td\u003e\n\u003ctd\u003e$20/mo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eEnterprise\u003c/td\u003e\n\u003ctd\u003eCustom\u003c/td\u003e\n\u003ctd\u003eUnlimited\u003c/td\u003e\n\u003ctd\u003eCustom\u003c/td\u003e\n\u003ctd\u003eContact\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe Hobby tier is free but limited to personal, non-commercial use.\u003c/p\u003e\n\u003ch2 id=\"method-1-git-integration-recommended\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMethod 1: Git Integration (Recommended)\u003c/span\u003e \u003ca href=\"#method-1-git-integration-recommended\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"step-1-connect-repository\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 1: Connect Repository\u003c/span\u003e \u003ca href=\"#step-1-connect-repository\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eLog in to \u003ca href=\"https://vercel.com\"\u003eVercel\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eAdd New\u003c/strong\u003e \u0026gt; \u003cstrong\u003eProject\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eImport your Git repository\u003c/li\u003e\n\u003cli\u003eAuthorize Vercel to access your repo\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"step-2-configure-build-settings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 2: Configure Build Settings\u003c/span\u003e \u003ca href=\"#step-2-configure-build-settings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSet these options:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSetting\u003c/th\u003e\n\u003cth\u003eValue\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eFramework Preset\u003c/td\u003e\n\u003ctd\u003eOther\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuild Command\u003c/td\u003e\n\u003ctd\u003eSee below\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eOutput Directory\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epublic\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eInstall Command\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eecho \u0026quot;No npm dependencies\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eBuild Command:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -sSL https://go.dev/dl/go1.22.0.linux-amd64.tar.gz \u003cspan class=\"p\"\u003e|\u003c/span\u003e tar -xzf - \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e ./go/bin/go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e ~/go/bin/markata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"step-3-set-environment-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 3: Set Environment Variables\u003c/span\u003e \u003ca href=\"#step-3-set-environment-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd these environment variables:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eKey\u003c/th\u003e\n\u003cth\u003eValue\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_URL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehttps://your-project.vercel.app\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"step-4-deploy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 4: Deploy\u003c/span\u003e \u003ca href=\"#step-4-deploy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eClick \u003cstrong\u003eDeploy\u003c/strong\u003e. Vercel will build and deploy your site.\u003c/p\u003e\n\u003ch2 id=\"method-2-vercel-json-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMethod 2: vercel.json Configuration\u003c/span\u003e \u003ca href=\"#method-2-vercel-json-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCreate \u003ccode\u003evercel.json\u003c/code\u003e in your repository root for more control:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;buildCommand\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;curl -sSL https://go.dev/dl/go1.22.0.linux-amd64.tar.gz | tar -xzf - \u0026amp;\u0026amp; ./go/bin/go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026amp;\u0026amp; ~/go/bin/markata-go build --clean\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;outputDirectory\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;installCommand\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;echo \u0026#39;No npm dependencies\u0026#39;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;framework\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;headers\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/static/(.*)\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;headers\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;key\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Cache-Control\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public, max-age=31536000, immutable\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/(.*).html\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;headers\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;key\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Cache-Control\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public, max-age=0, must-revalidate\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/(.*)\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;headers\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;key\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;X-Frame-Options\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;DENY\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;key\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;X-Content-Type-Options\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;nosniff\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;redirects\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/old-path/:path*\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;destination\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/new-path/:path*\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;permanent\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"method-3-cli-deployment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMethod 3: CLI Deployment\u003c/span\u003e \u003ca href=\"#method-3-cli-deployment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDeploy manually using the Vercel CLI:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Install CLI\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpm install -g vercel\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Login\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evercel login\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build your site locally\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Deploy preview (from public directory)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e public \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e vercel\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Deploy to production\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e public \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e vercel --prod\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"custom-domain-setup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Domain Setup\u003c/span\u003e \u003ca href=\"#custom-domain-setup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"step-1-add-domain\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 1: Add Domain\u003c/span\u003e \u003ca href=\"#step-1-add-domain\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eGo to your project\u0026rsquo;s \u003cstrong\u003eSettings\u003c/strong\u003e \u0026gt; \u003cstrong\u003eDomains\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eEnter your domain (e.g., \u003ccode\u003eexample.com\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eAdd\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"step-2-configure-dns\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 2: Configure DNS\u003c/span\u003e \u003ca href=\"#step-2-configure-dns\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eVercel provides DNS records to add at your registrar:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFor apex domain:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eType: A\nName: @\nValue: 76.76.21.21\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eFor www subdomain:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eType: CNAME\nName: www\nValue: cname.vercel-dns.com\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"step-3-verify-and-enable-https\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 3: Verify and Enable HTTPS\u003c/span\u003e \u003ca href=\"#step-3-verify-and-enable-https\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eVercel automatically provisions SSL certificates once DNS is configured. This usually takes a few minutes.\u003c/p\u003e\n\u003ch3 id=\"step-4-update-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 4: Update Configuration\u003c/span\u003e \u003ca href=\"#step-4-update-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUpdate your \u003ccode\u003emarkata-go.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSet the production environment variable:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evercel env add MARKATA_GO_URL production\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Enter: https://example.com\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"environment-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment Variables\u003c/span\u003e \u003ca href=\"#environment-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eManage environment variables per environment:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Add to production\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evercel env add MARKATA_GO_URL production\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Value: https://example.com\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Add to preview (for PR deployments)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evercel env add MARKATA_GO_URL preview\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Value: (leave empty to use Vercel\u0026#39;s preview URL)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Add to development\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evercel env add MARKATA_GO_URL development\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Value: http://localhost:8080\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List all variables\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evercel env ls\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Pull variables to local .env\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evercel env pull\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"preview-deployments\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePreview Deployments\u003c/span\u003e \u003ca href=\"#preview-deployments\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eVercel automatically creates preview deployments for every push:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eProduction\u003c/strong\u003e: \u003ccode\u003eyour-project.vercel.app\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePreview\u003c/strong\u003e: \u003ccode\u003eyour-project-git-branch-username.vercel.app\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePR Preview\u003c/strong\u003e: Automatically commented on GitHub PRs\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"edge-functions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEdge Functions\u003c/span\u003e \u003ca href=\"#edge-functions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd edge functions for dynamic functionality:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// api/hello.js\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eexport\u003c/span\u003e \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003econfig\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eruntime\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;edge\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eexport\u003c/span\u003e \u003cspan class=\"k\"\u003edefault\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003ehandler\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eJSON\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estringify\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e \u003cspan class=\"nx\"\u003emessage\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Hello from the Edge!\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e}),\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Content-Type\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;application/json\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAccess at \u003ccode\u003e/api/hello\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"analytics\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAnalytics\u003c/span\u003e \u003ca href=\"#analytics\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEnable Vercel Analytics for performance insights:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eGo to \u003cstrong\u003eProject Settings\u003c/strong\u003e \u0026gt; \u003cstrong\u003eAnalytics\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eEnable\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eAdd the analytics script to your template:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003edefer\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/_vercel/insights/script.js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"speed-insights\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSpeed Insights\u003c/span\u003e \u003ca href=\"#speed-insights\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEnable Speed Insights for Core Web Vitals:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eGo to \u003cstrong\u003eProject Settings\u003c/strong\u003e \u0026gt; \u003cstrong\u003eSpeed Insights\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eEnable\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"build-fails-go-installation-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Fails: Go Installation Issues\u003c/span\u003e \u003ca href=\"#build-fails-go-installation-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe build command needs to install Go first. Ensure your build command is correct:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;buildCommand\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;curl -sSL https://go.dev/dl/go1.22.0.linux-amd64.tar.gz | tar -xzf - \u0026amp;\u0026amp; ./go/bin/go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026amp;\u0026amp; ~/go/bin/markata-go build --clean\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"build-timeout\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Timeout\u003c/span\u003e \u003ca href=\"#build-timeout\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eHobby tier has a 45-second build limit. Consider:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eUpgrading to Pro for longer builds\u003c/li\u003e\n\u003cli\u003ePre-building locally and deploying the output:\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e public \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e vercel --prod\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"404-on-page-refresh\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e404 on Page Refresh\u003c/span\u003e \u003ca href=\"#404-on-page-refresh\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eVercel handles clean URLs automatically for static sites. Ensure your output directory is correct.\u003c/p\u003e\n\u003ch3 id=\"environment-variables-not-applied\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment Variables Not Applied\u003c/span\u003e \u003ca href=\"#environment-variables-not-applied\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCheck that variables are set for the correct environment:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evercel env ls\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eProduction, Preview, and Development are separate environments.\u003c/p\u003e\n\u003ch3 id=\"assets-not-loading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAssets Not Loading\u003c/span\u003e \u003ca href=\"#assets-not-loading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eVerify your \u003ccode\u003eMARKATA_GO_URL\u003c/code\u003e matches your deployment URL:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check current value\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evercel env ls \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep MARKATA_GO_URL\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"performance-optimization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePerformance Optimization\u003c/span\u003e \u003ca href=\"#performance-optimization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"enable-compression\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnable Compression\u003c/span\u003e \u003ca href=\"#enable-compression\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eVercel automatically compresses responses with gzip and Brotli.\u003c/p\u003e\n\u003ch3 id=\"configure-caching\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfigure Caching\u003c/span\u003e \u003ca href=\"#configure-caching\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIn \u003ccode\u003evercel.json\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;headers\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/static/(.*)\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;headers\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;key\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Cache-Control\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public, max-age=31536000, immutable\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/(.*).xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;headers\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;key\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Cache-Control\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public, max-age=3600\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"use-edge-network\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUse Edge Network\u003c/span\u003e \u003ca href=\"#use-edge-network\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eVercel\u0026rsquo;s edge network automatically serves your site from the nearest location to each visitor.\u003c/p\u003e\n\u003ch2 id=\"monorepo-support\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMonorepo Support\u003c/span\u003e \u003ca href=\"#monorepo-support\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor monorepos, configure the root directory:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;installCommand\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;echo \u0026#39;Skip install\u0026#39;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;buildCommand\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cd packages/my-site \u0026amp;\u0026amp; curl -sSL ... \u0026amp;\u0026amp; markata-go build\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;outputDirectory\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;packages/my-site/public\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr set the \u003cstrong\u003eRoot Directory\u003c/strong\u003e in project settings.\u003c/p\u003e\n\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext Steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://vercel.com/docs\"\u003eVercel Docs\u003c/a\u003e - Official documentation\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"../configuration/\"\u003eConfiguration Guide\u003c/a\u003e - Customize your markata-go site\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"../themes/\"\u003eThemes Guide\u003c/a\u003e - Change your site\u0026rsquo;s appearance\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nVercel provides zero-configuration deployments with excellent performance and edge capabilities. It's known for its speed and developer experience.\n\n## Prerequisites\n\n- A Vercel account (free tier available)\n- Your markata-go site in a Git repository (GitHub, GitLab, or Bitbucket)\n\n## Cost\n\n| Tier | Bandwidth | Builds | Edge Functions | Price |\n|------|-----------|--------|----------------|-------|\n| Hobby | 100 GB/mo | 6,000 min/mo | 100,000 exec/mo | $0 |\n| Pro | 1 TB/mo | Unlimited | 1M exec/mo | $20/mo |\n| Enterprise | Custom | Unlimited | Custom | Contact |\n\nThe Hobby tier is free but limited to personal, non-commercial use.\n\n## Method 1: Git Integration (Recommended)\n\n### Step 1: Connect Repository\n\n1. Log in to [Vercel](https://vercel.com)\n2. Click **Add New** \u003e **Project**\n3. Import your Git repository\n4. Authorize Vercel to access your repo\n\n### Step 2: Configure Build Settings\n\nSet these options:\n\n| Setting | Value |\n|---------|-------|\n| Framework Preset | Other |\n| Build Command | See below |\n| Output Directory | `public` |\n| Install Command | `echo \"No npm dependencies\"` |\n\n**Build Command:**\n```bash\ncurl -sSL https://go.dev/dl/go1.22.0.linux-amd64.tar.gz | tar -xzf - \u0026\u0026 ./go/bin/go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026\u0026 ~/go/bin/markata-go build --clean\n```\n\n### Step 3: Set Environment Variables\n\nAdd these environment variables:\n\n| Key | Value |\n|-----|-------|\n| `MARKATA_GO_URL` | `https://your-project.vercel.app` |\n\n### Step 4: Deploy\n\nClick **Deploy**. Vercel will build and deploy your site.\n\n## Method 2: vercel.json Configuration\n\nCreate `vercel.json` in your repository root for more control:\n\n```json\n{\n  \"buildCommand\": \"curl -sSL https://go.dev/dl/go1.22.0.linux-amd64.tar.gz | tar -xzf - \u0026\u0026 ./go/bin/go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026\u0026 ~/go/bin/markata-go build --clean\",\n  \"outputDirectory\": \"public\",\n  \"installCommand\": \"echo 'No npm dependencies'\",\n  \"framework\": null,\n  \"headers\": [\n    {\n      \"source\": \"/static/(.*)\",\n      \"headers\": [\n        {\n          \"key\": \"Cache-Control\",\n          \"value\": \"public, max-age=31536000, immutable\"\n        }\n      ]\n    },\n    {\n      \"source\": \"/(.*).html\",\n      \"headers\": [\n        {\n          \"key\": \"Cache-Control\",\n          \"value\": \"public, max-age=0, must-revalidate\"\n        }\n      ]\n    },\n    {\n      \"source\": \"/(.*)\",\n      \"headers\": [\n        {\n          \"key\": \"X-Frame-Options\",\n          \"value\": \"DENY\"\n        },\n        {\n          \"key\": \"X-Content-Type-Options\",\n          \"value\": \"nosniff\"\n        }\n      ]\n    }\n  ],\n  \"redirects\": [\n    {\n      \"source\": \"/old-path/:path*\",\n      \"destination\": \"/new-path/:path*\",\n      \"permanent\": true\n    }\n  ]\n}\n```\n\n## Method 3: CLI Deployment\n\nDeploy manually using the Vercel CLI:\n\n```bash\n# Install CLI\nnpm install -g vercel\n\n# Login\nvercel login\n\n# Build your site locally\nmarkata-go build --clean\n\n# Deploy preview (from public directory)\ncd public \u0026\u0026 vercel\n\n# Deploy to production\ncd public \u0026\u0026 vercel --prod\n```\n\n## Custom Domain Setup\n\n### Step 1: Add Domain\n\n1. Go to your project's **Settings** \u003e **Domains**\n2. Enter your domain (e.g., `example.com`)\n3. Click **Add**\n\n### Step 2: Configure DNS\n\nVercel provides DNS records to add at your registrar:\n\n**For apex domain:**\n```\nType: A\nName: @\nValue: 76.76.21.21\n```\n\n**For www subdomain:**\n```\nType: CNAME\nName: www\nValue: cname.vercel-dns.com\n```\n\n### Step 3: Verify and Enable HTTPS\n\nVercel automatically provisions SSL certificates once DNS is configured. This usually takes a few minutes.\n\n### Step 4: Update Configuration\n\nUpdate your `markata-go.toml`:\n\n```toml\n[markata-go]\nurl = \"https://example.com\"\n```\n\nSet the production environment variable:\n\n```bash\nvercel env add MARKATA_GO_URL production\n# Enter: https://example.com\n```\n\n## Environment Variables\n\nManage environment variables per environment:\n\n```bash\n# Add to production\nvercel env add MARKATA_GO_URL production\n# Value: https://example.com\n\n# Add to preview (for PR deployments)\nvercel env add MARKATA_GO_URL preview\n# Value: (leave empty to use Vercel's preview URL)\n\n# Add to development\nvercel env add MARKATA_GO_URL development\n# Value: http://localhost:8080\n\n# List all variables\nvercel env ls\n\n# Pull variables to local .env\nvercel env pull\n```\n\n## Preview Deployments\n\nVercel automatically creates preview deployments for every push:\n\n- **Production**: `your-project.vercel.app`\n- **Preview**: `your-project-git-branch-username.vercel.app`\n- **PR Preview**: Automatically commented on GitHub PRs\n\n## Edge Functions\n\nAdd edge functions for dynamic functionality:\n\n```javascript\n// api/hello.js\nexport const config = {\n  runtime: 'edge',\n};\n\nexport default function handler(request) {\n  return new Response(JSON.stringify({ message: 'Hello from the Edge!' }), {\n    headers: { 'Content-Type': 'application/json' },\n  });\n}\n```\n\nAccess at `/api/hello`.\n\n## Analytics\n\nEnable Vercel Analytics for performance insights:\n\n1. Go to **Project Settings** \u003e **Analytics**\n2. Click **Enable**\n\nAdd the analytics script to your template:\n\n```html\n\u003cscript defer src=\"/_vercel/insights/script.js\"\u003e\u003c/script\u003e\n```\n\n## Speed Insights\n\nEnable Speed Insights for Core Web Vitals:\n\n1. Go to **Project Settings** \u003e **Speed Insights**\n2. Click **Enable**\n\n## Troubleshooting\n\n### Build Fails: Go Installation Issues\n\nThe build command needs to install Go first. Ensure your build command is correct:\n\n```json\n{\n  \"buildCommand\": \"curl -sSL https://go.dev/dl/go1.22.0.linux-amd64.tar.gz | tar -xzf - \u0026\u0026 ./go/bin/go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026\u0026 ~/go/bin/markata-go build --clean\"\n}\n```\n\n### Build Timeout\n\nHobby tier has a 45-second build limit. Consider:\n\n1. Upgrading to Pro for longer builds\n2. Pre-building locally and deploying the output:\n   ```bash\n   markata-go build --clean\n   cd public \u0026\u0026 vercel --prod\n   ```\n\n### 404 on Page Refresh\n\nVercel handles clean URLs automatically for static sites. Ensure your output directory is correct.\n\n### Environment Variables Not Applied\n\nCheck that variables are set for the correct environment:\n\n```bash\nvercel env ls\n```\n\nProduction, Preview, and Development are separate environments.\n\n### Assets Not Loading\n\nVerify your `MARKATA_GO_URL` matches your deployment URL:\n\n```bash\n# Check current value\nvercel env ls | grep MARKATA_GO_URL\n```\n\n## Performance Optimization\n\n### Enable Compression\n\nVercel automatically compresses responses with gzip and Brotli.\n\n### Configure Caching\n\nIn `vercel.json`:\n\n```json\n{\n  \"headers\": [\n    {\n      \"source\": \"/static/(.*)\",\n      \"headers\": [\n        {\n          \"key\": \"Cache-Control\",\n          \"value\": \"public, max-age=31536000, immutable\"\n        }\n      ]\n    },\n    {\n      \"source\": \"/(.*).xml\",\n      \"headers\": [\n        {\n          \"key\": \"Cache-Control\",\n          \"value\": \"public, max-age=3600\"\n        }\n      ]\n    }\n  ]\n}\n```\n\n### Use Edge Network\n\nVercel's edge network automatically serves your site from the nearest location to each visitor.\n\n## Monorepo Support\n\nFor monorepos, configure the root directory:\n\n```json\n{\n  \"installCommand\": \"echo 'Skip install'\",\n  \"buildCommand\": \"cd packages/my-site \u0026\u0026 curl -sSL ... \u0026\u0026 markata-go build\",\n  \"outputDirectory\": \"packages/my-site/public\"\n}\n```\n\nOr set the **Root Directory** in project settings.\n\n## Next Steps\n\n- [Vercel Docs](https://vercel.com/docs) - Official documentation\n- [Configuration Guide](../configuration/) - Customize your markata-go site\n- [Themes Guide](../themes/) - Change your site's appearance\n",
      "summary": "Step-by-step guide to deploy markata-go sites on Vercel",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "documentation",
        "deployment",
        "vercel"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/deployment/netlify/",
      "url": "https://markata.dev/docs/guides/deployment/netlify/",
      "title": "Deploy to Netlify",
      "content_html": "\u003cp\u003eNetlify offers continuous deployment, serverless functions, form handling, and a powerful CDN. It\u0026rsquo;s excellent for teams and sites that need more than just static hosting.\u003c/p\u003e\n\u003ch2 id=\"prerequisites\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrerequisites\u003c/span\u003e \u003ca href=\"#prerequisites\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eA Netlify account (free tier available)\u003c/li\u003e\n\u003cli\u003eYour markata-go site in a Git repository (GitHub, GitLab, or Bitbucket)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"cost\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCost\u003c/span\u003e \u003ca href=\"#cost\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTier\u003c/th\u003e\n\u003cth\u003eBandwidth\u003c/th\u003e\n\u003cth\u003eBuild Minutes\u003c/th\u003e\n\u003cth\u003eForms\u003c/th\u003e\n\u003cth\u003ePrice\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eFree\u003c/td\u003e\n\u003ctd\u003e100 GB/mo\u003c/td\u003e\n\u003ctd\u003e300 min/mo\u003c/td\u003e\n\u003ctd\u003e100/mo\u003c/td\u003e\n\u003ctd\u003e$0\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePro\u003c/td\u003e\n\u003ctd\u003e1 TB/mo\u003c/td\u003e\n\u003ctd\u003e25,000 min/mo\u003c/td\u003e\n\u003ctd\u003eUnlimited\u003c/td\u003e\n\u003ctd\u003e$19/mo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBusiness\u003c/td\u003e\n\u003ctd\u003e1 TB/mo\u003c/td\u003e\n\u003ctd\u003e25,000 min/mo\u003c/td\u003e\n\u003ctd\u003eUnlimited\u003c/td\u003e\n\u003ctd\u003e$99/mo\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe free tier is generous enough for most personal and small business sites.\u003c/p\u003e\n\u003ch2 id=\"method-1-git-integration-recommended\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMethod 1: Git Integration (Recommended)\u003c/span\u003e \u003ca href=\"#method-1-git-integration-recommended\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"step-1-connect-repository\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 1: Connect Repository\u003c/span\u003e \u003ca href=\"#step-1-connect-repository\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eLog in to \u003ca href=\"https://app.netlify.com\"\u003eNetlify\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eAdd new site\u003c/strong\u003e \u0026gt; \u003cstrong\u003eImport an existing project\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eChoose your Git provider and authorize Netlify\u003c/li\u003e\n\u003cli\u003eSelect your repository\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"step-2-configure-build-settings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 2: Configure Build Settings\u003c/span\u003e \u003ca href=\"#step-2-configure-build-settings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnter these settings:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSetting\u003c/th\u003e\n\u003cth\u003eValue\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eBase directory\u003c/td\u003e\n\u003ctd\u003e(leave empty)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuild command\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ego install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026amp;\u0026amp; markata-go build --clean\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePublish directory\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epublic\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"step-3-set-environment-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 3: Set Environment Variables\u003c/span\u003e \u003ca href=\"#step-3-set-environment-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eClick \u003cstrong\u003eAdvanced\u003c/strong\u003e and add:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eKey\u003c/th\u003e\n\u003cth\u003eValue\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eGO_VERSION\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e1.22\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_URL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehttps://your-site.netlify.app\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"step-4-deploy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 4: Deploy\u003c/span\u003e \u003ca href=\"#step-4-deploy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eClick \u003cstrong\u003eDeploy site\u003c/strong\u003e. Netlify will build and deploy your site automatically.\u003c/p\u003e\n\u003ch2 id=\"method-2-netlify-toml-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMethod 2: netlify.toml Configuration\u003c/span\u003e \u003ca href=\"#method-2-netlify-toml-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor more control, create \u003ccode\u003enetlify.toml\u003c/code\u003e in your repository root:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003ecommand\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026amp;\u0026amp; markata-go build --clean\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003epublish\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eGO_VERSION\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1.22\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eMARKATA_GO_URL\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://your-site.netlify.app\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Production context\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eproduction\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eenvironment\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eMARKATA_GO_URL\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Deploy previews (automatic for PRs)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edeploy-preview\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003ecommand\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026amp;\u0026amp; markata-go build\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Branch deploys\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebranch-deploy\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003ecommand\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026amp;\u0026amp; markata-go build\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Security and caching headers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/*\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eX-Frame-Options\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;DENY\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eX-Content-Type-Options\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;nosniff\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eReferrer-Policy\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;strict-origin-when-cross-origin\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/static/*\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eCache-Control\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public, max-age=31536000, immutable\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/*.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eCache-Control\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public, max-age=0, must-revalidate\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Redirects\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eredirects\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003efrom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/old-path/*\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eto\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/new-path/:splat\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003estatus\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e301\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"method-3-cli-deployment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMethod 3: CLI Deployment\u003c/span\u003e \u003ca href=\"#method-3-cli-deployment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDeploy manually using the Netlify CLI:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Install CLI\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpm install -g netlify-cli\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Login\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enetlify login\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Initialize project (first time)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enetlify init\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build your site\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Deploy preview\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enetlify deploy --dir\u003cspan class=\"o\"\u003e=\u003c/span\u003epublic\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Deploy to production\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enetlify deploy --dir\u003cspan class=\"o\"\u003e=\u003c/span\u003epublic --prod\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"custom-domain-setup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Domain Setup\u003c/span\u003e \u003ca href=\"#custom-domain-setup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"step-1-add-domain-in-netlify\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 1: Add Domain in Netlify\u003c/span\u003e \u003ca href=\"#step-1-add-domain-in-netlify\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eGo to \u003cstrong\u003eSite settings\u003c/strong\u003e \u0026gt; \u003cstrong\u003eDomain management\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eAdd custom domain\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eEnter your domain (e.g., \u003ccode\u003eexample.com\u003c/code\u003e)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"step-2-configure-dns\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 2: Configure DNS\u003c/span\u003e \u003ca href=\"#step-2-configure-dns\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eOption A: Use Netlify DNS (Recommended)\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eClick \u003cstrong\u003eSet up Netlify DNS\u003c/strong\u003e for your domain\u003c/li\u003e\n\u003cli\u003eUpdate your domain registrar\u0026rsquo;s nameservers to Netlify\u0026rsquo;s:\n\u003cpre\u003e\u003ccode\u003edns1.p01.nsone.net\ndns2.p01.nsone.net\ndns3.p01.nsone.net\ndns4.p01.nsone.net\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eOption B: External DNS\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eAdd these records at your DNS provider:\u003c/p\u003e\n\u003cp\u003eFor apex domain:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eType: A\nName: @\nValue: 75.2.60.5\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eFor www subdomain:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eType: CNAME\nName: www\nValue: your-site.netlify.app\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"step-3-enable-https\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 3: Enable HTTPS\u003c/span\u003e \u003ca href=\"#step-3-enable-https\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eNetlify automatically provisions Let\u0026rsquo;s Encrypt certificates. Go to \u003cstrong\u003eDomain management\u003c/strong\u003e \u0026gt; \u003cstrong\u003eHTTPS\u003c/strong\u003e and click \u003cstrong\u003eVerify DNS configuration\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"step-4-update-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 4: Update Configuration\u003c/span\u003e \u003ca href=\"#step-4-update-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUpdate your \u003ccode\u003emarkata-go.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAnd your \u003ccode\u003enetlify.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eproduction\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eMARKATA_GO_URL\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"deploy-previews\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeploy Previews\u003c/span\u003e \u003ca href=\"#deploy-previews\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNetlify automatically creates preview deployments for pull requests. Each PR gets a unique URL like:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ehttps://deploy-preview-123--your-site.netlify.app\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eTo customize preview behavior, add to \u003ccode\u003enetlify.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edeploy-preview\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003ecommand\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026amp;\u0026amp; markata-go build\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edeploy-preview\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c\"\u003e# Leave MARKATA_GO_URL empty to use Netlify\u0026#39;s preview URL\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"forms-no-backend-required\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eForms (No Backend Required)\u003c/span\u003e \u003ca href=\"#forms-no-backend-required\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNetlify can handle form submissions without a backend:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eform\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;contact\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003emethod\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;POST\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003edata-netlify\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003einput\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hidden\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;form-name\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003evalue\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;contact\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003einput\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erequired\u003c/span\u003e \u003cspan class=\"p\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003einput\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;email\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;email\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erequired\u003c/span\u003e \u003cspan class=\"p\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etextarea\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;message\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erequired\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etextarea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ebutton\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;submit\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eSend\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ebutton\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eform\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eForm submissions appear in \u003cstrong\u003eSite settings\u003c/strong\u003e \u0026gt; \u003cstrong\u003eForms\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"serverless-functions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eServerless Functions\u003c/span\u003e \u003ca href=\"#serverless-functions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd serverless functions in \u003ccode\u003enetlify/functions/\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// netlify/functions/hello.js\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexports\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehandler\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kr\"\u003easync\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003estatusCode\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e200\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003ebody\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003eJSON\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estringify\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e \u003cspan class=\"nx\"\u003emessage\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Hello from Netlify Functions!\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAccess at \u003ccode\u003e/.netlify/functions/hello\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"build-fails-go-not-found\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Fails: Go Not Found\u003c/span\u003e \u003ca href=\"#build-fails-go-not-found\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnsure \u003ccode\u003eGO_VERSION\u003c/code\u003e is set in environment variables:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eGO_VERSION\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1.22\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"build-timeout\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Timeout\u003c/span\u003e \u003ca href=\"#build-timeout\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFree tier has a 15-minute build limit. Optimize your build:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003ecommand\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    if [ ! -f $HOME/go/bin/markata-go ]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e      go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    fi\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    markata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e  \u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"assets-not-loading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAssets Not Loading\u003c/span\u003e \u003ca href=\"#assets-not-loading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCheck your site URL configuration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# View current config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enetlify env:list\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Set production URL\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enetlify env:set MARKATA_GO_URL https://example.com\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"deploy-preview-url-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeploy Preview URL Issues\u003c/span\u003e \u003ca href=\"#deploy-preview-url-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor deploy previews, let Netlify handle the URL:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edeploy-preview\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c\"\u003e# Don\u0026#39;t set MARKATA_GO_URL - let Netlify use the preview URL\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"custom-headers-not-applied\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Headers Not Applied\u003c/span\u003e \u003ca href=\"#custom-headers-not-applied\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnsure \u003ccode\u003enetlify.toml\u003c/code\u003e is in your repository root (not in a subdirectory).\u003c/p\u003e\n\u003ch2 id=\"performance-optimization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePerformance Optimization\u003c/span\u003e \u003ca href=\"#performance-optimization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"enable-asset-optimization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnable Asset Optimization\u003c/span\u003e \u003ca href=\"#enable-asset-optimization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIn \u003cstrong\u003eSite settings\u003c/strong\u003e \u0026gt; \u003cstrong\u003eBuild \u0026amp; deploy\u003c/strong\u003e \u0026gt; \u003cstrong\u003ePost processing\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEnable \u003cstrong\u003ePretty URLs\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eEnable \u003cstrong\u003eAsset optimization\u003c/strong\u003e (minify CSS/JS)\u003c/li\u003e\n\u003cli\u003eEnable \u003cstrong\u003ePrerendering\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"configure-caching\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfigure Caching\u003c/span\u003e \u003ca href=\"#configure-caching\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/static/*\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eCache-Control\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public, max-age=31536000, immutable\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/*.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eCache-Control\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public, max-age=3600\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext Steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.netlify.com/\"\u003eNetlify Docs\u003c/a\u003e - Official documentation\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"../configuration/\"\u003eConfiguration Guide\u003c/a\u003e - Customize your markata-go site\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"../feeds/\"\u003eFeeds Guide\u003c/a\u003e - Set up RSS and Atom feeds\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nNetlify offers continuous deployment, serverless functions, form handling, and a powerful CDN. It's excellent for teams and sites that need more than just static hosting.\n\n## Prerequisites\n\n- A Netlify account (free tier available)\n- Your markata-go site in a Git repository (GitHub, GitLab, or Bitbucket)\n\n## Cost\n\n| Tier | Bandwidth | Build Minutes | Forms | Price |\n|------|-----------|---------------|-------|-------|\n| Free | 100 GB/mo | 300 min/mo | 100/mo | $0 |\n| Pro | 1 TB/mo | 25,000 min/mo | Unlimited | $19/mo |\n| Business | 1 TB/mo | 25,000 min/mo | Unlimited | $99/mo |\n\nThe free tier is generous enough for most personal and small business sites.\n\n## Method 1: Git Integration (Recommended)\n\n### Step 1: Connect Repository\n\n1. Log in to [Netlify](https://app.netlify.com)\n2. Click **Add new site** \u003e **Import an existing project**\n3. Choose your Git provider and authorize Netlify\n4. Select your repository\n\n### Step 2: Configure Build Settings\n\nEnter these settings:\n\n| Setting | Value |\n|---------|-------|\n| Base directory | (leave empty) |\n| Build command | `go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026\u0026 markata-go build --clean` |\n| Publish directory | `public` |\n\n### Step 3: Set Environment Variables\n\nClick **Advanced** and add:\n\n| Key | Value |\n|-----|-------|\n| `GO_VERSION` | `1.22` |\n| `MARKATA_GO_URL` | `https://your-site.netlify.app` |\n\n### Step 4: Deploy\n\nClick **Deploy site**. Netlify will build and deploy your site automatically.\n\n## Method 2: netlify.toml Configuration\n\nFor more control, create `netlify.toml` in your repository root:\n\n```toml\n[build]\n  command = \"go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026\u0026 markata-go build --clean\"\n  publish = \"public\"\n\n[build.environment]\n  GO_VERSION = \"1.22\"\n  MARKATA_GO_URL = \"https://your-site.netlify.app\"\n\n# Production context\n[context.production]\n  environment = { MARKATA_GO_URL = \"https://example.com\" }\n\n# Deploy previews (automatic for PRs)\n[context.deploy-preview]\n  command = \"go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026\u0026 markata-go build\"\n\n# Branch deploys\n[context.branch-deploy]\n  command = \"go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026\u0026 markata-go build\"\n\n# Security and caching headers\n[[headers]]\n  for = \"/*\"\n  [headers.values]\n    X-Frame-Options = \"DENY\"\n    X-Content-Type-Options = \"nosniff\"\n    Referrer-Policy = \"strict-origin-when-cross-origin\"\n\n[[headers]]\n  for = \"/static/*\"\n  [headers.values]\n    Cache-Control = \"public, max-age=31536000, immutable\"\n\n[[headers]]\n  for = \"/*.html\"\n  [headers.values]\n    Cache-Control = \"public, max-age=0, must-revalidate\"\n\n# Redirects\n[[redirects]]\n  from = \"/old-path/*\"\n  to = \"/new-path/:splat\"\n  status = 301\n```\n\n## Method 3: CLI Deployment\n\nDeploy manually using the Netlify CLI:\n\n```bash\n# Install CLI\nnpm install -g netlify-cli\n\n# Login\nnetlify login\n\n# Initialize project (first time)\nnetlify init\n\n# Build your site\nmarkata-go build --clean\n\n# Deploy preview\nnetlify deploy --dir=public\n\n# Deploy to production\nnetlify deploy --dir=public --prod\n```\n\n## Custom Domain Setup\n\n### Step 1: Add Domain in Netlify\n\n1. Go to **Site settings** \u003e **Domain management**\n2. Click **Add custom domain**\n3. Enter your domain (e.g., `example.com`)\n\n### Step 2: Configure DNS\n\n**Option A: Use Netlify DNS (Recommended)**\n\n1. Click **Set up Netlify DNS** for your domain\n2. Update your domain registrar's nameservers to Netlify's:\n   ```\n   dns1.p01.nsone.net\n   dns2.p01.nsone.net\n   dns3.p01.nsone.net\n   dns4.p01.nsone.net\n   ```\n\n**Option B: External DNS**\n\nAdd these records at your DNS provider:\n\nFor apex domain:\n```\nType: A\nName: @\nValue: 75.2.60.5\n```\n\nFor www subdomain:\n```\nType: CNAME\nName: www\nValue: your-site.netlify.app\n```\n\n### Step 3: Enable HTTPS\n\nNetlify automatically provisions Let's Encrypt certificates. Go to **Domain management** \u003e **HTTPS** and click **Verify DNS configuration**.\n\n### Step 4: Update Configuration\n\nUpdate your `markata-go.toml`:\n\n```toml\n[markata-go]\nurl = \"https://example.com\"\n```\n\nAnd your `netlify.toml`:\n\n```toml\n[context.production.environment]\n  MARKATA_GO_URL = \"https://example.com\"\n```\n\n## Deploy Previews\n\nNetlify automatically creates preview deployments for pull requests. Each PR gets a unique URL like:\n\n```\nhttps://deploy-preview-123--your-site.netlify.app\n```\n\nTo customize preview behavior, add to `netlify.toml`:\n\n```toml\n[context.deploy-preview]\n  command = \"go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026\u0026 markata-go build\"\n  \n[context.deploy-preview.environment]\n  # Leave MARKATA_GO_URL empty to use Netlify's preview URL\n```\n\n## Forms (No Backend Required)\n\nNetlify can handle form submissions without a backend:\n\n```html\n\u003cform name=\"contact\" method=\"POST\" data-netlify=\"true\"\u003e\n  \u003cinput type=\"hidden\" name=\"form-name\" value=\"contact\" /\u003e\n  \u003cinput type=\"text\" name=\"name\" required /\u003e\n  \u003cinput type=\"email\" name=\"email\" required /\u003e\n  \u003ctextarea name=\"message\" required\u003e\u003c/textarea\u003e\n  \u003cbutton type=\"submit\"\u003eSend\u003c/button\u003e\n\u003c/form\u003e\n```\n\nForm submissions appear in **Site settings** \u003e **Forms**.\n\n## Serverless Functions\n\nAdd serverless functions in `netlify/functions/`:\n\n```javascript\n// netlify/functions/hello.js\nexports.handler = async (event, context) =\u003e {\n  return {\n    statusCode: 200,\n    body: JSON.stringify({ message: \"Hello from Netlify Functions!\" })\n  };\n};\n```\n\nAccess at `/.netlify/functions/hello`.\n\n## Troubleshooting\n\n### Build Fails: Go Not Found\n\nEnsure `GO_VERSION` is set in environment variables:\n\n```toml\n[build.environment]\n  GO_VERSION = \"1.22\"\n```\n\n### Build Timeout\n\nFree tier has a 15-minute build limit. Optimize your build:\n\n```toml\n[build]\n  command = \"\"\"\n    if [ ! -f $HOME/go/bin/markata-go ]; then\n      go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n    fi\n    markata-go build --clean\n  \"\"\"\n```\n\n### Assets Not Loading\n\nCheck your site URL configuration:\n\n```bash\n# View current config\nnetlify env:list\n\n# Set production URL\nnetlify env:set MARKATA_GO_URL https://example.com\n```\n\n### Deploy Preview URL Issues\n\nFor deploy previews, let Netlify handle the URL:\n\n```toml\n[context.deploy-preview.environment]\n  # Don't set MARKATA_GO_URL - let Netlify use the preview URL\n```\n\n### Custom Headers Not Applied\n\nEnsure `netlify.toml` is in your repository root (not in a subdirectory).\n\n## Performance Optimization\n\n### Enable Asset Optimization\n\nIn **Site settings** \u003e **Build \u0026 deploy** \u003e **Post processing**:\n\n- Enable **Pretty URLs**\n- Enable **Asset optimization** (minify CSS/JS)\n- Enable **Prerendering**\n\n### Configure Caching\n\n```toml\n[[headers]]\n  for = \"/static/*\"\n  [headers.values]\n    Cache-Control = \"public, max-age=31536000, immutable\"\n\n[[headers]]\n  for = \"/*.xml\"\n  [headers.values]\n    Cache-Control = \"public, max-age=3600\"\n```\n\n## Next Steps\n\n- [Netlify Docs](https://docs.netlify.com/) - Official documentation\n- [Configuration Guide](../configuration/) - Customize your markata-go site\n- [Feeds Guide](../feeds/) - Set up RSS and Atom feeds\n",
      "summary": "Step-by-step guide to deploy markata-go sites on Netlify",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "documentation",
        "deployment",
        "netlify"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/deployment/",
      "url": "https://markata.dev/docs/guides/deployment/",
      "title": "Deployment Guide",
      "content_html": "\u003cp\u003emarkata-go generates static sites that can be deployed anywhere that serves HTML files. This guide helps you choose the best platform for your needs.\u003c/p\u003e\n\u003ch2 id=\"platform-comparison\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlatform Comparison\u003c/span\u003e \u003ca href=\"#platform-comparison\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePlatform\u003c/th\u003e\n\u003cth\u003eFree Tier\u003c/th\u003e\n\u003cth\u003eCustom Domain\u003c/th\u003e\n\u003cth\u003eBuild Time\u003c/th\u003e\n\u003cth\u003eBest For\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"./github-pages/\"\u003eGitHub Pages\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eUnlimited\u003c/td\u003e\n\u003ctd\u003eYes (HTTPS)\u003c/td\u003e\n\u003ctd\u003e~2 min\u003c/td\u003e\n\u003ctd\u003eOpen source projects\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"./netlify/\"\u003eNetlify\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e100 GB/mo\u003c/td\u003e\n\u003ctd\u003eYes (HTTPS)\u003c/td\u003e\n\u003ctd\u003e~1 min\u003c/td\u003e\n\u003ctd\u003eTeams, forms, functions\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"./vercel/\"\u003eVercel\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e100 GB/mo\u003c/td\u003e\n\u003ctd\u003eYes (HTTPS)\u003c/td\u003e\n\u003ctd\u003e~1 min\u003c/td\u003e\n\u003ctd\u003ePerformance, edge\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"./cloudflare-pages/\"\u003eCloudflare Pages\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eUnlimited\u003c/td\u003e\n\u003ctd\u003eYes (HTTPS)\u003c/td\u003e\n\u003ctd\u003e~2 min\u003c/td\u003e\n\u003ctd\u003eGlobal CDN, Workers\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"./aws-s3/\"\u003eAWS S3\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e5 GB (12 mo)\u003c/td\u003e\n\u003ctd\u003eYes (via CF)\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eEnterprise, AWS stack\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"./docker/\"\u003eDocker\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eN/A\u003c/td\u003e\n\u003ctd\u003eSelf-managed\u003c/td\u003e\n\u003ctd\u003e~30 sec\u003c/td\u003e\n\u003ctd\u003eSelf-hosted, control\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKubernetes Helm\u003c/td\u003e\n\u003ctd\u003eN/A\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eCluster-dependent\u003c/td\u003e\n\u003ctd\u003eHomelabs, ArgoCD, in-cluster builds\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"quick-decision-guide\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Decision Guide\u003c/span\u003e \u003ca href=\"#quick-decision-guide\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eChoose GitHub Pages if:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYour code is on GitHub\u003c/li\u003e\n\u003cli\u003eYou want zero configuration\u003c/li\u003e\n\u003cli\u003eYou don\u0026rsquo;t need server-side features\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eChoose Netlify if:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou need forms, functions, or split testing\u003c/li\u003e\n\u003cli\u003eYou want automatic deploy previews\u003c/li\u003e\n\u003cli\u003eYou\u0026rsquo;re working with a team\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eChoose Vercel if:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePerformance is your top priority\u003c/li\u003e\n\u003cli\u003eYou want edge functions\u003c/li\u003e\n\u003cli\u003eYou need analytics\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eChoose Cloudflare Pages if:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou want unlimited bandwidth\u003c/li\u003e\n\u003cli\u003eYou need Workers integration\u003c/li\u003e\n\u003cli\u003eGlobal performance matters\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eChoose AWS S3 if:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou\u0026rsquo;re already in the AWS ecosystem\u003c/li\u003e\n\u003cli\u003eYou need fine-grained access control\u003c/li\u003e\n\u003cli\u003eEnterprise compliance is required\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eChoose Docker if:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou want full control\u003c/li\u003e\n\u003cli\u003eYou\u0026rsquo;re self-hosting other services\u003c/li\u003e\n\u003cli\u003eYou need offline capabilities\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eChoose Kubernetes Helm if:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou already deploy with ArgoCD or Helm\u003c/li\u003e\n\u003cli\u003eYou want in-cluster builds from a source archive\u003c/li\u003e\n\u003cli\u003eYou want same-origin \u003ccode\u003e/api/search\u003c/code\u003e served with the site\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"building-for-production\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuilding for Production\u003c/span\u003e \u003ca href=\"#building-for-production\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBefore deploying to any platform, build your site:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Standard production build\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build with custom URL\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com markata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Verbose build for debugging\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"output-structure\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOutput Structure\u003c/span\u003e \u003ca href=\"#output-structure\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAfter building, your \u003ccode\u003epublic/\u003c/code\u003e directory contains:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epublic/\n├── index.html              # Home page\n├── blog/\n│   ├── index.html          # Blog listing\n│   ├── rss.xml             # RSS feed\n│   └── atom.xml            # Atom feed\n├── posts/\n│   └── my-post/\n│       └── index.html      # Individual post\n├── static/                 # Assets (CSS, JS, images)\n└── sitemap.xml\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"environment-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment Variables\u003c/span\u003e \u003ca href=\"#environment-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAll platforms support these environment variables:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003ePurpose\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_URL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBase URL for links and feeds\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehttps://example.com\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_OUTPUT\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOutput directory\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epublic\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext Steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eChoose a platform guide to get started:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"./github-pages/\"\u003eGitHub Pages\u003c/a\u003e - Free hosting for GitHub repos\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"./netlify/\"\u003eNetlify\u003c/a\u003e - Feature-rich with generous free tier\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"./vercel/\"\u003eVercel\u003c/a\u003e - Performance-focused deployment\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"./cloudflare-pages/\"\u003eCloudflare Pages\u003c/a\u003e - Unlimited bandwidth\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"./aws-s3/\"\u003eAWS S3\u003c/a\u003e - Enterprise-grade static hosting\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"./docker/\"\u003eDocker\u003c/a\u003e - Self-hosted containers\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFor Kubernetes and source-archive deployments, see the chart README under \u003ccode\u003ehelm-chart/README.md\u003c/code\u003e in the markata-go repository.\u003c/p\u003e\n\u003cp\u003eFor self-hosting on your own servers, see the \u003ca href=\"../self-hosting/\"\u003eSelf-Hosting Guide\u003c/a\u003e.\u003c/p\u003e\n",
      "content_text": "\n\nmarkata-go generates static sites that can be deployed anywhere that serves HTML files. This guide helps you choose the best platform for your needs.\n\n## Platform Comparison\n\n| Platform | Free Tier | Custom Domain | Build Time | Best For |\n|----------|-----------|---------------|------------|----------|\n| [GitHub Pages](./github-pages/) | Unlimited | Yes (HTTPS) | ~2 min | Open source projects |\n| [Netlify](./netlify/) | 100 GB/mo | Yes (HTTPS) | ~1 min | Teams, forms, functions |\n| [Vercel](./vercel/) | 100 GB/mo | Yes (HTTPS) | ~1 min | Performance, edge |\n| [Cloudflare Pages](./cloudflare-pages/) | Unlimited | Yes (HTTPS) | ~2 min | Global CDN, Workers |\n| [AWS S3](./aws-s3/) | 5 GB (12 mo) | Yes (via CF) | Manual | Enterprise, AWS stack |\n| [Docker](./docker/) | N/A | Self-managed | ~30 sec | Self-hosted, control |\n| Kubernetes Helm | N/A | Yes | Cluster-dependent | Homelabs, ArgoCD, in-cluster builds |\n\n## Quick Decision Guide\n\n**Choose GitHub Pages if:**\n- Your code is on GitHub\n- You want zero configuration\n- You don't need server-side features\n\n**Choose Netlify if:**\n- You need forms, functions, or split testing\n- You want automatic deploy previews\n- You're working with a team\n\n**Choose Vercel if:**\n- Performance is your top priority\n- You want edge functions\n- You need analytics\n\n**Choose Cloudflare Pages if:**\n- You want unlimited bandwidth\n- You need Workers integration\n- Global performance matters\n\n**Choose AWS S3 if:**\n- You're already in the AWS ecosystem\n- You need fine-grained access control\n- Enterprise compliance is required\n\n**Choose Docker if:**\n- You want full control\n- You're self-hosting other services\n- You need offline capabilities\n\n**Choose Kubernetes Helm if:**\n- You already deploy with ArgoCD or Helm\n- You want in-cluster builds from a source archive\n- You want same-origin `/api/search` served with the site\n\n## Building for Production\n\nBefore deploying to any platform, build your site:\n\n```bash\n# Standard production build\nmarkata-go build --clean\n\n# Build with custom URL\nMARKATA_GO_URL=https://example.com markata-go build --clean\n\n# Verbose build for debugging\nmarkata-go build --clean -v\n```\n\n### Output Structure\n\nAfter building, your `public/` directory contains:\n\n```\npublic/\n├── index.html              # Home page\n├── blog/\n│   ├── index.html          # Blog listing\n│   ├── rss.xml             # RSS feed\n│   └── atom.xml            # Atom feed\n├── posts/\n│   └── my-post/\n│       └── index.html      # Individual post\n├── static/                 # Assets (CSS, JS, images)\n└── sitemap.xml\n```\n\n## Environment Variables\n\nAll platforms support these environment variables:\n\n| Variable | Purpose | Example |\n|----------|---------|---------|\n| `MARKATA_GO_URL` | Base URL for links and feeds | `https://example.com` |\n| `MARKATA_GO_OUTPUT` | Output directory | `public` |\n\n## Next Steps\n\nChoose a platform guide to get started:\n\n- [GitHub Pages](./github-pages/) - Free hosting for GitHub repos\n- [Netlify](./netlify/) - Feature-rich with generous free tier\n- [Vercel](./vercel/) - Performance-focused deployment\n- [Cloudflare Pages](./cloudflare-pages/) - Unlimited bandwidth\n- [AWS S3](./aws-s3/) - Enterprise-grade static hosting\n- [Docker](./docker/) - Self-hosted containers\n\nFor Kubernetes and source-archive deployments, see the chart README under `helm-chart/README.md` in the markata-go repository.\n\nFor self-hosting on your own servers, see the [Self-Hosting Guide](../self-hosting/).\n",
      "summary": "Choose the best platform to deploy your markata-go static site",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "documentation",
        "deployment",
        "hosting"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/deployment/github-pages/",
      "url": "https://markata.dev/docs/guides/deployment/github-pages/",
      "title": "Deploy to GitHub Pages",
      "content_html": "\u003cp\u003eGitHub Pages provides free hosting for static sites directly from a GitHub repository. It\u0026rsquo;s the easiest way to deploy if your code is already on GitHub.\u003c/p\u003e\n\u003ch2 id=\"prerequisites\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrerequisites\u003c/span\u003e \u003ca href=\"#prerequisites\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eA GitHub account\u003c/li\u003e\n\u003cli\u003eYour markata-go site in a GitHub repository\u003c/li\u003e\n\u003cli\u003eGit installed locally\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"cost\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCost\u003c/span\u003e \u003ca href=\"#cost\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTier\u003c/th\u003e\n\u003cth\u003eStorage\u003c/th\u003e\n\u003cth\u003eBandwidth\u003c/th\u003e\n\u003cth\u003eCustom Domain\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eFree\u003c/td\u003e\n\u003ctd\u003e1 GB\u003c/td\u003e\n\u003ctd\u003e100 GB/mo\u003c/td\u003e\n\u003ctd\u003eYes (HTTPS)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eGitHub Pages is completely free for public repositories. Private repositories require GitHub Pro ($4/mo) or a paid organization plan.\u003c/p\u003e\n\u003ch2 id=\"method-1-github-actions-recommended\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMethod 1: GitHub Actions (Recommended)\u003c/span\u003e \u003ca href=\"#method-1-github-actions-recommended\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis method automatically builds and deploys your site on every push to \u003ccode\u003emain\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"step-1-create-the-workflow\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 1: Create the Workflow\u003c/span\u003e \u003ca href=\"#step-1-create-the-workflow\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003e.github/workflows/deploy.yml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy to GitHub Pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eworkflow_dispatch\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epermissions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eread\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eid-token\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003econcurrency\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003egroup\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pages\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecancel-in-progress\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCheckout\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-go@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ego-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1.22\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ego install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eUpload artifact\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/upload-pages-artifact@v3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e./public\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edeploy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub-pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ steps.deployment.outputs.page_url }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy to GitHub Pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeployment\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/deploy-pages@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"step-2-configure-repository-settings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 2: Configure Repository Settings\u003c/span\u003e \u003ca href=\"#step-2-configure-repository-settings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eGo to your repository on GitHub\u003c/li\u003e\n\u003cli\u003eNavigate to \u003cstrong\u003eSettings\u003c/strong\u003e \u0026gt; \u003cstrong\u003ePages\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eUnder \u003cstrong\u003eSource\u003c/strong\u003e, select \u003cstrong\u003eGitHub Actions\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003ePush your changes to trigger the workflow\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"step-3-access-your-site\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 3: Access Your Site\u003c/span\u003e \u003ca href=\"#step-3-access-your-site\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAfter the workflow completes, your site will be available at:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ehttps://\u0026lt;username\u0026gt;.github.io/\u0026lt;repository-name\u0026gt;/\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"method-2-manual-deployment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMethod 2: Manual Deployment\u003c/span\u003e \u003ca href=\"#method-2-manual-deployment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor more control or if you can\u0026rsquo;t use GitHub Actions.\u003c/p\u003e\n\u003ch3 id=\"step-1-build-locally\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 1: Build Locally\u003c/span\u003e \u003ca href=\"#step-1-build-locally\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Set the URL for your GitHub Pages site\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://username.github.io/repo-name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build the site\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"step-2-deploy-to-gh-pages-branch\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 2: Deploy to gh-pages Branch\u003c/span\u003e \u003ca href=\"#step-2-deploy-to-gh-pages-branch\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Navigate to output directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e public\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Initialize git and push to gh-pages branch\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit init\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit add -A\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit commit -m \u003cspan class=\"s2\"\u003e\u0026#34;Deploy site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit push -f git@github.com:username/repo-name.git main:gh-pages\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr use the \u003ccode\u003egh-pages\u003c/code\u003e npm package:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpm install -g gh-pages\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egh-pages -d public\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"step-3-configure-repository\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 3: Configure Repository\u003c/span\u003e \u003ca href=\"#step-3-configure-repository\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eGo to \u003cstrong\u003eSettings\u003c/strong\u003e \u0026gt; \u003cstrong\u003ePages\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eUnder \u003cstrong\u003eSource\u003c/strong\u003e, select \u003cstrong\u003eDeploy from a branch\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eSelect the \u003ccode\u003egh-pages\u003c/code\u003e branch and \u003ccode\u003e/ (root)\u003c/code\u003e folder\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eSave\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"custom-domain-setup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Domain Setup\u003c/span\u003e \u003ca href=\"#custom-domain-setup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"step-1-add-cname-file\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 1: Add CNAME File\u003c/span\u003e \u003ca href=\"#step-1-add-cname-file\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003estatic/CNAME\u003c/code\u003e (no extension) with your domain:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eexample.com\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis file will be copied to \u003ccode\u003epublic/CNAME\u003c/code\u003e during build.\u003c/p\u003e\n\u003ch3 id=\"step-2-update-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 2: Update Configuration\u003c/span\u003e \u003ca href=\"#step-2-update-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIn your \u003ccode\u003emarkata-go.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"step-3-configure-dns\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 3: Configure DNS\u003c/span\u003e \u003ca href=\"#step-3-configure-dns\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eFor apex domain (example.com):\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eAdd these A records pointing to GitHub\u0026rsquo;s servers:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e185.199.108.153\n185.199.109.153\n185.199.110.153\n185.199.111.153\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eFor subdomain (\u003ca href=\"http://www.example.com\"\u003ewww.example.com\u003c/a\u003e or blog.example.com):\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eAdd a CNAME record:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eType: CNAME\nName: www (or blog)\nValue: username.github.io\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"step-4-enable-https\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 4: Enable HTTPS\u003c/span\u003e \u003ca href=\"#step-4-enable-https\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eGo to \u003cstrong\u003eSettings\u003c/strong\u003e \u0026gt; \u003cstrong\u003ePages\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eUnder \u003cstrong\u003eCustom domain\u003c/strong\u003e, enter your domain\u003c/li\u003e\n\u003cli\u003eCheck \u003cstrong\u003eEnforce HTTPS\u003c/strong\u003e (may take up to 24 hours)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"build-fails-command-not-found-markata-go\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Fails: “command not found: markata-go”\u003c/span\u003e \u003ca href=\"#build-fails-command-not-found-markata-go\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnsure Go is set up correctly in your workflow:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-go@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ego-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1.22\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    echo \u0026#34;$(go env GOPATH)/bin\u0026#34; \u0026gt;\u0026gt; $GITHUB_PATH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"404-errors-on-subpages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e404 Errors on Subpages\u003c/span\u003e \u003ca href=\"#404-errors-on-subpages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eMake sure your site URL matches the GitHub Pages URL:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# For project sites (username.github.io/repo-name)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://username.github.io/repo-name markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# For user sites (username.github.io)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://username.github.io markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"css-js-not-loading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCSS/JS Not Loading\u003c/span\u003e \u003ca href=\"#css-js-not-loading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCheck that asset paths are relative or use the correct base URL. The workflow above sets \u003ccode\u003eMARKATA_GO_URL\u003c/code\u003e automatically.\u003c/p\u003e\n\u003ch3 id=\"custom-domain-not-working\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Domain Not Working\u003c/span\u003e \u003ca href=\"#custom-domain-not-working\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eVerify DNS propagation: \u003ccode\u003edig example.com\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eEnsure CNAME file exists in output\u003c/li\u003e\n\u003cli\u003eWait up to 24 hours for HTTPS certificate\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"workflow-not-triggering\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWorkflow Not Triggering\u003c/span\u003e \u003ca href=\"#workflow-not-triggering\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnsure the workflow file is in the correct location:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e.github/workflows/deploy.yml\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eAnd that you\u0026rsquo;re pushing to the \u003ccode\u003emain\u003c/code\u003e branch (or adjust the workflow trigger).\u003c/p\u003e\n\u003ch2 id=\"advanced-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdvanced Configuration\u003c/span\u003e \u003ca href=\"#advanced-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"caching-for-faster-builds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCaching for Faster Builds\u003c/span\u003e \u003ca href=\"#caching-for-faster-builds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd caching for the markata-go binary:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCache markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/cache@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e~/go/bin/markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go-${{ runner.os }}-v1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    if [ ! -f ~/go/bin/markata-go ]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    fi\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"preview-deployments-for-pull-requests\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePreview Deployments for Pull Requests\u003c/span\u003e \u003ca href=\"#preview-deployments-for-pull-requests\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDeploy preview versions for PRs:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ePreview\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003etypes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003eopened, synchronize]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epreview\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epermissions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003epull-requests\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-go@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ego-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1.22\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          markata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://username.github.io/repo/pr-${{ github.event.number }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy Preview\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epeaceiris/actions-gh-pages@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003egithub_token\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epublish_dir\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e./public\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003edestination_dir\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epr-${{ github.event.number }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eComment PR\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/github-script@v7\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            github.rest.issues.createComment({\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              issue_number: context.issue.number,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              owner: context.repo.owner,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              repo: context.repo.repo,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              body: \u0026#39;Preview: https://username.github.io/repo/pr-${{ github.event.number }}/\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            })\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext Steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site\"\u003eCustom Domain Setup\u003c/a\u003e - GitHub\u0026rsquo;s official docs\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"../configuration/\"\u003eConfiguration Guide\u003c/a\u003e - Customize your markata-go site\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"../themes/\"\u003eThemes Guide\u003c/a\u003e - Change your site\u0026rsquo;s appearance\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nGitHub Pages provides free hosting for static sites directly from a GitHub repository. It's the easiest way to deploy if your code is already on GitHub.\n\n## Prerequisites\n\n- A GitHub account\n- Your markata-go site in a GitHub repository\n- Git installed locally\n\n## Cost\n\n| Tier | Storage | Bandwidth | Custom Domain |\n|------|---------|-----------|---------------|\n| Free | 1 GB | 100 GB/mo | Yes (HTTPS) |\n\nGitHub Pages is completely free for public repositories. Private repositories require GitHub Pro ($4/mo) or a paid organization plan.\n\n## Method 1: GitHub Actions (Recommended)\n\nThis method automatically builds and deploys your site on every push to `main`.\n\n### Step 1: Create the Workflow\n\nCreate `.github/workflows/deploy.yml`:\n\n```yaml\nname: Deploy to GitHub Pages\n\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch:\n\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\nconcurrency:\n  group: \"pages\"\n  cancel-in-progress: false\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Setup Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: '1.22'\n          cache: true\n\n      - name: Install markata-go\n        run: go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\n      - name: Build site\n        run: markata-go build --clean\n        env:\n          MARKATA_GO_URL: https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}\n\n      - name: Upload artifact\n        uses: actions/upload-pages-artifact@v3\n        with:\n          path: ./public\n\n  deploy:\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    runs-on: ubuntu-latest\n    needs: build\n    steps:\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v4\n```\n\n### Step 2: Configure Repository Settings\n\n1. Go to your repository on GitHub\n2. Navigate to **Settings** \u003e **Pages**\n3. Under **Source**, select **GitHub Actions**\n4. Push your changes to trigger the workflow\n\n### Step 3: Access Your Site\n\nAfter the workflow completes, your site will be available at:\n\n```\nhttps://\u003cusername\u003e.github.io/\u003crepository-name\u003e/\n```\n\n## Method 2: Manual Deployment\n\nFor more control or if you can't use GitHub Actions.\n\n### Step 1: Build Locally\n\n```bash\n# Set the URL for your GitHub Pages site\nexport MARKATA_GO_URL=https://username.github.io/repo-name\n\n# Build the site\nmarkata-go build --clean\n```\n\n### Step 2: Deploy to gh-pages Branch\n\n```bash\n# Navigate to output directory\ncd public\n\n# Initialize git and push to gh-pages branch\ngit init\ngit add -A\ngit commit -m \"Deploy site\"\ngit push -f git@github.com:username/repo-name.git main:gh-pages\n```\n\nOr use the `gh-pages` npm package:\n\n```bash\nnpm install -g gh-pages\nmarkata-go build --clean\ngh-pages -d public\n```\n\n### Step 3: Configure Repository\n\n1. Go to **Settings** \u003e **Pages**\n2. Under **Source**, select **Deploy from a branch**\n3. Select the `gh-pages` branch and `/ (root)` folder\n4. Click **Save**\n\n## Custom Domain Setup\n\n### Step 1: Add CNAME File\n\nCreate `static/CNAME` (no extension) with your domain:\n\n```\nexample.com\n```\n\nThis file will be copied to `public/CNAME` during build.\n\n### Step 2: Update Configuration\n\nIn your `markata-go.toml`:\n\n```toml\n[markata-go]\nurl = \"https://example.com\"\n```\n\n### Step 3: Configure DNS\n\n**For apex domain (example.com):**\n\nAdd these A records pointing to GitHub's servers:\n\n```\n185.199.108.153\n185.199.109.153\n185.199.110.153\n185.199.111.153\n```\n\n**For subdomain (www.example.com or blog.example.com):**\n\nAdd a CNAME record:\n\n```\nType: CNAME\nName: www (or blog)\nValue: username.github.io\n```\n\n### Step 4: Enable HTTPS\n\n1. Go to **Settings** \u003e **Pages**\n2. Under **Custom domain**, enter your domain\n3. Check **Enforce HTTPS** (may take up to 24 hours)\n\n## Troubleshooting\n\n### Build Fails: \"command not found: markata-go\"\n\nEnsure Go is set up correctly in your workflow:\n\n```yaml\n- name: Setup Go\n  uses: actions/setup-go@v5\n  with:\n    go-version: '1.22'\n    cache: true\n\n- name: Install markata-go\n  run: |\n    go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n    echo \"$(go env GOPATH)/bin\" \u003e\u003e $GITHUB_PATH\n```\n\n### 404 Errors on Subpages\n\nMake sure your site URL matches the GitHub Pages URL:\n\n```bash\n# For project sites (username.github.io/repo-name)\nMARKATA_GO_URL=https://username.github.io/repo-name markata-go build\n\n# For user sites (username.github.io)\nMARKATA_GO_URL=https://username.github.io markata-go build\n```\n\n### CSS/JS Not Loading\n\nCheck that asset paths are relative or use the correct base URL. The workflow above sets `MARKATA_GO_URL` automatically.\n\n### Custom Domain Not Working\n\n1. Verify DNS propagation: `dig example.com`\n2. Ensure CNAME file exists in output\n3. Wait up to 24 hours for HTTPS certificate\n\n### Workflow Not Triggering\n\nEnsure the workflow file is in the correct location:\n```\n.github/workflows/deploy.yml\n```\n\nAnd that you're pushing to the `main` branch (or adjust the workflow trigger).\n\n## Advanced Configuration\n\n### Caching for Faster Builds\n\nAdd caching for the markata-go binary:\n\n```yaml\n- name: Cache markata-go\n  uses: actions/cache@v4\n  with:\n    path: ~/go/bin/markata-go\n    key: markata-go-${{ runner.os }}-v1\n\n- name: Install markata-go\n  run: |\n    if [ ! -f ~/go/bin/markata-go ]; then\n      go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n    fi\n```\n\n### Preview Deployments for Pull Requests\n\nDeploy preview versions for PRs:\n\n```yaml\nname: Preview\n\non:\n  pull_request:\n    types: [opened, synchronize]\n\njobs:\n  preview:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    steps:\n      - uses: actions/checkout@v4\n      \n      - name: Setup Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: '1.22'\n\n      - name: Build\n        run: |\n          go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n          markata-go build --clean\n        env:\n          MARKATA_GO_URL: https://username.github.io/repo/pr-${{ github.event.number }}\n\n      - name: Deploy Preview\n        uses: peaceiris/actions-gh-pages@v4\n        with:\n          github_token: ${{ secrets.GITHUB_TOKEN }}\n          publish_dir: ./public\n          destination_dir: pr-${{ github.event.number }}\n\n      - name: Comment PR\n        uses: actions/github-script@v7\n        with:\n          script: |\n            github.rest.issues.createComment({\n              issue_number: context.issue.number,\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              body: 'Preview: https://username.github.io/repo/pr-${{ github.event.number }}/'\n            })\n```\n\n## Next Steps\n\n- [Custom Domain Setup](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site) - GitHub's official docs\n- [Configuration Guide](../configuration/) - Customize your markata-go site\n- [Themes Guide](../themes/) - Change your site's appearance\n",
      "summary": "Step-by-step guide to deploy markata-go sites on GitHub Pages",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "documentation",
        "deployment",
        "github-pages"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/deployment/docker/",
      "url": "https://markata.dev/docs/guides/deployment/docker/",
      "title": "Deploy with Docker",
      "content_html": "\u003cp\u003eDocker provides a consistent, reproducible environment for building and serving your markata-go site. It\u0026rsquo;s ideal for self-hosting, local development, and integration with container orchestration platforms.\u003c/p\u003e\n\u003ch2 id=\"prerequisites\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrerequisites\u003c/span\u003e \u003ca href=\"#prerequisites\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDocker installed (\u003ca href=\"https://docs.docker.com/get-docker/\"\u003eGet Docker\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eDocker Compose (optional, for multi-container setups)\u003c/li\u003e\n\u003cli\u003eYour markata-go site ready to build\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"official-markata-go-images\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOfficial markata-go Images\u003c/span\u003e \u003ca href=\"#official-markata-go-images\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go publishes two official container images for different workflows:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eghcr.io/waylonwalker/markata-go:\u0026lt;version\u0026gt;\u003c/code\u003e: Minimal runtime image (scratch) that runs the \u003ccode\u003emarkata-go\u003c/code\u003e binary directly.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eghcr.io/waylonwalker/markata-go-builder:\u0026lt;version\u0026gt;\u003c/code\u003e: Builder image with \u003ccode\u003e/bin/sh\u003c/code\u003e, \u003ccode\u003eaws\u003c/code\u003e, \u003ccode\u003eopenssl\u003c/code\u003e, core utilities, \u003ccode\u003ersync\u003c/code\u003e, image encoders (\u003ccode\u003eavifenc\u003c/code\u003e, \u003ccode\u003ecwebp\u003c/code\u003e), Pagefind (standalone binary), Tailwind CLI (standalone binary), bundled CDN asset cache, bundled Mermaid JS, and Chromium for mermaid rendering (via Go-native chromedp, no Node.js required).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"builder-image-quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuilder Image Quick Start\u003c/span\u003e \u003ca href=\"#builder-image-quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker run --rm \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -v \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$PWD\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e:/site \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -w /site \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ghcr.io/waylonwalker/markata-go-builder:latest \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  sh -c \u003cspan class=\"s1\"\u003e\u0026#39;markata-go build --clean\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"builder-image-publish-script\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuilder Image Publish Script\u003c/span\u003e \u003ca href=\"#builder-image-publish-script\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker run --rm \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -v \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$PWD\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e:/site \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -v /webroot:/webroot \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -w /site \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ghcr.io/waylonwalker/markata-go-builder:latest \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  sh -c \u003cspan class=\"s1\"\u003e\u0026#39;set -eu; ts=$(date -u +%Y%m%d%H%M%S); markata-go build --clean; rsync -a --delete public/ /webroot/releases/$ts/; ln -sfn releases/$ts /webroot/current\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"chromium-mermaid-rendering-in-containers\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChromium Mermaid Rendering in Containers\u003c/span\u003e \u003ca href=\"#chromium-mermaid-rendering-in-containers\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf your site uses \u003ccode\u003emode = \u0026quot;chromium\u0026quot;\u003c/code\u003e for pre-rendered Mermaid diagrams, set\n\u003ccode\u003eno_sandbox = true\u003c/code\u003e in your config. The Chromium sandbox requires kernel\ncapabilities that Docker restricts by default:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emermaid\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;chromium\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emermaid\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003echromium\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eno_sandbox\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe builder image includes Chromium. For custom images, see\n\u003ca href=\"../configuration.md#chromium-in-containers-docker-distrobox-podman\"\u003eChromium in Containers\u003c/a\u003e\nin the configuration guide for installation options including the lightweight\n\u003ccode\u003echrome-headless-shell\u003c/code\u003e binary that requires no root access.\u003c/p\u003e\n\u003ch2 id=\"cost\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCost\u003c/span\u003e \u003ca href=\"#cost\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSetup\u003c/th\u003e\n\u003cth\u003eCost\u003c/th\u003e\n\u003cth\u003eBest For\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eLocal Docker\u003c/td\u003e\n\u003ctd\u003eFree\u003c/td\u003e\n\u003ctd\u003eDevelopment, testing\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSelf-hosted server\u003c/td\u003e\n\u003ctd\u003e$5-20/mo (VPS)\u003c/td\u003e\n\u003ctd\u003ePersonal sites, full control\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eContainer platforms\u003c/td\u003e\n\u003ctd\u003eVaries\u003c/td\u003e\n\u003ctd\u003eProduction, scaling\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"method-1-simple-nginx-container\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMethod 1: Simple Nginx Container\u003c/span\u003e \u003ca href=\"#method-1-simple-nginx-container\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe simplest approach: build locally and serve with nginx.\u003c/p\u003e\n\u003ch3 id=\"step-1-build-your-site\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 1: Build Your Site\u003c/span\u003e \u003ca href=\"#step-1-build-your-site\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"step-2-create-dockerfile\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 2: Create Dockerfile\u003c/span\u003e \u003ca href=\"#step-2-create-dockerfile\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003eDockerfile\u003c/code\u003e in your project root:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003enginx:alpine\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Copy built site to nginx\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e public/ /usr/share/nginx/html/\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Custom nginx config for clean URLs\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e nginx.conf /etc/nginx/conf.d/default.conf\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eEXPOSE\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e80\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eCMD\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;nginx\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;-g\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;daemon off;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"step-3-create-nginx-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 3: Create nginx Configuration\u003c/span\u003e \u003ca href=\"#step-3-create-nginx-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003enginx.conf\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eserver\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elisten\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eserver_name\u003c/span\u003e \u003cspan class=\"s\"\u003elocalhost\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eroot\u003c/span\u003e \u003cspan class=\"s\"\u003e/usr/share/nginx/html\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eindex\u003c/span\u003e \u003cspan class=\"s\"\u003eindex.html\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Enable gzip compression\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003egzip\u003c/span\u003e \u003cspan class=\"no\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003egzip_types\u003c/span\u003e \u003cspan class=\"s\"\u003etext/plain\u003c/span\u003e \u003cspan class=\"s\"\u003etext/css\u003c/span\u003e \u003cspan class=\"s\"\u003eapplication/json\u003c/span\u003e \u003cspan class=\"s\"\u003eapplication/javascript\u003c/span\u003e \u003cspan class=\"s\"\u003etext/xml\u003c/span\u003e \u003cspan class=\"s\"\u003eapplication/xml\u003c/span\u003e \u003cspan class=\"s\"\u003etext/javascript\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# MIME types for txt/md files\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"p\"\u003e~\u003c/span\u003e \u003cspan class=\"sr\"\u003e\\.(txt|md)$\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003edefault_type\u003c/span\u003e \u003cspan class=\"s\"\u003etext/plain\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003echarset\u003c/span\u003e \u003cspan class=\"s\"\u003eutf-8\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Try exact file first (for /robots.txt), then index.html, then directory\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# This supports reversed redirects where canonical files are at /slug.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"s\"\u003e/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003etry_files\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri/index.html\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri/\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e404\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Cache static assets\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"s\"\u003e/static/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eexpires\u003c/span\u003e \u003cspan class=\"s\"\u003e1y\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eadd_header\u003c/span\u003e \u003cspan class=\"s\"\u003eCache-Control\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;public,\u003c/span\u003e \u003cspan class=\"s\"\u003eimmutable\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Don\u0026#39;t cache HTML\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"p\"\u003e~\u003c/span\u003e\u003cspan class=\"sr\"\u003e*\u003c/span\u003e \u003cspan class=\"s\"\u003e\\.html\u003c/span\u003e$ \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eexpires\u003c/span\u003e \u003cspan class=\"s\"\u003e-1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eadd_header\u003c/span\u003e \u003cspan class=\"s\"\u003eCache-Control\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;no-store,\u003c/span\u003e \u003cspan class=\"s\"\u003eno-cache,\u003c/span\u003e \u003cspan class=\"s\"\u003emust-revalidate\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Security headers\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eadd_header\u003c/span\u003e \u003cspan class=\"s\"\u003eX-Frame-Options\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;DENY\u0026#34;\u003c/span\u003e \u003cspan class=\"s\"\u003ealways\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eadd_header\u003c/span\u003e \u003cspan class=\"s\"\u003eX-Content-Type-Options\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;nosniff\u0026#34;\u003c/span\u003e \u003cspan class=\"s\"\u003ealways\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eadd_header\u003c/span\u003e \u003cspan class=\"s\"\u003eReferrer-Policy\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;strict-origin-when-cross-origin\u0026#34;\u003c/span\u003e \u003cspan class=\"s\"\u003ealways\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"step-4-build-and-run\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 4: Build and Run\u003c/span\u003e \u003ca href=\"#step-4-build-and-run\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build the image\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker build -t my-site .\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run the container\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker run -d -p 8080:80 --name my-site my-site\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# View your site at http://localhost:8080\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"method-2-multi-stage-build\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMethod 2: Multi-Stage Build\u003c/span\u003e \u003ca href=\"#method-2-multi-stage-build\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBuild the site inside Docker for fully reproducible builds.\u003c/p\u003e\n\u003ch3 id=\"dockerfile-with-multi-stage-build\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDockerfile with Multi-Stage Build\u003c/span\u003e \u003ca href=\"#dockerfile-with-multi-stage-build\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Stage 1: Build the site\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003egolang:1.22-alpine\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eAS\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Install git (needed for go install)\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e apk add --no-cache git\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Install markata-go\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Set working directory\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eWORKDIR\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e/site\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Copy site source\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e . .\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Build the site\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eENV\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e markata-go build --clean\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Stage 2: Serve with nginx\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003enginx:alpine\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Copy built site from builder stage\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e --from\u003cspan class=\"o\"\u003e=\u003c/span\u003ebuilder /site/public/ /usr/share/nginx/html/\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Custom nginx configuration\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e nginx.conf /etc/nginx/conf.d/default.conf\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eEXPOSE\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e80\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eCMD\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;nginx\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;-g\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;daemon off;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"build-and-run\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild and Run\u003c/span\u003e \u003ca href=\"#build-and-run\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build with your production URL\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker build \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --build-arg \u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -t my-site .\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker run -d -p 8080:80 --name my-site my-site\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"method-3-docker-compose\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMethod 3: Docker Compose\u003c/span\u003e \u003ca href=\"#method-3-docker-compose\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor development with live reload or multi-service setups.\u003c/p\u003e\n\u003ch3 id=\"docker-compose-yml\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003edocker-compose.yml\u003c/span\u003e \u003ca href=\"#docker-compose-yml\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;3.8\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eservices\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003esite\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eports\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;8080:80\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erestart\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eunless-stopped\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehealthcheck\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003etest\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;CMD\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;wget\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;-q\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--spider\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;http://localhost/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003einterval\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e30s\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003etimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e10s\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eretries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Optional: Add Watchtower for automatic updates\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ewatchtower\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003econtainrrr/watchtower\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003evolumes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003e/var/run/docker.sock:/var/run/docker.sock\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecommand\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e--\u003cspan class=\"l\"\u003einterval 3600 site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"commands\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommands\u003c/span\u003e \u003ca href=\"#commands\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Start services\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker compose up -d\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# View logs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker compose logs -f site\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Rebuild after changes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker compose build \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e docker compose up -d\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Stop services\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker compose down\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"method-4-development-with-live-reload\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMethod 4: Development with Live Reload\u003c/span\u003e \u003ca href=\"#method-4-development-with-live-reload\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor local development with automatic rebuilds.\u003c/p\u003e\n\u003ch3 id=\"docker-compose-dev-yml\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003edocker-compose.dev.yml\u003c/span\u003e \u003ca href=\"#docker-compose-dev-yml\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;3.8\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eservices\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edev\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egolang:1.22-alpine\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eworking_dir\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003evolumes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003e.:/site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003ego-cache:/go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eports\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;8080:8080\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecommand\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      sh -c \u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        apk add --no-cache git\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        markata-go serve\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      \u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003eMARKATA_GO_URL=http://localhost:8080\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evolumes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ego-cache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"run-development-server\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRun Development Server\u003c/span\u003e \u003ca href=\"#run-development-server\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker compose -f docker-compose.dev.yml up\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"production-deployment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProduction Deployment\u003c/span\u003e \u003ca href=\"#production-deployment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"deploying-to-a-vps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeploying to a VPS\u003c/span\u003e \u003ca href=\"#deploying-to-a-vps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eBuild and Push to Registry\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build image\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker build -t your-registry/my-site:latest .\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Push to registry (Docker Hub, GitHub Container Registry, etc.)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker push your-registry/my-site:latest\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e\u003cstrong\u003ePull and Run on Server\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# On your server\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker pull your-registry/my-site:latest\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker run -d \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --name my-site \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -p 80:80 \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --restart unless-stopped \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  your-registry/my-site:latest\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"with-https-traefik\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWith HTTPS (Traefik)\u003c/span\u003e \u003ca href=\"#with-https-traefik\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse Traefik as a reverse proxy with automatic HTTPS.\u003c/p\u003e\n\u003ch4 id=\"docker-compose-prod-yml\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003edocker-compose.prod.yml\u003c/span\u003e \u003ca href=\"#docker-compose-prod-yml\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;3.8\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eservices\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etraefik\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etraefik:v2.10\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecommand\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;--api.insecure=true\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;--providers.docker=true\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;--providers.docker.exposedbydefault=false\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;--entrypoints.web.address=:80\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;--entrypoints.websecure.address=:443\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;--certificatesresolvers.letsencrypt.acme.httpchallenge=true\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;--certificatesresolvers.letsencrypt.acme.email=you@example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eports\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;80:80\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;443:443\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003evolumes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003e/var/run/docker.sock:/var/run/docker.sock:ro\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003eletsencrypt:/letsencrypt\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erestart\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eunless-stopped\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003esite\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003elabels\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;traefik.enable=true\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;traefik.http.routers.site.rule=Host(`example.com`)\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;traefik.http.routers.site.entrypoints=websecure\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;traefik.http.routers.site.tls.certresolver=letsencrypt\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;traefik.http.routers.site-http.rule=Host(`example.com`)\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;traefik.http.routers.site-http.entrypoints=web\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;traefik.http.routers.site-http.middlewares=redirect-to-https\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erestart\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eunless-stopped\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evolumes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eletsencrypt\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"with-https-caddy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWith HTTPS (Caddy)\u003c/span\u003e \u003ca href=\"#with-https-caddy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCaddy provides automatic HTTPS with simpler configuration.\u003c/p\u003e\n\u003ch4 id=\"caddyfile\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCaddyfile\u003c/span\u003e \u003ca href=\"#caddyfile\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre\u003e\u003ccode\u003eexample.com {\n    root * /srv\n    file_server\n    encode gzip\n\n    # MIME types for txt/md files\n    @txtmd path *.txt *.md\n    header @txtmd Content-Type \u0026quot;text/plain; charset=utf-8\u0026quot;\n\n    header /static/* Cache-Control \u0026quot;public, max-age=31536000, immutable\u0026quot;\n    header *.html Cache-Control \u0026quot;no-cache, must-revalidate\u0026quot;\n\n    # Try exact file first (for /robots.txt), then index.html, then directory\n    try_files {path} {path}/index.html {path}/\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch4 id=\"docker-compose-caddy-yml\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003edocker-compose.caddy.yml\u003c/span\u003e \u003ca href=\"#docker-compose-caddy-yml\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;3.8\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eservices\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecaddy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecaddy:alpine\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eports\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;80:80\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;443:443\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003evolumes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003e./Caddyfile:/etc/caddy/Caddyfile\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003e./public:/srv\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003ecaddy_data:/data\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003ecaddy_config:/config\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erestart\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eunless-stopped\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evolumes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecaddy_data\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecaddy_config\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"ci-cd-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCI/CD Integration\u003c/span\u003e \u003ca href=\"#ci-cd-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"github-actions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGitHub Actions\u003c/span\u003e \u003ca href=\"#github-actions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild and Deploy Docker\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eREGISTRY\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eghcr.io\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eIMAGE_NAME\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ github.repository }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild-and-push\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epermissions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eread\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003epackages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eLog in to Container Registry\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edocker/login-action@v3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eregistry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ env.REGISTRY }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eusername\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ github.actor }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epassword\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild and push Docker image\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edocker/build-push-action@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild-args\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            MARKATA_GO_URL=https://example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edeploy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild-and-push\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy to server\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eappleboy/ssh-action@v1.0.0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ehost\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.SERVER_HOST }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eusername\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.SERVER_USER }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.SERVER_SSH_KEY }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            docker stop my-site || true\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            docker rm my-site || true\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            docker run -d \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              --name my-site \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              -p 80:80 \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              --restart unless-stopped \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"container-orchestration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContainer Orchestration\u003c/span\u003e \u003ca href=\"#container-orchestration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"kubernetes-deployment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKubernetes Deployment\u003c/span\u003e \u003ca href=\"#kubernetes-deployment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# deployment.yaml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eapiVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eapps/v1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ekind\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeployment\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003espec\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ereplicas\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eselector\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ematchLabels\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eapp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003elabels\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eapp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003espec\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003econtainers\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eyour-registry/my-site:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eports\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e- \u003cspan class=\"nt\"\u003econtainerPort\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e80\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eresources\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nt\"\u003elimits\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e              \u003c/span\u003e\u003cspan class=\"nt\"\u003ememory\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;128Mi\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e              \u003c/span\u003e\u003cspan class=\"nt\"\u003ecpu\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;100m\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003elivenessProbe\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nt\"\u003ehttpGet\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e              \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e              \u003c/span\u003e\u003cspan class=\"nt\"\u003eport\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e80\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nt\"\u003einitialDelaySeconds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nt\"\u003eperiodSeconds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e10\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eapiVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ekind\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eService\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003espec\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eselector\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eapp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eports\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eport\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e80\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003etargetPort\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e80\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eClusterIP\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eapiVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enetworking.k8s.io/v1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ekind\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eIngress\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eannotations\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecert-manager.io/cluster-issuer\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eletsencrypt-prod\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003espec\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etls\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003ehosts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e- \u003cspan class=\"l\"\u003eexample.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003esecretName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-site-tls\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003ehost\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eexample.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ehttp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nt\"\u003epathType\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ePrefix\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nt\"\u003ebackend\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e              \u003c/span\u003e\u003cspan class=\"nt\"\u003eservice\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"nt\"\u003eport\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                  \u003c/span\u003e\u003cspan class=\"nt\"\u003enumber\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e80\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"container-won-t-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContainer Won’t Start\u003c/span\u003e \u003ca href=\"#container-won-t-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCheck logs:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker logs my-site\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCommon issues:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePort already in use: Change the host port (\u003ccode\u003e-p 8081:80\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003ePermission denied: Check file permissions in copied directories\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"404-errors-on-subpages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e404 Errors on Subpages\u003c/span\u003e \u003ca href=\"#404-errors-on-subpages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnsure nginx is configured for the reversed redirect structure:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# MIME types for txt/md files\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003elocation\u003c/span\u003e \u003cspan class=\"p\"\u003e~\u003c/span\u003e \u003cspan class=\"sr\"\u003e\\.(txt|md)$\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003edefault_type\u003c/span\u003e \u003cspan class=\"s\"\u003etext/plain\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003echarset\u003c/span\u003e \u003cspan class=\"s\"\u003eutf-8\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Try exact file first, then index.html, then directory\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003elocation\u003c/span\u003e \u003cspan class=\"s\"\u003e/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003etry_files\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri/index.html\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri/\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e404\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis order ensures:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/robots.txt\u003c/code\u003e serves the canonical file directly\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/my-post/\u003c/code\u003e serves \u003ccode\u003e/my-post/index.html\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eDirectory requests fall back correctly\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"large-image-size\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLarge Image Size\u003c/span\u003e \u003ca href=\"#large-image-size\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOptimize your Dockerfile:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Use alpine-based images\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003enginx:alpine\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Use .dockerignore to exclude unnecessary files\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCreate \u003ccode\u003e.dockerignore\u003c/code\u003e:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e.git\nnode_modules\n*.md\nDockerfile\ndocker-compose*.yml\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"build-fails-in-multi-stage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Fails in Multi-Stage\u003c/span\u003e \u003ca href=\"#build-fails-in-multi-stage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnsure Go modules are available:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# If using go modules\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e go.mod go.sum ./\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e go mod download\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"css-js-not-loading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCSS/JS Not Loading\u003c/span\u003e \u003ca href=\"#css-js-not-loading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eVerify MARKATA_GO_URL matches your deployment:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker build --build-arg \u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com -t my-site .\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"performance-optimization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePerformance Optimization\u003c/span\u003e \u003ca href=\"#performance-optimization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"enable-brotli-compression\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnable Brotli Compression\u003c/span\u003e \u003ca href=\"#enable-brotli-compression\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# In nginx.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003ebrotli\u003c/span\u003e \u003cspan class=\"no\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003ebrotli_types\u003c/span\u003e \u003cspan class=\"s\"\u003etext/plain\u003c/span\u003e \u003cspan class=\"s\"\u003etext/css\u003c/span\u003e \u003cspan class=\"s\"\u003eapplication/json\u003c/span\u003e \u003cspan class=\"s\"\u003eapplication/javascript\u003c/span\u003e \u003cspan class=\"s\"\u003etext/xml\u003c/span\u003e \u003cspan class=\"s\"\u003eapplication/xml\u003c/span\u003e \u003cspan class=\"s\"\u003etext/javascript\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRequires nginx with brotli module:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003efholzer/nginx-brotli:latest\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"resource-limits\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eResource Limits\u003c/span\u003e \u003ca href=\"#resource-limits\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# In docker-compose.yml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eservices\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003esite\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edeploy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eresources\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003elimits\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ecpus\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;0.5\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ememory\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e128M\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ereservations\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ecpus\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;0.1\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ememory\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e64M\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"health-checks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHealth Checks\u003c/span\u003e \u003ca href=\"#health-checks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eHEALTHCHECK\u003c/span\u003e --interval\u003cspan class=\"o\"\u003e=\u003c/span\u003e30s --timeout\u003cspan class=\"o\"\u003e=\u003c/span\u003e10s --start-period\u003cspan class=\"o\"\u003e=\u003c/span\u003e5s --retries\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  CMD wget -q --spider http://localhost/ \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"nb\"\u003eexit\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"security-best-practices\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSecurity Best Practices\u003c/span\u003e \u003ca href=\"#security-best-practices\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"run-as-non-root-user\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRun as Non-Root User\u003c/span\u003e \u003ca href=\"#run-as-non-root-user\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003enginx:alpine\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Create non-root user\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e addgroup -S appgroup \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e adduser -S appuser -G appgroup\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Copy files\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e --chown\u003cspan class=\"o\"\u003e=\u003c/span\u003eappuser:appgroup public/ /usr/share/nginx/html/\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Switch to non-root user (for processes that don\u0026#39;t need root)\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Note: nginx master process needs root for port 80\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"read-only-filesystem\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRead-Only Filesystem\u003c/span\u003e \u003ca href=\"#read-only-filesystem\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eservices\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003esite\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eread_only\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003etmpfs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003e/var/cache/nginx\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003e/var/run\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"security-scanning\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSecurity Scanning\u003c/span\u003e \u003ca href=\"#security-scanning\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Scan image for vulnerabilities\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker scout cve my-site:latest\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Or use Trivy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etrivy image my-site:latest\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext Steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"../self-hosting/\"\u003eSelf-Hosting Guide\u003c/a\u003e - More self-hosting options\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"../configuration/\"\u003eConfiguration Guide\u003c/a\u003e - Customize your markata-go site\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"../themes/\"\u003eThemes Guide\u003c/a\u003e - Change your site\u0026rsquo;s appearance\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nDocker provides a consistent, reproducible environment for building and serving your markata-go site. It's ideal for self-hosting, local development, and integration with container orchestration platforms.\n\n## Prerequisites\n\n- Docker installed ([Get Docker](https://docs.docker.com/get-docker/))\n- Docker Compose (optional, for multi-container setups)\n- Your markata-go site ready to build\n\n## Official markata-go Images\n\nmarkata-go publishes two official container images for different workflows:\n\n- `ghcr.io/waylonwalker/markata-go:\u003cversion\u003e`: Minimal runtime image (scratch) that runs the `markata-go` binary directly.\n- `ghcr.io/waylonwalker/markata-go-builder:\u003cversion\u003e`: Builder image with `/bin/sh`, `aws`, `openssl`, core utilities, `rsync`, image encoders (`avifenc`, `cwebp`), Pagefind (standalone binary), Tailwind CLI (standalone binary), bundled CDN asset cache, bundled Mermaid JS, and Chromium for mermaid rendering (via Go-native chromedp, no Node.js required).\n\n### Builder Image Quick Start\n\n```bash\ndocker run --rm \\\n  -v \"$PWD\":/site \\\n  -w /site \\\n  ghcr.io/waylonwalker/markata-go-builder:latest \\\n  sh -c 'markata-go build --clean'\n```\n\n### Builder Image Publish Script\n\n```bash\ndocker run --rm \\\n  -v \"$PWD\":/site \\\n  -v /webroot:/webroot \\\n  -w /site \\\n  ghcr.io/waylonwalker/markata-go-builder:latest \\\n  sh -c 'set -eu; ts=$(date -u +%Y%m%d%H%M%S); markata-go build --clean; rsync -a --delete public/ /webroot/releases/$ts/; ln -sfn releases/$ts /webroot/current'\n```\n\n### Chromium Mermaid Rendering in Containers\n\nIf your site uses `mode = \"chromium\"` for pre-rendered Mermaid diagrams, set\n`no_sandbox = true` in your config. The Chromium sandbox requires kernel\ncapabilities that Docker restricts by default:\n\n```toml\n[markata-go.mermaid]\nmode = \"chromium\"\n\n[markata-go.mermaid.chromium]\nno_sandbox = true\n```\n\nThe builder image includes Chromium. For custom images, see\n[Chromium in Containers](../configuration.md#chromium-in-containers-docker-distrobox-podman)\nin the configuration guide for installation options including the lightweight\n`chrome-headless-shell` binary that requires no root access.\n\n## Cost\n\n| Setup | Cost | Best For |\n|-------|------|----------|\n| Local Docker | Free | Development, testing |\n| Self-hosted server | $5-20/mo (VPS) | Personal sites, full control |\n| Container platforms | Varies | Production, scaling |\n\n## Method 1: Simple Nginx Container\n\nThe simplest approach: build locally and serve with nginx.\n\n### Step 1: Build Your Site\n\n```bash\nmarkata-go build --clean\n```\n\n### Step 2: Create Dockerfile\n\nCreate `Dockerfile` in your project root:\n\n```dockerfile\nFROM nginx:alpine\n\n# Copy built site to nginx\nCOPY public/ /usr/share/nginx/html/\n\n# Custom nginx config for clean URLs\nCOPY nginx.conf /etc/nginx/conf.d/default.conf\n\nEXPOSE 80\n\nCMD [\"nginx\", \"-g\", \"daemon off;\"]\n```\n\n### Step 3: Create nginx Configuration\n\nCreate `nginx.conf`:\n\n```nginx\nserver {\n    listen 80;\n    server_name localhost;\n    root /usr/share/nginx/html;\n    index index.html;\n\n    # Enable gzip compression\n    gzip on;\n    gzip_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript;\n\n    # MIME types for txt/md files\n    location ~ \\.(txt|md)$ {\n        default_type text/plain;\n        charset utf-8;\n    }\n\n    # Try exact file first (for /robots.txt), then index.html, then directory\n    # This supports reversed redirects where canonical files are at /slug.txt\n    location / {\n        try_files $uri $uri/index.html $uri/ =404;\n    }\n\n    # Cache static assets\n    location /static/ {\n        expires 1y;\n        add_header Cache-Control \"public, immutable\";\n    }\n\n    # Don't cache HTML\n    location ~* \\.html$ {\n        expires -1;\n        add_header Cache-Control \"no-store, no-cache, must-revalidate\";\n    }\n\n    # Security headers\n    add_header X-Frame-Options \"DENY\" always;\n    add_header X-Content-Type-Options \"nosniff\" always;\n    add_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\n}\n```\n\n### Step 4: Build and Run\n\n```bash\n# Build the image\ndocker build -t my-site .\n\n# Run the container\ndocker run -d -p 8080:80 --name my-site my-site\n\n# View your site at http://localhost:8080\n```\n\n## Method 2: Multi-Stage Build\n\nBuild the site inside Docker for fully reproducible builds.\n\n### Dockerfile with Multi-Stage Build\n\n```dockerfile\n# Stage 1: Build the site\nFROM golang:1.22-alpine AS builder\n\n# Install git (needed for go install)\nRUN apk add --no-cache git\n\n# Install markata-go\nRUN go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\n# Set working directory\nWORKDIR /site\n\n# Copy site source\nCOPY . .\n\n# Build the site\nENV MARKATA_GO_URL=https://example.com\nRUN markata-go build --clean\n\n# Stage 2: Serve with nginx\nFROM nginx:alpine\n\n# Copy built site from builder stage\nCOPY --from=builder /site/public/ /usr/share/nginx/html/\n\n# Custom nginx configuration\nCOPY nginx.conf /etc/nginx/conf.d/default.conf\n\nEXPOSE 80\n\nCMD [\"nginx\", \"-g\", \"daemon off;\"]\n```\n\n### Build and Run\n\n```bash\n# Build with your production URL\ndocker build \\\n  --build-arg MARKATA_GO_URL=https://example.com \\\n  -t my-site .\n\n# Run\ndocker run -d -p 8080:80 --name my-site my-site\n```\n\n## Method 3: Docker Compose\n\nFor development with live reload or multi-service setups.\n\n### docker-compose.yml\n\n```yaml\nversion: '3.8'\n\nservices:\n  site:\n    build: .\n    ports:\n      - \"8080:80\"\n    restart: unless-stopped\n    healthcheck:\n      test: [\"CMD\", \"wget\", \"-q\", \"--spider\", \"http://localhost/\"]\n      interval: 30s\n      timeout: 10s\n      retries: 3\n\n  # Optional: Add Watchtower for automatic updates\n  watchtower:\n    image: containrrr/watchtower\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n    command: --interval 3600 site\n```\n\n### Commands\n\n```bash\n# Start services\ndocker compose up -d\n\n# View logs\ndocker compose logs -f site\n\n# Rebuild after changes\ndocker compose build \u0026\u0026 docker compose up -d\n\n# Stop services\ndocker compose down\n```\n\n## Method 4: Development with Live Reload\n\nFor local development with automatic rebuilds.\n\n### docker-compose.dev.yml\n\n```yaml\nversion: '3.8'\n\nservices:\n  dev:\n    image: golang:1.22-alpine\n    working_dir: /site\n    volumes:\n      - .:/site\n      - go-cache:/go\n    ports:\n      - \"8080:8080\"\n    command: |\n      sh -c '\n        apk add --no-cache git\n        go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n        markata-go serve\n      '\n    environment:\n      - MARKATA_GO_URL=http://localhost:8080\n\nvolumes:\n  go-cache:\n```\n\n### Run Development Server\n\n```bash\ndocker compose -f docker-compose.dev.yml up\n```\n\n## Production Deployment\n\n### Deploying to a VPS\n\n1. **Build and Push to Registry**\n\n```bash\n# Build image\ndocker build -t your-registry/my-site:latest .\n\n# Push to registry (Docker Hub, GitHub Container Registry, etc.)\ndocker push your-registry/my-site:latest\n```\n\n2. **Pull and Run on Server**\n\n```bash\n# On your server\ndocker pull your-registry/my-site:latest\ndocker run -d \\\n  --name my-site \\\n  -p 80:80 \\\n  --restart unless-stopped \\\n  your-registry/my-site:latest\n```\n\n### With HTTPS (Traefik)\n\nUse Traefik as a reverse proxy with automatic HTTPS.\n\n#### docker-compose.prod.yml\n\n```yaml\nversion: '3.8'\n\nservices:\n  traefik:\n    image: traefik:v2.10\n    command:\n      - \"--api.insecure=true\"\n      - \"--providers.docker=true\"\n      - \"--providers.docker.exposedbydefault=false\"\n      - \"--entrypoints.web.address=:80\"\n      - \"--entrypoints.websecure.address=:443\"\n      - \"--certificatesresolvers.letsencrypt.acme.httpchallenge=true\"\n      - \"--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\"\n      - \"--certificatesresolvers.letsencrypt.acme.email=you@example.com\"\n      - \"--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json\"\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock:ro\n      - letsencrypt:/letsencrypt\n    restart: unless-stopped\n\n  site:\n    build: .\n    labels:\n      - \"traefik.enable=true\"\n      - \"traefik.http.routers.site.rule=Host(`example.com`)\"\n      - \"traefik.http.routers.site.entrypoints=websecure\"\n      - \"traefik.http.routers.site.tls.certresolver=letsencrypt\"\n      - \"traefik.http.routers.site-http.rule=Host(`example.com`)\"\n      - \"traefik.http.routers.site-http.entrypoints=web\"\n      - \"traefik.http.routers.site-http.middlewares=redirect-to-https\"\n      - \"traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https\"\n    restart: unless-stopped\n\nvolumes:\n  letsencrypt:\n```\n\n### With HTTPS (Caddy)\n\nCaddy provides automatic HTTPS with simpler configuration.\n\n#### Caddyfile\n\n```\nexample.com {\n    root * /srv\n    file_server\n    encode gzip\n\n    # MIME types for txt/md files\n    @txtmd path *.txt *.md\n    header @txtmd Content-Type \"text/plain; charset=utf-8\"\n\n    header /static/* Cache-Control \"public, max-age=31536000, immutable\"\n    header *.html Cache-Control \"no-cache, must-revalidate\"\n\n    # Try exact file first (for /robots.txt), then index.html, then directory\n    try_files {path} {path}/index.html {path}/\n}\n```\n\n#### docker-compose.caddy.yml\n\n```yaml\nversion: '3.8'\n\nservices:\n  caddy:\n    image: caddy:alpine\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n    volumes:\n      - ./Caddyfile:/etc/caddy/Caddyfile\n      - ./public:/srv\n      - caddy_data:/data\n      - caddy_config:/config\n    restart: unless-stopped\n\nvolumes:\n  caddy_data:\n  caddy_config:\n```\n\n## CI/CD Integration\n\n### GitHub Actions\n\n```yaml\nname: Build and Deploy Docker\n\non:\n  push:\n    branches: [main]\n\nenv:\n  REGISTRY: ghcr.io\n  IMAGE_NAME: ${{ github.repository }}\n\njobs:\n  build-and-push:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      packages: write\n\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Log in to Container Registry\n        uses: docker/login-action@v3\n        with:\n          registry: ${{ env.REGISTRY }}\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Build and push Docker image\n        uses: docker/build-push-action@v5\n        with:\n          context: .\n          push: true\n          tags: |\n            ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\n            ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}\n          build-args: |\n            MARKATA_GO_URL=https://example.com\n\n  deploy:\n    needs: build-and-push\n    runs-on: ubuntu-latest\n    steps:\n      - name: Deploy to server\n        uses: appleboy/ssh-action@v1.0.0\n        with:\n          host: ${{ secrets.SERVER_HOST }}\n          username: ${{ secrets.SERVER_USER }}\n          key: ${{ secrets.SERVER_SSH_KEY }}\n          script: |\n            docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\n            docker stop my-site || true\n            docker rm my-site || true\n            docker run -d \\\n              --name my-site \\\n              -p 80:80 \\\n              --restart unless-stopped \\\n              ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\n```\n\n## Container Orchestration\n\n### Kubernetes Deployment\n\n```yaml\n# deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: markata-site\nspec:\n  replicas: 2\n  selector:\n    matchLabels:\n      app: markata-site\n  template:\n    metadata:\n      labels:\n        app: markata-site\n    spec:\n      containers:\n        - name: site\n          image: your-registry/my-site:latest\n          ports:\n            - containerPort: 80\n          resources:\n            limits:\n              memory: \"128Mi\"\n              cpu: \"100m\"\n          livenessProbe:\n            httpGet:\n              path: /\n              port: 80\n            initialDelaySeconds: 5\n            periodSeconds: 10\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: markata-site\nspec:\n  selector:\n    app: markata-site\n  ports:\n    - port: 80\n      targetPort: 80\n  type: ClusterIP\n---\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: markata-site\n  annotations:\n    cert-manager.io/cluster-issuer: letsencrypt-prod\nspec:\n  tls:\n    - hosts:\n        - example.com\n      secretName: markata-site-tls\n  rules:\n    - host: example.com\n      http:\n        paths:\n          - path: /\n            pathType: Prefix\n            backend:\n              service:\n                name: markata-site\n                port:\n                  number: 80\n```\n\n## Troubleshooting\n\n### Container Won't Start\n\nCheck logs:\n```bash\ndocker logs my-site\n```\n\nCommon issues:\n- Port already in use: Change the host port (`-p 8081:80`)\n- Permission denied: Check file permissions in copied directories\n\n### 404 Errors on Subpages\n\nEnsure nginx is configured for the reversed redirect structure:\n```nginx\n# MIME types for txt/md files\nlocation ~ \\.(txt|md)$ {\n    default_type text/plain;\n    charset utf-8;\n}\n\n# Try exact file first, then index.html, then directory\nlocation / {\n    try_files $uri $uri/index.html $uri/ =404;\n}\n```\n\nThis order ensures:\n- `/robots.txt` serves the canonical file directly\n- `/my-post/` serves `/my-post/index.html`\n- Directory requests fall back correctly\n\n### Large Image Size\n\nOptimize your Dockerfile:\n```dockerfile\n# Use alpine-based images\nFROM nginx:alpine\n\n# Use .dockerignore to exclude unnecessary files\n```\n\nCreate `.dockerignore`:\n```\n.git\nnode_modules\n*.md\nDockerfile\ndocker-compose*.yml\n```\n\n### Build Fails in Multi-Stage\n\nEnsure Go modules are available:\n```dockerfile\n# If using go modules\nCOPY go.mod go.sum ./\nRUN go mod download\n```\n\n### CSS/JS Not Loading\n\nVerify MARKATA_GO_URL matches your deployment:\n```bash\ndocker build --build-arg MARKATA_GO_URL=https://example.com -t my-site .\n```\n\n## Performance Optimization\n\n### Enable Brotli Compression\n\n```nginx\n# In nginx.conf\nbrotli on;\nbrotli_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript;\n```\n\nRequires nginx with brotli module:\n```dockerfile\nFROM fholzer/nginx-brotli:latest\n```\n\n### Resource Limits\n\n```yaml\n# In docker-compose.yml\nservices:\n  site:\n    deploy:\n      resources:\n        limits:\n          cpus: '0.5'\n          memory: 128M\n        reservations:\n          cpus: '0.1'\n          memory: 64M\n```\n\n### Health Checks\n\n```dockerfile\nHEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \\\n  CMD wget -q --spider http://localhost/ || exit 1\n```\n\n## Security Best Practices\n\n### Run as Non-Root User\n\n```dockerfile\nFROM nginx:alpine\n\n# Create non-root user\nRUN addgroup -S appgroup \u0026\u0026 adduser -S appuser -G appgroup\n\n# Copy files\nCOPY --chown=appuser:appgroup public/ /usr/share/nginx/html/\n\n# Switch to non-root user (for processes that don't need root)\n# Note: nginx master process needs root for port 80\n```\n\n### Read-Only Filesystem\n\n```yaml\nservices:\n  site:\n    read_only: true\n    tmpfs:\n      - /var/cache/nginx\n      - /var/run\n```\n\n### Security Scanning\n\n```bash\n# Scan image for vulnerabilities\ndocker scout cve my-site:latest\n\n# Or use Trivy\ntrivy image my-site:latest\n```\n\n## Next Steps\n\n- [Self-Hosting Guide](../self-hosting/) - More self-hosting options\n- [Configuration Guide](../configuration/) - Customize your markata-go site\n- [Themes Guide](../themes/) - Change your site's appearance\n",
      "summary": "Step-by-step guide to deploy markata-go sites using Docker containers",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "documentation",
        "deployment",
        "docker"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/deployment/cloudflare-pages/",
      "url": "https://markata.dev/docs/guides/deployment/cloudflare-pages/",
      "title": "Deploy to Cloudflare Pages",
      "content_html": "\u003cp\u003eCloudflare Pages provides fast global CDN deployment with unlimited bandwidth and Workers integration. It\u0026rsquo;s an excellent choice for high-traffic sites.\u003c/p\u003e\n\u003ch2 id=\"prerequisites\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrerequisites\u003c/span\u003e \u003ca href=\"#prerequisites\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eA Cloudflare account (free tier available)\u003c/li\u003e\n\u003cli\u003eYour markata-go site in a Git repository (GitHub or GitLab)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"cost\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCost\u003c/span\u003e \u003ca href=\"#cost\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTier\u003c/th\u003e\n\u003cth\u003eBandwidth\u003c/th\u003e\n\u003cth\u003eBuilds\u003c/th\u003e\n\u003cth\u003eSites\u003c/th\u003e\n\u003cth\u003ePrice\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eFree\u003c/td\u003e\n\u003ctd\u003eUnlimited\u003c/td\u003e\n\u003ctd\u003e500/mo\u003c/td\u003e\n\u003ctd\u003eUnlimited\u003c/td\u003e\n\u003ctd\u003e$0\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePro\u003c/td\u003e\n\u003ctd\u003eUnlimited\u003c/td\u003e\n\u003ctd\u003e5,000/mo\u003c/td\u003e\n\u003ctd\u003eUnlimited\u003c/td\u003e\n\u003ctd\u003e$20/mo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBusiness\u003c/td\u003e\n\u003ctd\u003eUnlimited\u003c/td\u003e\n\u003ctd\u003e20,000/mo\u003c/td\u003e\n\u003ctd\u003eUnlimited\u003c/td\u003e\n\u003ctd\u003e$200/mo\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe free tier offers unlimited bandwidth, making it ideal for high-traffic sites.\u003c/p\u003e\n\u003ch2 id=\"method-1-git-integration-recommended\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMethod 1: Git Integration (Recommended)\u003c/span\u003e \u003ca href=\"#method-1-git-integration-recommended\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"step-1-connect-repository\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 1: Connect Repository\u003c/span\u003e \u003ca href=\"#step-1-connect-repository\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eLog in to the \u003ca href=\"https://dash.cloudflare.com\"\u003eCloudflare Dashboard\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eGo to \u003cstrong\u003eWorkers \u0026amp; Pages\u003c/strong\u003e \u0026gt; \u003cstrong\u003eCreate application\u003c/strong\u003e \u0026gt; \u003cstrong\u003ePages\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eConnect to Git\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eSelect your Git provider and repository\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"step-2-configure-build-settings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 2: Configure Build Settings\u003c/span\u003e \u003ca href=\"#step-2-configure-build-settings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSetting\u003c/th\u003e\n\u003cth\u003eValue\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eFramework preset\u003c/td\u003e\n\u003ctd\u003eNone\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuild command\u003c/td\u003e\n\u003ctd\u003eSee below\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuild output directory\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epublic\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRoot directory\u003c/td\u003e\n\u003ctd\u003e(leave empty)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eBuild Command:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -sSL https://go.dev/dl/go1.22.0.linux-amd64.tar.gz \u003cspan class=\"p\"\u003e|\u003c/span\u003e tar -xzf - \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e ./go/bin/go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e ~/go/bin/markata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"step-3-set-environment-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 3: Set Environment Variables\u003c/span\u003e \u003ca href=\"#step-3-set-environment-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eClick \u003cstrong\u003eEnvironment variables\u003c/strong\u003e and add:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eValue\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_URL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehttps://your-project.pages.dev\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eSet this for both \u003cstrong\u003eProduction\u003c/strong\u003e and \u003cstrong\u003ePreview\u003c/strong\u003e environments.\u003c/p\u003e\n\u003ch3 id=\"step-4-deploy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 4: Deploy\u003c/span\u003e \u003ca href=\"#step-4-deploy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eClick \u003cstrong\u003eSave and Deploy\u003c/strong\u003e. Cloudflare will build and deploy your site.\u003c/p\u003e\n\u003ch2 id=\"method-2-wrangler-cli\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMethod 2: Wrangler CLI\u003c/span\u003e \u003ca href=\"#method-2-wrangler-cli\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDeploy using the Wrangler CLI for more control:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Install wrangler\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpm install -g wrangler\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Login to Cloudflare\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewrangler login\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build your site locally\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com markata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create a new Pages project (first time)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewrangler pages project create my-site\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Deploy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewrangler pages deploy public --project-name\u003cspan class=\"o\"\u003e=\u003c/span\u003emy-site\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor subsequent deployments:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewrangler pages deploy public --project-name\u003cspan class=\"o\"\u003e=\u003c/span\u003emy-site\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"custom-domain-setup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Domain Setup\u003c/span\u003e \u003ca href=\"#custom-domain-setup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"step-1-add-domain-to-cloudflare\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 1: Add Domain to Cloudflare\u003c/span\u003e \u003ca href=\"#step-1-add-domain-to-cloudflare\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf your domain isn\u0026rsquo;t already on Cloudflare:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eGo to \u003cstrong\u003eWebsites\u003c/strong\u003e \u0026gt; \u003cstrong\u003eAdd a Site\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eEnter your domain\u003c/li\u003e\n\u003cli\u003eUpdate nameservers at your registrar to Cloudflare\u0026rsquo;s\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"step-2-connect-domain-to-pages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 2: Connect Domain to Pages\u003c/span\u003e \u003ca href=\"#step-2-connect-domain-to-pages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eGo to your Pages project\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eCustom domains\u003c/strong\u003e \u0026gt; \u003cstrong\u003eSet up a custom domain\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eEnter your domain (e.g., \u003ccode\u003eexample.com\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eActivate domain\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eCloudflare automatically configures DNS and provisions SSL certificates.\u003c/p\u003e\n\u003ch3 id=\"step-3-add-www-subdomain-optional\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 3: Add www Subdomain (Optional)\u003c/span\u003e \u003ca href=\"#step-3-add-www-subdomain-optional\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eAdd \u003ccode\u003ewww.example.com\u003c/code\u003e as another custom domain\u003c/li\u003e\n\u003cli\u003eOr create a redirect rule in \u003cstrong\u003eRules\u003c/strong\u003e \u0026gt; \u003cstrong\u003eRedirect Rules\u003c/strong\u003e:\n\u003cul\u003e\n\u003cli\u003eIf hostname equals \u003ccode\u003ewww.example.com\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eThen redirect to \u003ccode\u003ehttps://example.com\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"step-4-update-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 4: Update Configuration\u003c/span\u003e \u003ca href=\"#step-4-update-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUpdate your \u003ccode\u003emarkata-go.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"headers-and-redirects\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHeaders and Redirects\u003c/span\u003e \u003ca href=\"#headers-and-redirects\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"using-_headers-file\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing _headers File\u003c/span\u003e \u003ca href=\"#using-_headers-file\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003estatic/_headers\u003c/code\u003e (copied to output during build):\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e/*\n  X-Frame-Options: DENY\n  X-Content-Type-Options: nosniff\n  Referrer-Policy: strict-origin-when-cross-origin\n  Permissions-Policy: accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()\n\n/static/*\n  Cache-Control: public, max-age=31536000, immutable\n\n/*.html\n  Cache-Control: public, max-age=0, must-revalidate\n\n/*.xml\n  Cache-Control: public, max-age=3600\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"using-_redirects-file\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing _redirects File\u003c/span\u003e \u003ca href=\"#using-_redirects-file\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003estatic/_redirects\u003c/code\u003e:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e# Redirect old URLs\n/old-path/* /new-path/:splat 301\n/blog/old-post /blog/new-post 301\n\n# Proxy API requests\n/api/* https://api.example.com/:splat 200\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"preview-deployments\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePreview Deployments\u003c/span\u003e \u003ca href=\"#preview-deployments\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCloudflare Pages automatically creates preview deployments for:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEvery branch push\u003c/li\u003e\n\u003cli\u003eEvery pull request\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePreview URLs follow this pattern:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\u0026lt;commit-hash\u0026gt;.\u0026lt;project-name\u0026gt;.pages.dev\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou can also access branch-specific previews:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\u0026lt;branch-name\u0026gt;.\u0026lt;project-name\u0026gt;.pages.dev\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"workers-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWorkers Integration\u003c/span\u003e \u003ca href=\"#workers-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"adding-a-worker\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdding a Worker\u003c/span\u003e \u003ca href=\"#adding-a-worker\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003efunctions/\u003c/code\u003e directory for Pages Functions (Workers):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// functions/api/hello.js\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eexport\u003c/span\u003e \u003cspan class=\"kr\"\u003easync\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003eonRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eJSON\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estringify\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003emessage\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Hello from Cloudflare Workers!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}),\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Content-Type\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;application/json\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAccess at \u003ccode\u003e/api/hello\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"adding-middleware\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdding Middleware\u003c/span\u003e \u003ca href=\"#adding-middleware\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003efunctions/_middleware.js\u003c/code\u003e for all routes:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eexport\u003c/span\u003e \u003cspan class=\"kr\"\u003easync\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003eonRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e// Add security headers\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003eresponse\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kr\"\u003eawait\u003c/span\u003e \u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enext\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eresponse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;X-Custom-Header\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nx\"\u003eresponse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"environment-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment Variables\u003c/span\u003e \u003ca href=\"#environment-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"setting-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSetting Variables\u003c/span\u003e \u003ca href=\"#setting-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIn the Cloudflare dashboard:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eGo to your Pages project\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eSettings\u003c/strong\u003e \u0026gt; \u003cstrong\u003eEnvironment variables\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eAdd variables for \u003cstrong\u003eProduction\u003c/strong\u003e and \u003cstrong\u003ePreview\u003c/strong\u003e separately\u003c/li\u003e\n\u003c/ol\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eProduction\u003c/th\u003e\n\u003cth\u003ePreview\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_URL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehttps://example.com\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e(empty)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"accessing-in-workers\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAccessing in Workers\u003c/span\u003e \u003ca href=\"#accessing-in-workers\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// functions/api/config.js\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eexport\u003c/span\u003e \u003cspan class=\"kr\"\u003easync\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003eonRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eJSON\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estringify\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e \u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e}));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"build-fails-go-not-found\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Fails: Go Not Found\u003c/span\u003e \u003ca href=\"#build-fails-go-not-found\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe build environment doesn\u0026rsquo;t have Go pre-installed. Use the build command that installs Go:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -sSL https://go.dev/dl/go1.22.0.linux-amd64.tar.gz \u003cspan class=\"p\"\u003e|\u003c/span\u003e tar -xzf - \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e ./go/bin/go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e ~/go/bin/markata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"build-timeout\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Timeout\u003c/span\u003e \u003ca href=\"#build-timeout\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFree tier builds timeout after 20 minutes. Optimize by:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCaching Go installation (not currently supported)\u003c/li\u003e\n\u003cli\u003ePre-building locally and deploying:\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewrangler pages deploy public\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"404-on-subpages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e404 on Subpages\u003c/span\u003e \u003ca href=\"#404-on-subpages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnsure your \u003ccode\u003e_redirects\u003c/code\u003e file doesn\u0026rsquo;t interfere. Cloudflare Pages serves \u003ccode\u003eindex.html\u003c/code\u003e files automatically for clean URLs.\u003c/p\u003e\n\u003ch3 id=\"headers-not-applied\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHeaders Not Applied\u003c/span\u003e \u003ca href=\"#headers-not-applied\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eVerify \u003ccode\u003e_headers\u003c/code\u003e file is in your output directory:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecat public/_headers\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"custom-domain-not-working\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Domain Not Working\u003c/span\u003e \u003ca href=\"#custom-domain-not-working\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eEnsure domain is added to Cloudflare (not just Pages)\u003c/li\u003e\n\u003cli\u003eCheck DNS is proxied (orange cloud enabled)\u003c/li\u003e\n\u003cli\u003eWait for SSL certificate provisioning\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"performance-features\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePerformance Features\u003c/span\u003e \u003ca href=\"#performance-features\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"automatic-optimizations\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAutomatic Optimizations\u003c/span\u003e \u003ca href=\"#automatic-optimizations\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCloudflare Pages automatically provides:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eGlobal CDN distribution\u003c/li\u003e\n\u003cli\u003eBrotli compression\u003c/li\u003e\n\u003cli\u003eHTTP/2 and HTTP/3\u003c/li\u003e\n\u003cli\u003eEarly Hints\u003c/li\u003e\n\u003cli\u003eSmart caching\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"web-analytics\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWeb Analytics\u003c/span\u003e \u003ca href=\"#web-analytics\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnable Cloudflare Web Analytics (free):\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eGo to \u003cstrong\u003eAnalytics\u003c/strong\u003e in your Cloudflare dashboard\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eWeb Analytics\u003c/strong\u003e \u0026gt; \u003cstrong\u003eAdd a site\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eAdd the script to your template:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003edefer\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;https://static.cloudflareinsights.com/beacon.min.js\u0026#39;\u003c/span\u003e \u003cspan class=\"na\"\u003edata-cf-beacon\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;{\u0026#34;token\u0026#34;: \u0026#34;your-token\u0026#34;}\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"page-rules\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePage Rules\u003c/span\u003e \u003ca href=\"#page-rules\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate Page Rules for advanced caching:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eGo to \u003cstrong\u003eRules\u003c/strong\u003e \u0026gt; \u003cstrong\u003ePage Rules\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eCreate rules for your domain\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eExample: Cache everything for static assets:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eexample.com/static/*\nCache Level: Cache Everything\nEdge Cache TTL: 1 month\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"comparison-with-cloudflare-workers-sites\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComparison with Cloudflare Workers Sites\u003c/span\u003e \u003ca href=\"#comparison-with-cloudflare-workers-sites\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFeature\u003c/th\u003e\n\u003cth\u003ePages\u003c/th\u003e\n\u003cth\u003eWorkers Sites\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eGit integration\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePreview deploys\u003c/td\u003e\n\u003ctd\u003eAutomatic\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuild system\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003ctd\u003eExternal\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFunctions\u003c/td\u003e\n\u003ctd\u003ePages Functions\u003c/td\u003e\n\u003ctd\u003eWorkers\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBest for\u003c/td\u003e\n\u003ctd\u003eStatic sites\u003c/td\u003e\n\u003ctd\u003eDynamic apps\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003ePages is recommended for markata-go sites.\u003c/p\u003e\n\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext Steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://developers.cloudflare.com/pages/\"\u003eCloudflare Pages Docs\u003c/a\u003e - Official documentation\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"../configuration/\"\u003eConfiguration Guide\u003c/a\u003e - Customize your markata-go site\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"../feeds/\"\u003eFeeds Guide\u003c/a\u003e - Set up RSS and Atom feeds\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nCloudflare Pages provides fast global CDN deployment with unlimited bandwidth and Workers integration. It's an excellent choice for high-traffic sites.\n\n## Prerequisites\n\n- A Cloudflare account (free tier available)\n- Your markata-go site in a Git repository (GitHub or GitLab)\n\n## Cost\n\n| Tier | Bandwidth | Builds | Sites | Price |\n|------|-----------|--------|-------|-------|\n| Free | Unlimited | 500/mo | Unlimited | $0 |\n| Pro | Unlimited | 5,000/mo | Unlimited | $20/mo |\n| Business | Unlimited | 20,000/mo | Unlimited | $200/mo |\n\nThe free tier offers unlimited bandwidth, making it ideal for high-traffic sites.\n\n## Method 1: Git Integration (Recommended)\n\n### Step 1: Connect Repository\n\n1. Log in to the [Cloudflare Dashboard](https://dash.cloudflare.com)\n2. Go to **Workers \u0026 Pages** \u003e **Create application** \u003e **Pages**\n3. Click **Connect to Git**\n4. Select your Git provider and repository\n\n### Step 2: Configure Build Settings\n\n| Setting | Value |\n|---------|-------|\n| Framework preset | None |\n| Build command | See below |\n| Build output directory | `public` |\n| Root directory | (leave empty) |\n\n**Build Command:**\n```bash\ncurl -sSL https://go.dev/dl/go1.22.0.linux-amd64.tar.gz | tar -xzf - \u0026\u0026 ./go/bin/go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026\u0026 ~/go/bin/markata-go build --clean\n```\n\n### Step 3: Set Environment Variables\n\nClick **Environment variables** and add:\n\n| Variable | Value |\n|----------|-------|\n| `MARKATA_GO_URL` | `https://your-project.pages.dev` |\n\nSet this for both **Production** and **Preview** environments.\n\n### Step 4: Deploy\n\nClick **Save and Deploy**. Cloudflare will build and deploy your site.\n\n## Method 2: Wrangler CLI\n\nDeploy using the Wrangler CLI for more control:\n\n```bash\n# Install wrangler\nnpm install -g wrangler\n\n# Login to Cloudflare\nwrangler login\n\n# Build your site locally\nMARKATA_GO_URL=https://example.com markata-go build --clean\n\n# Create a new Pages project (first time)\nwrangler pages project create my-site\n\n# Deploy\nwrangler pages deploy public --project-name=my-site\n```\n\nFor subsequent deployments:\n\n```bash\nmarkata-go build --clean\nwrangler pages deploy public --project-name=my-site\n```\n\n## Custom Domain Setup\n\n### Step 1: Add Domain to Cloudflare\n\nIf your domain isn't already on Cloudflare:\n\n1. Go to **Websites** \u003e **Add a Site**\n2. Enter your domain\n3. Update nameservers at your registrar to Cloudflare's\n\n### Step 2: Connect Domain to Pages\n\n1. Go to your Pages project\n2. Click **Custom domains** \u003e **Set up a custom domain**\n3. Enter your domain (e.g., `example.com`)\n4. Click **Activate domain**\n\nCloudflare automatically configures DNS and provisions SSL certificates.\n\n### Step 3: Add www Subdomain (Optional)\n\n1. Add `www.example.com` as another custom domain\n2. Or create a redirect rule in **Rules** \u003e **Redirect Rules**:\n   - If hostname equals `www.example.com`\n   - Then redirect to `https://example.com`\n\n### Step 4: Update Configuration\n\nUpdate your `markata-go.toml`:\n\n```toml\n[markata-go]\nurl = \"https://example.com\"\n```\n\n## Headers and Redirects\n\n### Using _headers File\n\nCreate `static/_headers` (copied to output during build):\n\n```\n/*\n  X-Frame-Options: DENY\n  X-Content-Type-Options: nosniff\n  Referrer-Policy: strict-origin-when-cross-origin\n  Permissions-Policy: accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()\n\n/static/*\n  Cache-Control: public, max-age=31536000, immutable\n\n/*.html\n  Cache-Control: public, max-age=0, must-revalidate\n\n/*.xml\n  Cache-Control: public, max-age=3600\n```\n\n### Using _redirects File\n\nCreate `static/_redirects`:\n\n```\n# Redirect old URLs\n/old-path/* /new-path/:splat 301\n/blog/old-post /blog/new-post 301\n\n# Proxy API requests\n/api/* https://api.example.com/:splat 200\n```\n\n## Preview Deployments\n\nCloudflare Pages automatically creates preview deployments for:\n\n- Every branch push\n- Every pull request\n\nPreview URLs follow this pattern:\n```\n\u003ccommit-hash\u003e.\u003cproject-name\u003e.pages.dev\n```\n\nYou can also access branch-specific previews:\n```\n\u003cbranch-name\u003e.\u003cproject-name\u003e.pages.dev\n```\n\n## Workers Integration\n\n### Adding a Worker\n\nCreate `functions/` directory for Pages Functions (Workers):\n\n```javascript\n// functions/api/hello.js\nexport async function onRequest(context) {\n  return new Response(JSON.stringify({\n    message: \"Hello from Cloudflare Workers!\"\n  }), {\n    headers: { \"Content-Type\": \"application/json\" }\n  });\n}\n```\n\nAccess at `/api/hello`.\n\n### Adding Middleware\n\nCreate `functions/_middleware.js` for all routes:\n\n```javascript\nexport async function onRequest(context) {\n  // Add security headers\n  const response = await context.next();\n  response.headers.set(\"X-Custom-Header\", \"value\");\n  return response;\n}\n```\n\n## Environment Variables\n\n### Setting Variables\n\nIn the Cloudflare dashboard:\n\n1. Go to your Pages project\n2. Click **Settings** \u003e **Environment variables**\n3. Add variables for **Production** and **Preview** separately\n\n| Variable | Production | Preview |\n|----------|------------|---------|\n| `MARKATA_GO_URL` | `https://example.com` | (empty) |\n\n### Accessing in Workers\n\n```javascript\n// functions/api/config.js\nexport async function onRequest(context) {\n  const url = context.env.MARKATA_GO_URL;\n  return new Response(JSON.stringify({ url }));\n}\n```\n\n## Troubleshooting\n\n### Build Fails: Go Not Found\n\nThe build environment doesn't have Go pre-installed. Use the build command that installs Go:\n\n```bash\ncurl -sSL https://go.dev/dl/go1.22.0.linux-amd64.tar.gz | tar -xzf - \u0026\u0026 ./go/bin/go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026\u0026 ~/go/bin/markata-go build --clean\n```\n\n### Build Timeout\n\nFree tier builds timeout after 20 minutes. Optimize by:\n\n1. Caching Go installation (not currently supported)\n2. Pre-building locally and deploying:\n   ```bash\n   markata-go build --clean\n   wrangler pages deploy public\n   ```\n\n### 404 on Subpages\n\nEnsure your `_redirects` file doesn't interfere. Cloudflare Pages serves `index.html` files automatically for clean URLs.\n\n### Headers Not Applied\n\nVerify `_headers` file is in your output directory:\n\n```bash\nmarkata-go build --clean\ncat public/_headers\n```\n\n### Custom Domain Not Working\n\n1. Ensure domain is added to Cloudflare (not just Pages)\n2. Check DNS is proxied (orange cloud enabled)\n3. Wait for SSL certificate provisioning\n\n## Performance Features\n\n### Automatic Optimizations\n\nCloudflare Pages automatically provides:\n\n- Global CDN distribution\n- Brotli compression\n- HTTP/2 and HTTP/3\n- Early Hints\n- Smart caching\n\n### Web Analytics\n\nEnable Cloudflare Web Analytics (free):\n\n1. Go to **Analytics** in your Cloudflare dashboard\n2. Click **Web Analytics** \u003e **Add a site**\n3. Add the script to your template:\n\n```html\n\u003cscript defer src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{\"token\": \"your-token\"}'\u003e\u003c/script\u003e\n```\n\n### Page Rules\n\nCreate Page Rules for advanced caching:\n\n1. Go to **Rules** \u003e **Page Rules**\n2. Create rules for your domain\n\nExample: Cache everything for static assets:\n```\nexample.com/static/*\nCache Level: Cache Everything\nEdge Cache TTL: 1 month\n```\n\n## Comparison with Cloudflare Workers Sites\n\n| Feature | Pages | Workers Sites |\n|---------|-------|---------------|\n| Git integration | Yes | No |\n| Preview deploys | Automatic | Manual |\n| Build system | Built-in | External |\n| Functions | Pages Functions | Workers |\n| Best for | Static sites | Dynamic apps |\n\nPages is recommended for markata-go sites.\n\n## Next Steps\n\n- [Cloudflare Pages Docs](https://developers.cloudflare.com/pages/) - Official documentation\n- [Configuration Guide](../configuration/) - Customize your markata-go site\n- [Feeds Guide](../feeds/) - Set up RSS and Atom feeds\n",
      "summary": "Step-by-step guide to deploy markata-go sites on Cloudflare Pages",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "documentation",
        "deployment",
        "cloudflare-pages"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/deployment/aws-s3/",
      "url": "https://markata.dev/docs/guides/deployment/aws-s3/",
      "title": "Deploy to AWS S3",
      "content_html": "\u003cp\u003eAmazon S3 provides highly durable object storage that\u0026rsquo;s ideal for hosting static websites. Combined with CloudFront CDN, it offers enterprise-grade performance and security.\u003c/p\u003e\n\u003ch2 id=\"prerequisites\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrerequisites\u003c/span\u003e \u003ca href=\"#prerequisites\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAn AWS account\u003c/li\u003e\n\u003cli\u003eAWS CLI installed and configured\u003c/li\u003e\n\u003cli\u003eYour markata-go site ready to build\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"cost\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCost\u003c/span\u003e \u003ca href=\"#cost\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eService\u003c/th\u003e\n\u003cth\u003eFree Tier\u003c/th\u003e\n\u003cth\u003eAfter Free Tier\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eS3 Storage\u003c/td\u003e\n\u003ctd\u003e5 GB (12 months)\u003c/td\u003e\n\u003ctd\u003e~$0.023/GB/month\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eS3 Requests\u003c/td\u003e\n\u003ctd\u003e20,000 GET (12 months)\u003c/td\u003e\n\u003ctd\u003e~$0.0004/1000 requests\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCloudFront\u003c/td\u003e\n\u003ctd\u003e1 TB transfer (12 months)\u003c/td\u003e\n\u003ctd\u003e~$0.085/GB\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRoute 53\u003c/td\u003e\n\u003ctd\u003eN/A\u003c/td\u003e\n\u003ctd\u003e$0.50/hosted zone/month\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eA typical blog costs $1-5/month after the free tier expires.\u003c/p\u003e\n\u003ch2 id=\"architecture-options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eArchitecture Options\u003c/span\u003e \u003ca href=\"#architecture-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSetup\u003c/th\u003e\n\u003cth\u003eComplexity\u003c/th\u003e\n\u003cth\u003eHTTPS\u003c/th\u003e\n\u003cth\u003eCustom Domain\u003c/th\u003e\n\u003cth\u003eCDN\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eS3 only\u003c/td\u003e\n\u003ctd\u003eLow\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eLimited\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eS3 + CloudFront\u003c/td\u003e\n\u003ctd\u003eMedium\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eS3 + CloudFront + Route 53\u003c/td\u003e\n\u003ctd\u003eHigh\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes (apex)\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThis guide covers the recommended S3 + CloudFront setup.\u003c/p\u003e\n\u003ch2 id=\"step-1-create-s3-bucket\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 1: Create S3 Bucket\u003c/span\u003e \u003ca href=\"#step-1-create-s3-bucket\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"using-aws-console\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing AWS Console\u003c/span\u003e \u003ca href=\"#using-aws-console\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eGo to \u003ca href=\"https://s3.console.aws.amazon.com/\"\u003eS3 Console\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eCreate bucket\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eEnter bucket name (e.g., \u003ccode\u003emy-site-bucket\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eChoose a region close to your audience\u003c/li\u003e\n\u003cli\u003eUncheck \u003cstrong\u003eBlock all public access\u003c/strong\u003e (we\u0026rsquo;ll use CloudFront for access)\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eCreate bucket\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"using-aws-cli\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing AWS CLI\u003c/span\u003e \u003ca href=\"#using-aws-cli\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create bucket\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eaws s3 mb s3://my-site-bucket --region us-east-1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Enable static website hosting\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eaws s3 website s3://my-site-bucket --index-document index.html --error-document 404.html\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"step-2-configure-bucket-policy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 2: Configure Bucket Policy\u003c/span\u003e \u003ca href=\"#step-2-configure-bucket-policy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCreate a bucket policy to allow CloudFront access:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;Version\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2012-10-17\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;Statement\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Sid\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;AllowCloudFrontAccess\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Effect\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Allow\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Principal\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;Service\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cloudfront.amazonaws.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Action\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;s3:GetObject\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Resource\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;arn:aws:s3:::my-site-bucket/*\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Condition\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;StringEquals\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;AWS:SourceArn\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou\u0026rsquo;ll update this policy after creating the CloudFront distribution.\u003c/p\u003e\n\u003ch2 id=\"step-3-create-cloudfront-distribution\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 3: Create CloudFront Distribution\u003c/span\u003e \u003ca href=\"#step-3-create-cloudfront-distribution\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"using-aws-console-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing AWS Console\u003c/span\u003e \u003ca href=\"#using-aws-console-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eGo to \u003ca href=\"https://console.aws.amazon.com/cloudfront/\"\u003eCloudFront Console\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eCreate distribution\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eConfigure origin:\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eOrigin domain\u003c/strong\u003e: Select your S3 bucket\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOrigin access\u003c/strong\u003e: Origin access control settings (recommended)\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eCreate control setting\u003c/strong\u003e \u0026gt; Create\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eConfigure default cache behavior:\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eViewer protocol policy\u003c/strong\u003e: Redirect HTTP to HTTPS\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAllowed HTTP methods\u003c/strong\u003e: GET, HEAD\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCache policy\u003c/strong\u003e: CachingOptimized\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eConfigure settings:\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ePrice class\u003c/strong\u003e: Use all edge locations (or choose based on audience)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDefault root object\u003c/strong\u003e: \u003ccode\u003eindex.html\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eCreate distribution\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"update-s3-bucket-policy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUpdate S3 Bucket Policy\u003c/span\u003e \u003ca href=\"#update-s3-bucket-policy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAfter creating the distribution, update the bucket policy with the correct ARN:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Get distribution ARN from CloudFront console\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Update bucket policy with the distribution ARN\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"step-4-build-and-deploy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 4: Build and Deploy\u003c/span\u003e \u003ca href=\"#step-4-build-and-deploy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"build-your-site\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Your Site\u003c/span\u003e \u003ca href=\"#build-your-site\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Set the CloudFront URL (or custom domain)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://d1234abcd.cloudfront.net\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"deploy-to-s3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeploy to S3\u003c/span\u003e \u003ca href=\"#deploy-to-s3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Sync all files\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eaws s3 sync public/ s3://my-site-bucket --delete\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# With cache headers for static assets\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eaws s3 sync public/static/ s3://my-site-bucket/static/ \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --cache-control \u003cspan class=\"s2\"\u003e\u0026#34;public, max-age=31536000, immutable\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# HTML files with no-cache\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eaws s3 sync public/ s3://my-site-bucket \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --exclude \u003cspan class=\"s2\"\u003e\u0026#34;static/*\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --cache-control \u003cspan class=\"s2\"\u003e\u0026#34;public, max-age=0, must-revalidate\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"invalidate-cloudfront-cache\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInvalidate CloudFront Cache\u003c/span\u003e \u003ca href=\"#invalidate-cloudfront-cache\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAfter deploying, invalidate the cache to see changes immediately:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eaws cloudfront create-invalidation \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --distribution-id YOUR_DISTRIBUTION_ID \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --paths \u003cspan class=\"s2\"\u003e\u0026#34;/*\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"step-5-custom-domain-setup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep 5: Custom Domain Setup\u003c/span\u003e \u003ca href=\"#step-5-custom-domain-setup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"option-a-using-route-53-recommended\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOption A: Using Route 53 (Recommended)\u003c/span\u003e \u003ca href=\"#option-a-using-route-53-recommended\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCreate Hosted Zone\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eaws route53 create-hosted-zone --name example.com --caller-reference \u003cspan class=\"k\"\u003e$(\u003c/span\u003edate +%s\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUpdate Domain Nameservers\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eGet the nameservers from Route 53 and update them at your registrar.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eRequest SSL Certificate\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eIn AWS Certificate Manager (ACM) - \u003cstrong\u003emust be in us-east-1 for CloudFront\u003c/strong\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eaws acm request-certificate \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --domain-name example.com \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --subject-alternative-names \u003cspan class=\"s2\"\u003e\u0026#34;*.example.com\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --validation-method DNS \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --region us-east-1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eAdd Certificate to CloudFront\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eUpdate your distribution:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eAlternate domain names\u003c/strong\u003e: \u003ccode\u003eexample.com\u003c/code\u003e, \u003ccode\u003ewww.example.com\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCustom SSL certificate\u003c/strong\u003e: Select your ACM certificate\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCreate DNS Records\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eIn Route 53, create A records as aliases to your CloudFront distribution.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"option-b-external-dns\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOption B: External DNS\u003c/span\u003e \u003ca href=\"#option-b-external-dns\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eRequest ACM certificate (as above)\u003c/li\u003e\n\u003cli\u003eValidate via DNS by adding CNAME records at your registrar\u003c/li\u003e\n\u003cli\u003eAdd alternate domain names to CloudFront\u003c/li\u003e\n\u003cli\u003eCreate CNAME record pointing to your CloudFront domain:\n\u003cpre\u003e\u003ccode\u003ewww.example.com -\u0026gt; d1234abcd.cloudfront.net\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eNote: Apex domains (example.com without www) require Route 53 or a DNS provider that supports ALIAS/ANAME records.\u003c/p\u003e\n\u003ch2 id=\"automation-with-github-actions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAutomation with GitHub Actions\u003c/span\u003e \u003ca href=\"#automation-with-github-actions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCreate \u003ccode\u003e.github/workflows/deploy.yml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy to AWS\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eAWS_REGION\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eus-east-1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eS3_BUCKET\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emy-site-bucket\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eCLOUDFRONT_DISTRIBUTION_ID\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eE1234567890ABC\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edeploy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epermissions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eid-token\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eread\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-go@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ego-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1.22\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eConfigure AWS credentials\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eaws-actions/configure-aws-credentials@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003erole-to-assume\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003earn:aws:iam::ACCOUNT_ID:role/GitHubActionsRole\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eaws-region\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ env.AWS_REGION }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          markata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy to S3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          # Static assets with long cache\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          aws s3 sync public/static/ s3://${{ env.S3_BUCKET }}/static/ \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --cache-control \u0026#34;public, max-age=31536000, immutable\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          # Everything else\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          aws s3 sync public/ s3://${{ env.S3_BUCKET }} \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --exclude \u0026#34;static/*\u0026#34; \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --cache-control \u0026#34;public, max-age=0, must-revalidate\u0026#34; \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --delete\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInvalidate CloudFront\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          aws cloudfront create-invalidation \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --distribution-id ${{ env.CLOUDFRONT_DISTRIBUTION_ID }} \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --paths \u0026#34;/*\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"iam-role-for-github-actions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIAM Role for GitHub Actions\u003c/span\u003e \u003ca href=\"#iam-role-for-github-actions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate an IAM role with OIDC trust for GitHub:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;Version\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2012-10-17\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;Statement\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Effect\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Allow\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Principal\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;Federated\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;arn:aws:iam::ACCOUNT_ID:oidc-provider/token.actions.githubusercontent.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Action\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;sts:AssumeRoleWithWebIdentity\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Condition\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;StringEquals\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;token.actions.githubusercontent.com:aud\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;sts.amazonaws.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;StringLike\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;token.actions.githubusercontent.com:sub\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;repo:YOUR_ORG/YOUR_REPO:*\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAttach a policy allowing S3 and CloudFront access:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;Version\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2012-10-17\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;Statement\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Effect\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Allow\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Action\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;s3:PutObject\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;s3:GetObject\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;s3:DeleteObject\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;s3:ListBucket\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Resource\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;arn:aws:s3:::my-site-bucket\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;arn:aws:s3:::my-site-bucket/*\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Effect\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Allow\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Action\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cloudfront:CreateInvalidation\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;Resource\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"access-denied-errors\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAccess Denied Errors\u003c/span\u003e \u003ca href=\"#access-denied-errors\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eCheck bucket policy allows CloudFront access\u003c/li\u003e\n\u003cli\u003eVerify Origin Access Control is configured\u003c/li\u003e\n\u003cli\u003eEnsure the distribution ARN in bucket policy is correct\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"404-on-subpages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e404 on Subpages\u003c/span\u003e \u003ca href=\"#404-on-subpages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigure CloudFront error pages:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eGo to your distribution \u0026gt; \u003cstrong\u003eError pages\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eCreate custom error response:\n\u003cul\u003e\n\u003cli\u003eHTTP error code: 403\u003c/li\u003e\n\u003cli\u003eResponse page path: \u003ccode\u003e/index.html\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eHTTP response code: 200\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eOr use a CloudFront Function for clean URLs (see below).\u003c/p\u003e\n\u003ch3 id=\"cloudfront-function-for-clean-urls\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCloudFront Function for Clean URLs\u003c/span\u003e \u003ca href=\"#cloudfront-function-for-clean-urls\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate a function to handle clean URLs:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003ehandler\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003erequest\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003euri\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003euri\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e// Check whether the URI is missing a file extension\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003euri\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eincludes\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;.\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e// If URI doesn\u0026#39;t end with /, add it\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003euri\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eendsWith\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003euri\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e// Append index.html\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003euri\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003euri\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;index.html\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nx\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAttach to your distribution\u0026rsquo;s viewer request.\u003c/p\u003e\n\u003ch3 id=\"changes-not-appearing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChanges Not Appearing\u003c/span\u003e \u003ca href=\"#changes-not-appearing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eWait for CloudFront cache to expire, or\u003c/li\u003e\n\u003cli\u003eCreate a cache invalidation:\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eaws cloudfront create-invalidation \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --distribution-id YOUR_DISTRIBUTION_ID \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --paths \u003cspan class=\"s2\"\u003e\u0026#34;/*\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"ssl-certificate-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSSL Certificate Issues\u003c/span\u003e \u003ca href=\"#ssl-certificate-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eACM certificate must be in \u003cstrong\u003eus-east-1\u003c/strong\u003e region\u003c/li\u003e\n\u003cli\u003eCertificate must be validated (check ACM console)\u003c/li\u003e\n\u003cli\u003eAlternate domain names must match certificate\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"cost-optimization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCost Optimization\u003c/span\u003e \u003ca href=\"#cost-optimization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"reduce-cloudfront-costs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReduce CloudFront Costs\u003c/span\u003e \u003ca href=\"#reduce-cloudfront-costs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUse \u003cstrong\u003ePrice Class 100\u003c/strong\u003e (North America and Europe only) for regional sites\u003c/li\u003e\n\u003cli\u003eEnable \u003cstrong\u003eCompress objects automatically\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eSet appropriate cache TTLs\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"reduce-s3-costs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReduce S3 Costs\u003c/span\u003e \u003ca href=\"#reduce-s3-costs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eEnable \u003cstrong\u003eS3 Intelligent-Tiering\u003c/strong\u003e for rarely accessed sites\u003c/li\u003e\n\u003cli\u003eUse \u003cstrong\u003eS3 Standard\u003c/strong\u003e for frequently accessed content\u003c/li\u003e\n\u003cli\u003eClean up old versions if versioning is enabled\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"monitor-costs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMonitor Costs\u003c/span\u003e \u003ca href=\"#monitor-costs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSet up AWS Budgets to alert you:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eaws budgets create-budget \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --account-id YOUR_ACCOUNT_ID \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --budget file://budget.json \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --notifications-with-subscribers file://notifications.json\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext Steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.aws.amazon.com/s3/\"\u003eAWS S3 Docs\u003c/a\u003e - Official S3 documentation\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.aws.amazon.com/cloudfront/\"\u003eCloudFront Docs\u003c/a\u003e - CDN configuration\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"../configuration/\"\u003eConfiguration Guide\u003c/a\u003e - Customize your markata-go site\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nAmazon S3 provides highly durable object storage that's ideal for hosting static websites. Combined with CloudFront CDN, it offers enterprise-grade performance and security.\n\n## Prerequisites\n\n- An AWS account\n- AWS CLI installed and configured\n- Your markata-go site ready to build\n\n## Cost\n\n| Service | Free Tier | After Free Tier |\n|---------|-----------|-----------------|\n| S3 Storage | 5 GB (12 months) | ~$0.023/GB/month |\n| S3 Requests | 20,000 GET (12 months) | ~$0.0004/1000 requests |\n| CloudFront | 1 TB transfer (12 months) | ~$0.085/GB |\n| Route 53 | N/A | $0.50/hosted zone/month |\n\nA typical blog costs $1-5/month after the free tier expires.\n\n## Architecture Options\n\n| Setup | Complexity | HTTPS | Custom Domain | CDN |\n|-------|------------|-------|---------------|-----|\n| S3 only | Low | No | Limited | No |\n| S3 + CloudFront | Medium | Yes | Yes | Yes |\n| S3 + CloudFront + Route 53 | High | Yes | Yes (apex) | Yes |\n\nThis guide covers the recommended S3 + CloudFront setup.\n\n## Step 1: Create S3 Bucket\n\n### Using AWS Console\n\n1. Go to [S3 Console](https://s3.console.aws.amazon.com/)\n2. Click **Create bucket**\n3. Enter bucket name (e.g., `my-site-bucket`)\n4. Choose a region close to your audience\n5. Uncheck **Block all public access** (we'll use CloudFront for access)\n6. Click **Create bucket**\n\n### Using AWS CLI\n\n```bash\n# Create bucket\naws s3 mb s3://my-site-bucket --region us-east-1\n\n# Enable static website hosting\naws s3 website s3://my-site-bucket --index-document index.html --error-document 404.html\n```\n\n## Step 2: Configure Bucket Policy\n\nCreate a bucket policy to allow CloudFront access:\n\n```json\n{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Sid\": \"AllowCloudFrontAccess\",\n      \"Effect\": \"Allow\",\n      \"Principal\": {\n        \"Service\": \"cloudfront.amazonaws.com\"\n      },\n      \"Action\": \"s3:GetObject\",\n      \"Resource\": \"arn:aws:s3:::my-site-bucket/*\",\n      \"Condition\": {\n        \"StringEquals\": {\n          \"AWS:SourceArn\": \"arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID\"\n        }\n      }\n    }\n  ]\n}\n```\n\nYou'll update this policy after creating the CloudFront distribution.\n\n## Step 3: Create CloudFront Distribution\n\n### Using AWS Console\n\n1. Go to [CloudFront Console](https://console.aws.amazon.com/cloudfront/)\n2. Click **Create distribution**\n3. Configure origin:\n   - **Origin domain**: Select your S3 bucket\n   - **Origin access**: Origin access control settings (recommended)\n   - Click **Create control setting** \u003e Create\n4. Configure default cache behavior:\n   - **Viewer protocol policy**: Redirect HTTP to HTTPS\n   - **Allowed HTTP methods**: GET, HEAD\n   - **Cache policy**: CachingOptimized\n5. Configure settings:\n   - **Price class**: Use all edge locations (or choose based on audience)\n   - **Default root object**: `index.html`\n6. Click **Create distribution**\n\n### Update S3 Bucket Policy\n\nAfter creating the distribution, update the bucket policy with the correct ARN:\n\n```bash\n# Get distribution ARN from CloudFront console\n# Update bucket policy with the distribution ARN\n```\n\n## Step 4: Build and Deploy\n\n### Build Your Site\n\n```bash\n# Set the CloudFront URL (or custom domain)\nexport MARKATA_GO_URL=https://d1234abcd.cloudfront.net\n\n# Build\nmarkata-go build --clean\n```\n\n### Deploy to S3\n\n```bash\n# Sync all files\naws s3 sync public/ s3://my-site-bucket --delete\n\n# With cache headers for static assets\naws s3 sync public/static/ s3://my-site-bucket/static/ \\\n  --cache-control \"public, max-age=31536000, immutable\"\n\n# HTML files with no-cache\naws s3 sync public/ s3://my-site-bucket \\\n  --exclude \"static/*\" \\\n  --cache-control \"public, max-age=0, must-revalidate\"\n```\n\n### Invalidate CloudFront Cache\n\nAfter deploying, invalidate the cache to see changes immediately:\n\n```bash\naws cloudfront create-invalidation \\\n  --distribution-id YOUR_DISTRIBUTION_ID \\\n  --paths \"/*\"\n```\n\n## Step 5: Custom Domain Setup\n\n### Option A: Using Route 53 (Recommended)\n\n1. **Create Hosted Zone**\n   ```bash\n   aws route53 create-hosted-zone --name example.com --caller-reference $(date +%s)\n   ```\n\n2. **Update Domain Nameservers**\n   \n   Get the nameservers from Route 53 and update them at your registrar.\n\n3. **Request SSL Certificate**\n   \n   In AWS Certificate Manager (ACM) - **must be in us-east-1 for CloudFront**:\n   ```bash\n   aws acm request-certificate \\\n     --domain-name example.com \\\n     --subject-alternative-names \"*.example.com\" \\\n     --validation-method DNS \\\n     --region us-east-1\n   ```\n\n4. **Add Certificate to CloudFront**\n   \n   Update your distribution:\n   - **Alternate domain names**: `example.com`, `www.example.com`\n   - **Custom SSL certificate**: Select your ACM certificate\n\n5. **Create DNS Records**\n   \n   In Route 53, create A records as aliases to your CloudFront distribution.\n\n### Option B: External DNS\n\n1. Request ACM certificate (as above)\n2. Validate via DNS by adding CNAME records at your registrar\n3. Add alternate domain names to CloudFront\n4. Create CNAME record pointing to your CloudFront domain:\n   ```\n   www.example.com -\u003e d1234abcd.cloudfront.net\n   ```\n\nNote: Apex domains (example.com without www) require Route 53 or a DNS provider that supports ALIAS/ANAME records.\n\n## Automation with GitHub Actions\n\nCreate `.github/workflows/deploy.yml`:\n\n```yaml\nname: Deploy to AWS\n\non:\n  push:\n    branches: [main]\n\nenv:\n  AWS_REGION: us-east-1\n  S3_BUCKET: my-site-bucket\n  CLOUDFRONT_DISTRIBUTION_ID: E1234567890ABC\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    permissions:\n      id-token: write\n      contents: read\n    \n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Setup Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: '1.22'\n\n      - name: Configure AWS credentials\n        uses: aws-actions/configure-aws-credentials@v4\n        with:\n          role-to-assume: arn:aws:iam::ACCOUNT_ID:role/GitHubActionsRole\n          aws-region: ${{ env.AWS_REGION }}\n\n      - name: Build\n        run: |\n          go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n          markata-go build --clean\n        env:\n          MARKATA_GO_URL: https://example.com\n\n      - name: Deploy to S3\n        run: |\n          # Static assets with long cache\n          aws s3 sync public/static/ s3://${{ env.S3_BUCKET }}/static/ \\\n            --cache-control \"public, max-age=31536000, immutable\"\n          \n          # Everything else\n          aws s3 sync public/ s3://${{ env.S3_BUCKET }} \\\n            --exclude \"static/*\" \\\n            --cache-control \"public, max-age=0, must-revalidate\" \\\n            --delete\n\n      - name: Invalidate CloudFront\n        run: |\n          aws cloudfront create-invalidation \\\n            --distribution-id ${{ env.CLOUDFRONT_DISTRIBUTION_ID }} \\\n            --paths \"/*\"\n```\n\n### IAM Role for GitHub Actions\n\nCreate an IAM role with OIDC trust for GitHub:\n\n```json\n{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Principal\": {\n        \"Federated\": \"arn:aws:iam::ACCOUNT_ID:oidc-provider/token.actions.githubusercontent.com\"\n      },\n      \"Action\": \"sts:AssumeRoleWithWebIdentity\",\n      \"Condition\": {\n        \"StringEquals\": {\n          \"token.actions.githubusercontent.com:aud\": \"sts.amazonaws.com\"\n        },\n        \"StringLike\": {\n          \"token.actions.githubusercontent.com:sub\": \"repo:YOUR_ORG/YOUR_REPO:*\"\n        }\n      }\n    }\n  ]\n}\n```\n\nAttach a policy allowing S3 and CloudFront access:\n\n```json\n{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"s3:PutObject\",\n        \"s3:GetObject\",\n        \"s3:DeleteObject\",\n        \"s3:ListBucket\"\n      ],\n      \"Resource\": [\n        \"arn:aws:s3:::my-site-bucket\",\n        \"arn:aws:s3:::my-site-bucket/*\"\n      ]\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": \"cloudfront:CreateInvalidation\",\n      \"Resource\": \"arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID\"\n    }\n  ]\n}\n```\n\n## Troubleshooting\n\n### Access Denied Errors\n\n1. Check bucket policy allows CloudFront access\n2. Verify Origin Access Control is configured\n3. Ensure the distribution ARN in bucket policy is correct\n\n### 404 on Subpages\n\nConfigure CloudFront error pages:\n\n1. Go to your distribution \u003e **Error pages**\n2. Create custom error response:\n   - HTTP error code: 403\n   - Response page path: `/index.html`\n   - HTTP response code: 200\n\nOr use a CloudFront Function for clean URLs (see below).\n\n### CloudFront Function for Clean URLs\n\nCreate a function to handle clean URLs:\n\n```javascript\nfunction handler(event) {\n  var request = event.request;\n  var uri = request.uri;\n  \n  // Check whether the URI is missing a file extension\n  if (!uri.includes('.')) {\n    // If URI doesn't end with /, add it\n    if (!uri.endsWith('/')) {\n      uri += '/';\n    }\n    // Append index.html\n    request.uri = uri + 'index.html';\n  }\n  \n  return request;\n}\n```\n\nAttach to your distribution's viewer request.\n\n### Changes Not Appearing\n\n1. Wait for CloudFront cache to expire, or\n2. Create a cache invalidation:\n   ```bash\n   aws cloudfront create-invalidation \\\n     --distribution-id YOUR_DISTRIBUTION_ID \\\n     --paths \"/*\"\n   ```\n\n### SSL Certificate Issues\n\n- ACM certificate must be in **us-east-1** region\n- Certificate must be validated (check ACM console)\n- Alternate domain names must match certificate\n\n## Cost Optimization\n\n### Reduce CloudFront Costs\n\n- Use **Price Class 100** (North America and Europe only) for regional sites\n- Enable **Compress objects automatically**\n- Set appropriate cache TTLs\n\n### Reduce S3 Costs\n\n- Enable **S3 Intelligent-Tiering** for rarely accessed sites\n- Use **S3 Standard** for frequently accessed content\n- Clean up old versions if versioning is enabled\n\n### Monitor Costs\n\nSet up AWS Budgets to alert you:\n\n```bash\naws budgets create-budget \\\n  --account-id YOUR_ACCOUNT_ID \\\n  --budget file://budget.json \\\n  --notifications-with-subscribers file://notifications.json\n```\n\n## Next Steps\n\n- [AWS S3 Docs](https://docs.aws.amazon.com/s3/) - Official S3 documentation\n- [CloudFront Docs](https://docs.aws.amazon.com/cloudfront/) - CDN configuration\n- [Configuration Guide](../configuration/) - Customize your markata-go site\n",
      "summary": "Step-by-step guide to deploy markata-go sites on AWS S3 with CloudFront",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "documentation",
        "deployment",
        "aws-s3"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/configuration/",
      "url": "https://markata.dev/docs/guides/configuration/",
      "title": "Configuration Reference",
      "content_html": "\u003ch2 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go uses a flexible configuration system that supports multiple file formats, environment variable overrides, and intelligent merging from multiple sources.\u003c/p\u003e\n\u003ch2 id=\"chart-data-disclosures\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChart data disclosures\u003c/span\u003e \u003ca href=\"#chart-data-disclosures\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003e[markata-go.chartjs] data_display = \u0026quot;open\u0026quot;\u003c/code\u003e keeps chart data expanded before\nJavaScript initializes (the default). Set it to \u003ccode\u003e\u0026quot;collapsed\u0026quot;\u003c/code\u003e for a compact\ninitial view. Per-chart top-level JSON \u003ccode\u003edata_display\u003c/code\u003e overrides this default.\nThe summary stays usable without JavaScript. See\n\u003ca href=\"markdown-chart-fallback.md\"\u003echart figures and fallbacks\u003c/a\u003e for titles, captions,\nand examples.\u003c/p\u003e\n\u003ch2 id=\"compose-config-files\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCompose Config Files\u003c/span\u003e \u003ca href=\"#compose-config-files\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse \u003ccode\u003einclude\u003c/code\u003e when one config file gets too large.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Example Site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;config/common/*.toml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;config/feeds/*.toml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;config/rss.toml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRules:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epaths are resolved relative to the file that declared the include\u003c/li\u003e\n\u003cli\u003eexplicit files are loaded as written\u003c/li\u003e\n\u003cli\u003eglob matches are loaded in lexicographic order\u003c/li\u003e\n\u003cli\u003erepeated includes are loaded once\u003c/li\u003e\n\u003cli\u003ecycles fail with a clear error\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"edit-settings-while-serving\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEdit Settings While Serving\u003c/span\u003e \u003ca href=\"#edit-settings-while-serving\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhile \u003ccode\u003emarkata-go serve\u003c/code\u003e is running, every page has a small gear button in the bottom-left corner (or press \u003ccode\u003eAlt+,\u003c/code\u003e). It opens a \u003cstrong\u003eSite settings\u003c/strong\u003e sidebar listing every config option with its current value and description. Change a setting and the site rebuilds and reloads with it right away. The change is only a preview until you click \u003cstrong\u003eBake\u003c/strong\u003e to write it into your config, or \u003cstrong\u003eReset\u003c/strong\u003e to throw it away. \u003ccode\u003emarkata-go build\u003c/code\u003e never includes the sidebar, so published sites don\u0026rsquo;t have it. The sidebar and Bake only accept changes from the machine running \u003ccode\u003eserve\u003c/code\u003e; if you bind to \u003ccode\u003e--host 0.0.0.0\u003c/code\u003e to test on a phone, the phone can browse but cannot edit settings.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eRun \u003ccode\u003emarkata-go serve\u003c/code\u003e and open the site.\u003c/li\u003e\n\u003cli\u003eClick the gear. The \u003cstrong\u003eCommon\u003c/strong\u003e section at the top has the settings most sites change (title, URL, palettes, style, font, nav, footer). Search to find anything else, for example \u003ccode\u003eitems_per_page\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eChange a value. Text fields apply when you press Enter or leave the field; dropdowns, checkboxes, and numbers apply right away. The status line shows \u003cstrong\u003eRebuilding… 3s\u003c/strong\u003e until the build finishes, then the page reloads with the change and the sidebar stays open where you left it. If the build fails, the error is shown instead.\u003c/li\u003e\n\u003cli\u003eKeep going. Changed rows are highlighted, and \u003cstrong\u003eRevert\u003c/strong\u003e undoes one field. \u003cstrong\u003eReset to default\u003c/strong\u003e removes a setting from your config so it falls back to the default shown on the row. While the sidebar is closed, a small \u003cstrong\u003ePreviewing N unsaved changes · Reset · Review\u003c/strong\u003e bar next to the gear reminds you the site is showing unsaved changes.\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eBake\u003c/strong\u003e to keep them. The sidebar shows the exact diff for every file it will edit (secret values are hidden). Click \u003cstrong\u003eWrite\u003c/strong\u003e to save, or \u003cstrong\u003eCancel\u003c/strong\u003e. The server writes the files, rebuilds, and live-reloads.\u003c/li\u003e\n\u003cli\u003eOr click \u003cstrong\u003eReset\u003c/strong\u003e to drop every unsaved change and go back to what your config files say.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003ePreviews live in the serve process\u0026rsquo;s memory only. Your files don\u0026rsquo;t change until you bake. If you restart \u003ccode\u003emarkata-go serve\u003c/code\u003e, the sidebar re-applies the edits you had staged in that browser tab. While a preview is active, builds use a separate cache in \u003ccode\u003e.markata/serve-preview/\u003c/code\u003e, so previewing never throws away your site\u0026rsquo;s warm build cache.\u003c/p\u003e\n\u003cp\u003eIf you changed the theme with the theme picker, the picker\u0026rsquo;s choice is saved in your browser and would hide a palette, style, font, text size, or color mode preview. Previewing one of those settings clears the matching picker choice, and the status line tells you it did.\u003c/p\u003e\n\u003cp\u003eWhen you run \u003ccode\u003emarkata-go serve \u0026lt;file\u0026gt;\u003c/code\u003e for a single page, sections for site-wide output such as feeds, tags, and the blogroll are hidden. Search or click \u003cstrong\u003eShow hidden sections\u003c/strong\u003e to see them.\u003c/p\u003e\n\u003cp\u003eSettings with a fixed set of values, such as \u003ccode\u003eglob.slug_mode\u003c/code\u003e, \u003ccode\u003etheme.palette\u003c/code\u003e, \u003ccode\u003etheme.fontpack\u003c/code\u003e, \u003ccode\u003enav.position\u003c/code\u003e, or \u003ccode\u003emarkdown.highlight.theme\u003c/code\u003e, are dropdowns. Numbers with a range, such as \u003ccode\u003etheme.background.color_mix\u003c/code\u003e (0-1), are limited to that range. A value that isn\u0026rsquo;t allowed gets a red message under the field and is not previewed, so a typo can\u0026rsquo;t break the site; the status line lists every change that is not being previewed. Leave a field empty to use the default.\u003c/p\u003e\n\u003cp\u003eEach row shows where a setting lives: \u003cstrong\u003eset in config/theme.toml\u003c/strong\u003e means that file defines it now, and \u003cstrong\u003ewrites to \u0026hellip;\u003c/strong\u003e names the file a change will go to. The sidebar edits the file that owns the setting:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eA key that is already set is edited where it is set (the file that wins, when several set it).\u003c/li\u003e\n\u003cli\u003eA new key goes to the file that already holds its group. For example, a new \u003ccode\u003efeed_defaults.items_per_page\u003c/code\u003e lands in the file that has \u003ccode\u003e[markata-go.feed_defaults]\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eOtherwise it goes to your root config, or a new \u003ccode\u003emarkata-go.toml\u003c/code\u003e when you have none.\u003c/li\u003e\n\u003cli\u003eA file passed with \u003ccode\u003e--merge-config\u003c/code\u003e is marked \u003cstrong\u003eoverride\u003c/strong\u003e, so you know the change won\u0026rsquo;t be in your base config.\u003c/li\u003e\n\u003cli\u003eIf your site has no config of its own and serve fell back to your global \u003ccode\u003e~/.config/markata-go/config.toml\u003c/code\u003e, the rows are marked \u003cstrong\u003eglobal\u003c/strong\u003e and Bake is refused, so a preview never changes the defaults for all your sites. Create a \u003ccode\u003emarkata-go.toml\u003c/code\u003e in the site to bake.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThis works with \u003ccode\u003einclude = [...]\u003c/code\u003e files, config directories, and \u003ccode\u003e--merge-config\u003c/code\u003e files, in TOML, YAML, or JSON. Comments, key order, and other settings are kept.\u003c/p\u003e\n\u003cp\u003eSome settings are shown but not editable in the sidebar; edit them in the file:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLists of tables and maps, such as \u003ccode\u003enav\u003c/code\u003e, \u003ccode\u003efeeds\u003c/code\u003e, and \u003ccode\u003ehead.meta\u003c/code\u003e, show a summary like \u0026ldquo;3 items\u0026rdquo;.\u003c/li\u003e\n\u003cli\u003eSecrets such as tokens and passwords are never sent to the browser.\u003c/li\u003e\n\u003cli\u003eA few fields that the config loader does not read are marked \u003cstrong\u003eNot read from config files\u003c/strong\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eChanges are checked before they stick. If a preview or bake makes the config invalid or does not load back as written, it is rejected (and a bake restores every file) and the sidebar shows the error. When a \u003ccode\u003eMARKATA_GO_*\u003c/code\u003e environment variable overrides a setting, the row says so, because the variable wins over both previews and files until it is unset.\u003c/p\u003e\n\u003cp\u003eOn phones the sidebar opens full screen. \u003ccode\u003eAlt+,\u003c/code\u003e does nothing while you are typing in a field on the page.\u003c/p\u003e\n\u003cp\u003eThe theme picker\u0026rsquo;s \u003cstrong\u003eAll settings\u003c/strong\u003e button opens this sidebar at the Theme section. Its \u003cstrong\u003eBake\u003c/strong\u003e button writes only the look you picked, through the same checks and file selection as the sidebar (see \u003ca href=\"/docs/guides/themes/#baking-a-look-into-your-config\"\u003eThemes Guide\u003c/a\u003e).\u003c/p\u003e\n\u003ch2 id=\"content-index\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContent Index\u003c/span\u003e \u003ca href=\"#content-index\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEnable the optional metadata artifact with a plugin table:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent_index\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;content-index.json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe output path is relative to \u003ccode\u003eoutput_dir\u003c/code\u003e unless it is absolute. The index\ncontains resolved public document metadata and feed membership, but never\ncomplete article bodies. See the \u003ca href=\"/docs/guides/content-index/\"\u003eContent Index guide\u003c/a\u003e\nfor the versioned format and consumer rules. Environment overrides are also\navailable for isolated builds: \u003ccode\u003eMARKATA_GO_CONTENT_INDEX_ENABLED=true\u003c/code\u003e and\n\u003ccode\u003eMARKATA_GO_CONTENT_INDEX_OUTPUT=/tmp/content-index.json\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003ePrecedence:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ebuilt-in defaults\u003c/li\u003e\n\u003cli\u003ethe root config file\u003c/li\u003e\n\u003cli\u003eincluded files in declaration order\u003c/li\u003e\n\u003cli\u003eglob matches in lexicographic order\u003c/li\u003e\n\u003cli\u003eenvironment variables\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eLater values win.\u003c/p\u003e\n\u003ch3 id=\"merge-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMerge Behavior\u003c/span\u003e \u003ca href=\"#merge-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003escalar values replace earlier values\u003c/li\u003e\n\u003cli\u003eexplicit \u003ccode\u003efalse\u003c/code\u003e and \u003ccode\u003e0\u003c/code\u003e are preserved\u003c/li\u003e\n\u003cli\u003etables merge deeply\u003c/li\u003e\n\u003cli\u003earrays of scalars replace earlier arrays\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e[[markata-go.feeds]]\u003c/code\u003e merges by \u003ccode\u003eslug\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThat last rule makes feed-heavy sites much easier to manage.\u003c/p\u003e\n\u003ch2 id=\"image-library\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eImage Library\u003c/span\u003e \u003ca href=\"#image-library\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe image library plugin is enabled by default. It writes a searchable page to\n\u003ccode\u003eimages/index.html\u003c/code\u003e and versioned JSON inventories to \u003ccode\u003eimages/index.json\u003c/code\u003e and\n\u003ccode\u003eimages.json\u003c/code\u003e, relative to \u003ccode\u003eoutput_dir\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eimages\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epath\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;images\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;images.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexport_json\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_unreferenced\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate the image page and inventory\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epath\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;images\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRelative output directory below \u003ccode\u003eoutput_dir\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etemplate\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;images.html\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHTML template name\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexport_json\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWrite \u003ccode\u003epath/index.json\u003c/code\u003e and \u003ccode\u003eimages.json\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einclude_unreferenced\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInclude image and video files found below \u003ccode\u003eassets_dir\u003c/code\u003e without public post usage; enable explicitly when a local authoring inventory should enumerate all supported assets\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe path must remain inside \u003ccode\u003eoutput_dir\u003c/code\u003e. Environment variables use the\n\u003ccode\u003eMARKATA_GO_IMAGES_\u003c/code\u003e prefix. See the \u003ca href=\"/docs/guides/image-library/\"\u003eImage Library guide\u003c/a\u003e\nfor discovery rules and template context.\u003c/p\u003e\n\u003ch2 id=\"correcting-configuration-mistakes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCorrecting Configuration Mistakes\u003c/span\u003e \u003ca href=\"#correcting-configuration-mistakes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRun \u003ccode\u003emarkata-go config validate\u003c/code\u003e after editing a config file. If a key closely\nresembles a built-in setting, markata-go reports the file and a possible\nspelling. For example, \u003ccode\u003eoutput_dr\u003c/code\u003e suggests \u003ccode\u003eoutput_dir\u003c/code\u003e, and\n\u003ccode\u003etheme.palete\u003c/code\u003e suggests \u003ccode\u003etheme.palette\u003c/code\u003e. Correct the key in the file and rerun\nthe command; markata-go never changes the file for you. Custom plugin sections\nremain supported.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003emarkata-go config get \u0026lt;key\u0026gt;\u003c/code\u003e also suggests close key names. If the key is\nvalid but absent from the file, use \u003ccode\u003emarkata-go config show\u003c/code\u003e to see its resolved\nvalue, including defaults. For a theme choice with a fixed list of values,\nvalidation shows allowed values and, when close enough, a possible correction.\u003c/p\u003e\n\u003ch2 id=\"configuration-file-locations\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration File Locations\u003c/span\u003e \u003ca href=\"#configuration-file-locations\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go searches for configuration files in the following order (first found wins):\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePriority\u003c/th\u003e\n\u003cth\u003eLocation\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e--config path/to/config.toml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCLI-specified path\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./markata-go.toml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCurrent directory (TOML)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./markata-go.yaml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCurrent directory (YAML)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e4\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./markata-go.yml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCurrent directory (YAML alternate)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e5\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./markata-go.json\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCurrent directory (JSON)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e6\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e~/.config/markata-go/config.toml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUser config directory\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eIf no configuration file is found, markata-go uses default values with any environment variable overrides applied.\u003c/p\u003e\n\u003ch3 id=\"start-with-one-markdown-file\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStart With One Markdown File\u003c/span\u003e \u003ca href=\"#start-with-one-markdown-file\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eA configuration file is optional for a small site. The default content\npatterns include root Markdown plus the \u003ccode\u003epages/\u003c/code\u003e and \u003ccode\u003eposts/\u003c/code\u003e directories, so\nthis minimal layout works:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epages/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  sample.md\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003emarkata-go build\u003c/code\u003e and \u003ccode\u003emarkata-go serve\u003c/code\u003e render \u003ccode\u003esample.md\u003c/code\u003e, a homepage that\nlinks to it, and an \u003ccode\u003e/archive/\u003c/code\u003e page. The homepage also keeps the default RSS\nand Atom endpoints at \u003ccode\u003e/rss.xml\u003c/code\u003e and \u003ccode\u003e/atom.xml\u003c/code\u003e. Posts must be published to\nappear in these collections: use \u003ccode\u003epublished: true\u003c/code\u003e in frontmatter. An empty\nsite still renders \u003ccode\u003e/\u003c/code\u003e with that reminder.\u003c/p\u003e\n\u003cp\u003eTo render only one Markdown file with the bundled default theme, without\ngenerating a homepage, archive, or feeds, pass the file directly:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go pages/sample.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# equivalent:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build pages/sample.md\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"select-a-site-from-another-directory\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSelect A Site From Another Directory\u003c/span\u003e \u003ca href=\"#select-a-site-from-another-directory\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse \u003ccode\u003e--site-dir\u003c/code\u003e when the site is not your current directory. This is useful\nfor aliases, scripts, and agents that manage more than one site.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go --site-dir ~/sites/blog config show\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_SITE_DIR\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e~/notes/work markata-go list posts\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003e--site-dir\u003c/code\u003e overrides \u003ccode\u003eMARKATA_GO_SITE_DIR\u003c/code\u003e; otherwise markata-go uses the\ncurrent directory. The selected site becomes the base for configuration\ndiscovery, relative config flags, templates, content files, and caches.\u003c/p\u003e\n\u003ch2 id=\"supported-formats\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSupported Formats\u003c/span\u003e \u003ca href=\"#supported-formats\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eExtension\u003c/th\u003e\n\u003cth\u003eFormat\u003c/th\u003e\n\u003cth\u003eNotes\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.toml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTOML\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003eRecommended\u003c/strong\u003e - Best for nested config, readable\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.yaml\u003c/code\u003e, \u003ccode\u003e.yml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eYAML\u003c/td\u003e\n\u003ctd\u003eGood for complex structures\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.json\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eJSON\u003c/td\u003e\n\u003ctd\u003eStrict, good for programmatic generation\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"toml-example-recommended\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTOML Example (Recommended)\u003c/span\u003e \u003ca href=\"#toml-example-recommended\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;A site built with markata-go\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;posts/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pages/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003euse_gitignore\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eextensions\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tables\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;strikethrough\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tasklist\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"yaml-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eYAML Example\u003c/span\u003e \u003ca href=\"#yaml-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eMy Site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eA site built with markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eoutput_dir\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epatterns\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;posts/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;pages/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003euse_gitignore\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eextensions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003etables\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003estrikethrough\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003etasklist\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"json-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJSON Example\u003c/span\u003e \u003ca href=\"#json-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;markata-go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;A site built with markata-go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;output_dir\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;glob\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;patterns\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;posts/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pages/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;use_gitignore\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;markdown\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;extensions\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tables\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;strikethrough\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tasklist\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"configuration-namespacing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration Namespacing\u003c/span\u003e \u003ca href=\"#configuration-namespacing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAll configuration lives under the \u003ccode\u003e[markata-go]\u003c/code\u003e namespace. This:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAvoids conflicts with other tools in shared config files\u003c/li\u003e\n\u003cli\u003eProvides clear ownership for each plugin section\u003c/li\u003e\n\u003cli\u003eEnables tooling-friendly editor completions\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Root namespace - site-wide settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Plugin namespaces\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pages/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;posts/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eextensions\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tables\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Feed-specific config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"configuration-options-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration Options Reference\u003c/span\u003e \u003ca href=\"#configuration-options-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"core-settings-markata-go\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCore Settings (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#core-settings-markata-go\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eoutput_dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;output\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBuild output directory\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eurl\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite base URL (for absolute links)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edescription\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite description\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eauthor\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault author\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elicense\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring \u003ccode\u003e|\u003c/code\u003e bool\u003c/td\u003e\n\u003ctd\u003e(unset)\u003c/td\u003e\n\u003ctd\u003eSelect a license key (see below). Set to \u003ccode\u003efalse\u003c/code\u003e to skip the attribution and warning.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eassets_dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;static\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eStatic assets directory\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etemplates_dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;templates\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTemplates directory\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehooks\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring[]\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[\u0026quot;default\u0026quot;]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePlugins to load\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edisabled_hooks\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring[]\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePlugins to exclude\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econcurrency\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e0\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWorker threads (0 = auto based on CPU cores)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;A site built with markata-go\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauthor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Jane Doe\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eassets_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;static\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplates_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;templates\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehooks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edisabled_hooks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;sitemap\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econcurrency\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"python-docs-markata-go-python_docs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePython Docs (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.python_docs]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#python-docs-markata-go-python_docs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGenerate API reference pages from Python source files.\u003c/p\u003e\n\u003cp\u003eThis plugin is strict opt-in: add \u003ccode\u003epython_docs\u003c/code\u003e to \u003ccode\u003e[markata-go].hooks\u003c/code\u003e and set \u003ccode\u003eenabled = true\u003c/code\u003e.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable source-backed Python docs generation\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epatterns\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring[]\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[\u0026quot;**/*.py\u0026quot;]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePython file glob patterns\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edirectories\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring[]\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDirectory roots expanded to \u003ccode\u003edir/**/*.py\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexclude\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring[]\u003c/td\u003e\n\u003ctd\u003evenv/cache defaults\u003c/td\u003e\n\u003ctd\u003eGlobs to skip\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eslug_prefix\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;api\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePrefix for generated module pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etemplate\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTemplate used for generated docs posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epublished\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInclude generated docs in feeds/search/sitemap\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einclude_private\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInclude private \u003ccode\u003e_symbols\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einclude_source\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInclude implementation snippets\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einclude_module_code\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInclude module-level implementation source\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring[]\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[\u0026quot;python\u0026quot;, \u0026quot;docs\u0026quot;]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTags added to generated docs posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einterpreter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eauto-detect\u003c/td\u003e\n\u003ctd\u003ePython executable used for AST extraction\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehooks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;python_docs\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epython_docs\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;src/**/*.py\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug_prefix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;api\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_source\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSee \u003ca href=\"./python-docs.md\"\u003ePython Source Docs\u003c/a\u003e for the full workflow.\u003c/p\u003e\n\u003ch3 id=\"embeds-embeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEmbeds (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[embeds]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#embeds-embeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eControls internal and external embed behavior, including oEmbed resolution and Open Graph fallback.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable/disable embeds plugin\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einternal_card_class\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;embed-card\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCSS class for internal embed cards\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexternal_card_class\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;embed-card embed-card-external\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCSS class for external embed cards\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efetch_external\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFetch Open Graph metadata for external embeds\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eoembed_enabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable oEmbed resolution\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eoembed_auto_discover\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDiscover oEmbed endpoints from HTML link tags\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edefault_mode\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;card\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault embed mode (\u003ccode\u003ecard\u003c/code\u003e, \u003ccode\u003erich\u003c/code\u003e, \u003ccode\u003eperformance\u003c/code\u003e, \u003ccode\u003ehover\u003c/code\u003e, \u003ccode\u003eimage_only\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eoembed_providers_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;https://oembed.com/providers.json\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eproviders.json URL (empty disables)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eresolution_strategy\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;oembed_first\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eoembed_first\u003c/code\u003e, \u003ccode\u003eog_first\u003c/code\u003e, \u003ccode\u003eoembed_only\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecache_dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;.cache/embeds\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCache directory for metadata\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecache_ttl\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e604800\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCache TTL (seconds)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etimeout\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e10\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHTTP timeout (seconds)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efallback_title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;External Link\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTitle when metadata unavailable\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshow_image\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow images for external embeds\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eproviders.\u0026lt;name\u0026gt;.mode\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e(unset)\u003c/td\u003e\n\u003ctd\u003eProvider mode override (\u003ccode\u003ecard\u003c/code\u003e, \u003ccode\u003erich\u003c/code\u003e, \u003ccode\u003eperformance\u003c/code\u003e, \u003ccode\u003ehover\u003c/code\u003e, \u003ccode\u003eimage_only\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eembeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einternal_card_class\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;embed-card\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexternal_card_class\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;embed-card embed-card-external\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efetch_external\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoembed_enabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoembed_auto_discover\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault_mode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;card\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoembed_providers_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://oembed.com/providers.json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eresolution_strategy\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;oembed_first\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.cache/embeds\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_ttl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e604800\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etimeout\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efallback_title\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;External Link\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_image\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eembeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eproviders\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eyoutube\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003emode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;rich\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003evimeo\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etiktok\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eflickr\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003espotify\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esoundcloud\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecodepen\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecodesandbox\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejsfiddle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eobservable\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egithub\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslideshare\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eprezi\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003espeakerdeck\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eissuu\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edatawrapper\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eflourish\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einfogram\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereddit\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edailymotion\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"external-link-hover-markata-go-external_link_hover\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExternal Link Hover (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.external_link_hover]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#external-link-hover-markata-go-external_link_hover\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdds hover preview cards to links that point to other sites. Disabled by\ndefault. See the \u003ca href=\"../reference/plugins.md#external_link_hover\"\u003eplugin reference\u003c/a\u003e\nfor data sources and output.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable/disable external link cards\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efetch\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFetch metadata for URLs missing from the embeds cache (no network when \u003ccode\u003efalse\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einclude_image\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInclude the page\u0026rsquo;s preview image\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efavicon_service\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eIcon URL template with \u003ccode\u003e{host}\u003c/code\u003e / \u003ccode\u003e{origin}\u003c/code\u003e; empty disables icons\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eignore_domains\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003elist\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHosts (and subdomains) that never get cards\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eexternal_link_hover\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efetch\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efavicon_service\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://icons.duckduckgo.com/ip3/{host}.ico\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eignore_domains\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;localhost\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"vendor-assets-markata-go-assets\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVendor Assets (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.assets]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#vendor-assets-markata-go-assets\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go can self-host common third-party JS/CSS dependencies (HTMX, GLightbox, Mermaid, Chart.js, Cal-Heatmap, D3, Lite YouTube). When enabled, assets are downloaded into a cache directory and copied to \u003ccode\u003e/assets/vendor\u003c/code\u003e in the output. Templates use the \u003ccode\u003easset_urls\u003c/code\u003e mapping injected by the CDN assets plugin.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eassets\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;self-hosted\u0026#34;\u003c/span\u003e           \u003cspan class=\"c\"\u003e# \u0026#34;self-hosted\u0026#34; (default), \u0026#34;cdn\u0026#34;, or \u0026#34;auto\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.markata/assets-cache\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;assets/vendor\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003everify_integrity\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"license-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLicense configuration\u003c/span\u003e \u003ca href=\"#license-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe \u003ccode\u003elicense\u003c/code\u003e key controls the attribution shown in the footer and whether the dev server reminds you to pick a license. It accepts either a string key (selects the attribution) or the literal \u003ccode\u003efalse\u003c/code\u003e (hides the line and silences the warning). When the footer shows the copyright line, the license appears on the same line next to the copyright symbol; if copyright is disabled, the license renders as its own line.\u003c/p\u003e\n\u003cp\u003eSupported license keys:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eall-rights-reserved\u003c/code\u003e – All rights reserved.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecc-by-4.0\u003c/code\u003e (recommended) – Creative Commons Attribution 4.0 International (\u003ccode\u003ehttps://creativecommons.org/licenses/by/4.0/\u003c/code\u003e). The default when running \u003ccode\u003emarkata-go config init\u003c/code\u003e or picking the recommended option in the init wizard.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecc-by-sa-4.0\u003c/code\u003e – Creative Commons Attribution-ShareAlike 4.0 International (\u003ccode\u003ehttps://creativecommons.org/licenses/by-sa/4.0/\u003c/code\u003e).\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecc-by-nc-4.0\u003c/code\u003e – Creative Commons Attribution-NonCommercial 4.0 International (\u003ccode\u003ehttps://creativecommons.org/licenses/by-nc/4.0/\u003c/code\u003e).\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecc-by-nd-4.0\u003c/code\u003e – Creative Commons Attribution-NoDerivatives 4.0 International (\u003ccode\u003ehttps://creativecommons.org/licenses/by-nd/4.0/\u003c/code\u003e).\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecc-by-nc-sa-4.0\u003c/code\u003e – Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (\u003ccode\u003ehttps://creativecommons.org/licenses/by-nc-sa/4.0/\u003c/code\u003e).\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emit\u003c/code\u003e – MIT License (\u003ccode\u003ehttps://opensource.org/licenses/MIT\u003c/code\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWhen omitted, \u003ccode\u003elicense\u003c/code\u003e defaults to \u003ccode\u003ecc-by-4.0\u003c/code\u003e. Set another supported string\nto override it, or set \u003ccode\u003elicense = false\u003c/code\u003e to suppress footer attribution.\u003c/p\u003e\n\u003ch3 id=\"navigation-links-markata-go-nav\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNavigation Links (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[[markata-go.nav]]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#navigation-links-markata-go-nav\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eNavigation links appear in the site header and define your site\u0026rsquo;s main navigation.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elabel\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRequired\u003c/td\u003e\n\u003ctd\u003eDisplay text for the link\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eurl\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRequired\u003c/td\u003e\n\u003ctd\u003eLink destination (relative or absolute)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexternal\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOpens link in new tab with noopener\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elabel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Home\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elabel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/blog/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elabel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Docs\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/docs/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elabel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;GitHub\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://github.com/WaylonWalker/markata-go\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexternal\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe default theme adds a small preview when a local header or footer navigation URL matches a generated feed or published post. For a feed such as \u003ccode\u003e/blog/\u003c/code\u003e, hovering the link or focusing it with a keyboard shows its description, public post count, total words, reading time, and publication rhythm when those values are available. For a post, the preview uses its description, tags, word count, and reading time. Enabled Reader and Blogroll links show the number of active followed sources; an enabled Random post link shows how many posts are in its draw. External and unmatched links stay as ordinary links. Previews remain open while the pointer moves from the link into the panel, close when it leaves, and appear above page content. They are hidden on narrow or touch screens, where the navigation is a scrollable strip.\u003c/p\u003e\n\u003cp\u003eLinks inside a post can use the same preview. Write a normal Markdown link such as \u003ccode\u003e[Start here](/start/)\u003c/code\u003e or a wikilink such as \u003ccode\u003e[[start]]\u003c/code\u003e. When its destination is a public post or feed, hover or keyboard focus shows the destination title and available metadata. An absolute URL for the configured site also works; \u003ccode\u003ehttp://localhost:8000/start/\u003c/code\u003e works during local development. Tags shown on a post get a collection preview when their \u003ccode\u003e/tags/\u0026lt;tag\u0026gt;/\u003c/code\u003e feed exists. Links to other sites and links without a matching public page keep their usual behavior.\u003c/p\u003e\n\u003cp\u003eTo give a feed link useful preview text, set \u003ccode\u003edescription\u003c/code\u003e on its \u003ccode\u003e[[markata-go.feeds]]\u003c/code\u003e entry. For a post link, set \u003ccode\u003edescription\u003c/code\u003e and \u003ccode\u003etags\u003c/code\u003e in that post\u0026rsquo;s frontmatter. The link URL must match the generated page path, such as \u003ccode\u003e/blog/\u003c/code\u003e or \u003ccode\u003e/about/\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eTo add a built-in \u003cstrong\u003eRandom post\u003c/strong\u003e link:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erandom_post\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epath\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;random\u0026#34;\u003c/span\u003e                \u003cspan class=\"c\"\u003e# generates /random/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude_tags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;draft\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e       \u003cspan class=\"c\"\u003e# optional\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elabel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Random\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/random/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf you use sidebar navigation, add the same \u003ccode\u003eurl = \u0026quot;/random/\u0026quot;\u003c/code\u003e link to \u003ccode\u003e[[markata-go.sidebar.nav]]\u003c/code\u003e (or to \u003ccode\u003e[[markata-go.components.nav.items]]\u003c/code\u003e if you\u0026rsquo;re using the components system).\u003c/p\u003e\n\u003ch3 id=\"seo-configuration-markata-go-seo\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSEO Configuration (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.seo]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#seo-configuration-markata-go-seo\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigure SEO metadata and structured data generation for better search engine visibility.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etwitter_handle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTwitter/X username (without @) for twitter:site\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edefault_image\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault Open Graph image URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elogo_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite logo URL for Schema.org\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseo\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etwitter_handle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;waylonwalker\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault_image\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/static/og-default.png\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elogo_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/static/logo.png\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estructured_data\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estructured_data\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epublisher\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Organization\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Company\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elogo\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/static/logo.png\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estructured_data\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefault_author\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Person\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Jane Doe\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/about/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"structured-data-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStructured Data Configuration\u003c/span\u003e \u003ca href=\"#structured-data-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable JSON-LD Schema.org generation\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epublisher\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003enil\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePublisher information\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edefault_author\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003enil\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault author for posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eWhen enabled, markata-go generates JSON-LD structured data for:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eWebSite\u003c/code\u003e schema on the home page\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eArticle\u003c/code\u003e or \u003ccode\u003eBlogPosting\u003c/code\u003e schema on posts\u003c/li\u003e\n\u003cli\u003eBreadcrumb navigation schema\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"theme-settings-markata-go-theme\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTheme Settings (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.theme]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#theme-settings-markata-go-theme\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;default\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTheme name\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epalette\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;ayu-dark\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eColor palette to use\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epalette_dark\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDark mode palette\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efallback_mode\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;dark\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMode for visitors who have not toggled it (\u003ccode\u003e\u0026quot;dark\u0026quot;\u003c/code\u003e or \u003ccode\u003e\u0026quot;light\u0026quot;\u003c/code\u003e); the OS preference is not used\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eseasonal\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eboolean\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault visitors to the seasonal palette (northern hemisphere seasons plus world holidays). Needs the theme switcher; \u003ccode\u003epalette\u003c/code\u003e stays the fallback. See \u003ca href=\"/docs/guides/themes/#seasonal\"\u003eThemes: Seasonal\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etext_size\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;large\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault reading-size preset: \u003ccode\u003e\u0026quot;small\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;medium\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;large\u0026quot;\u003c/code\u003e, or \u003ccode\u003e\u0026quot;x-large\u0026quot;\u003c/code\u003e. Article text additionally scales up on viewports ≥1800px.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshow_text_size_control\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow the visitor-facing reading-size selector\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecustom_css\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCustom CSS file path (relative to static/)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003evariables\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003emap\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCSS variable overrides\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efontpack\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;system\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFont pack: zero-download system-ui headings/body with native monospace code (Brush is opt-in)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eaesthetic\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;minimal\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSurface style: \u003ccode\u003eminimal\u003c/code\u003e, \u003ccode\u003ebalanced\u003c/code\u003e, \u003ccode\u003eelevated\u003c/code\u003e, \u003ccode\u003eprecision\u003c/code\u003e, or \u003ccode\u003ebrutal\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emotif.kind\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;off\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBackground motif (\u003ccode\u003eoff\u003c/code\u003e, \u003ccode\u003eblock-w\u003c/code\u003e, \u003ccode\u003eletter\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eswitcher.enabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow the live theme picker so visitors can choose any palette, style, and font; under \u003ccode\u003emarkata-go serve\u003c/code\u003e its \u003cstrong\u003eBake\u003c/strong\u003e button writes the current choices into your config (see \u003ca href=\"/docs/guides/themes/\"\u003eThemes Guide\u003c/a\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eswitcher.mode_toggle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow the light/dark toggle next to the picker\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe default font pack is \u003ccode\u003esystem\u003c/code\u003e (no downloaded font files). \u003ccode\u003ebrush\u003c/code\u003e and \u003ccode\u003ebrush-poster\u003c/code\u003e remain available for explicit site or page overrides. Built-in defaults do not cause migration warnings.\nIf your configuration supplies different values for \u003ccode\u003efontpack\u003c/code\u003e and \u003ccode\u003etheme.fontpack\u003c/code\u003e, the nested value wins.\nThe loader reports that conflict once. Remove the legacy top-level \u003ccode\u003efontpack\u003c/code\u003e to resolve the warning.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-mocha\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Optional: different palette for dark mode\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette_dark\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-mocha\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Optional: fallback when system preference is unavailable\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efallback_mode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dark\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# or \u0026#34;light\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Optional: default reading size and visitor control\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext_size\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;large\u0026#34;\u003c/span\u003e              \u003cspan class=\"c\"\u003e# small, medium, large, or x-large\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_text_size_control\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Optional: override specific CSS variables\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--color-primary\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#8b5cf6\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--content-width\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;800px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Optional: add custom CSS file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecustom_css\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;my-styles.css\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eAvailable palettes:\u003c/strong\u003e \u003ccode\u003edefault-light\u003c/code\u003e, \u003ccode\u003edefault-dark\u003c/code\u003e, \u003ccode\u003ecatppuccin-mocha\u003c/code\u003e, \u003ccode\u003ecatppuccin-latte\u003c/code\u003e, \u003ccode\u003enord-dark\u003c/code\u003e, \u003ccode\u003egruvbox-dark\u003c/code\u003e, \u003ccode\u003edracula\u003c/code\u003e, \u003ccode\u003erose-pine\u003c/code\u003e, \u003ccode\u003esolarized-dark\u003c/code\u003e, \u003ccode\u003etokyo-night\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSee the [[themes-and-styling|Themes Guide]] for detailed customization options.\u003c/p\u003e\n\u003ch3 id=\"page-css-bundles-markata-go-css_bundle\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePage CSS Bundles (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.css_bundle]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#page-css-bundles-markata-go-css_bundle\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecss_bundle\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epages\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;index.html\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003epages\u003c/code\u003e defaults to an empty list. Each entry names an HTML file relative to\n\u003ccode\u003eoutput_dir\u003c/code\u003e. Production builds bundle eligible head styles in cascade order\nafter CSS optimization. Fast builds skip page bundling. Existing \u003ccode\u003ebundles\u003c/code\u003e\ndefinitions continue to work independently. See \u003ca href=\"themes/#css-optimization\"\u003eCSS optimization\u003c/a\u003e\nfor stylesheet boundaries and runtime behavior.\u003c/p\u003e\n\u003ch3 id=\"css-purge-markata-go-css_purge\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCSS Purge (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.css_purge]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#css-purge-markata-go-css_purge\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecss_purge\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003everbose\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epreserve\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;js-*\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;htmx-*\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;theme-*\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;palette-*\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;md-code-*\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epreserve_attributes\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;data-theme\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;data-palette\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;data-text-size\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eskip_files\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vendor/*\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;normalize.css\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewarning_threshold\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCSS purge removes unused rules by scanning generated HTML and keeping only selectors\nthat are actually present.\nThe built-in default safelist includes \u003ccode\u003emd-code-*\u003c/code\u003e for the article code-copy\nbutton, which is created by JavaScript after HTML generation. Without it, the\nbutton still works but loses its positioning and can cover code. When setting a\ncustom \u003ccode\u003epreserve\u003c/code\u003e list, include \u003ccode\u003e\u0026quot;md-code-*\u0026quot;\u003c/code\u003e alongside your own patterns;\ncustom lists replace, rather than extend, the defaults.\nThe purge logic always preserves key @-rules and keeps\npseudo-only selectors like \u003ccode\u003e:root\u003c/code\u003e or \u003ccode\u003e::selection\u003c/code\u003e to avoid dropping base/theme styles.\nFull builds cache the discovered selector set and purged CSS under\n\u003ccode\u003e.markata-cache/css-purge\u003c/code\u003e in the content directory. The selector cache checks a content\nfingerprint of generated HTML paths and bytes. Purged CSS is reused only when stylesheet\nbytes, discovered selectors, and purge options match. Missing or invalid cache entries\nfall back to the normal scan or purge path.\u003c/p\u003e\n\u003ch3 id=\"tailwind-markata-go-tailwind\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTailwind (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.tailwind]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#tailwind-markata-go-tailwind\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go can run the Tailwind standalone CLI automatically and wire the output\ninto your theme so you don\u0026rsquo;t need a separate build step.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etailwind\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;css\u0026#34;\u003c/span\u003e                \u003cspan class=\"c\"\u003e# \u0026#34;css\u0026#34;, \u0026#34;js\u0026#34;, or false (default: \u0026#34;css\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epreflight\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e               \u003cspan class=\"c\"\u003e# Enable Tailwind Preflight reset styles (default: false)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einput\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tailwind.css\u0026#34;\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Input CSS (relative to assets_dir)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;markata-tailwind.css\u0026#34;\u003c/span\u003e \u003cspan class=\"c\"\u003e# Output CSS (relative to assets_dir)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econfig_file\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e                \u003cspan class=\"c\"\u003e# Optional tailwind.config.js path\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebuild\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                     \u003cspan class=\"c\"\u003e# Run Tailwind CLI during build\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eminify\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                    \u003cspan class=\"c\"\u003e# Pass --minify to Tailwind CLI\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_install\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Auto-download Tailwind CLI (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eversion\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;v3.4.19\u0026#34;\u003c/span\u003e             \u003cspan class=\"c\"\u003e# Managed Tailwind CLI version tag\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# Cache dir for Tailwind CLI\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebinary\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e                     \u003cspan class=\"c\"\u003e# Optional path to tailwindcss binary\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eextra_args\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# Optional extra CLI arguments\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003everbose\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# Verbose installer/build logs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eHow it works:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003einput\u003c/code\u003e/\u003ccode\u003eoutput\u003c/code\u003e resolve relative to \u003ccode\u003eassets_dir\u003c/code\u003e and are copied/fingerprinted\nlike any other static asset.\u003c/li\u003e\n\u003cli\u003eIf \u003ccode\u003einput\u003c/code\u003e does not exist, markata-go generates a default Tailwind entry file for\nyou, so basic utility usage works without creating \u003ccode\u003etailwind.css\u003c/code\u003e first.\u003c/li\u003e\n\u003cli\u003eIf \u003ccode\u003eextra_args\u003c/code\u003e is empty and \u003ccode\u003econfig_file\u003c/code\u003e is unset, markata-go generates a\ntemporary Tailwind config that scans a generated token manifest built from\nrendered page HTML plus local JS/template sources. That generated config\ndisables Tailwind Preflight by default so utilities do not override markata-go\u0026rsquo;s\nbuilt-in theme styles. Set \u003ccode\u003epreflight = true\u003c/code\u003e to opt back into the reset. The\nmanifest is hashed so Tailwind is skipped when the effective utility set has not changed.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einclude = \u0026quot;css\u0026quot;\u003c/code\u003e loads the compiled CSS. If \u003ccode\u003etheme.custom_css\u003c/code\u003e is unset, the\nTailwind output is assigned automatically. Explicit \u003ccode\u003etheme.custom_css\u003c/code\u003e always wins.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einclude = \u0026quot;js\u0026quot;\u003c/code\u003e injects \u003ccode\u003ehttps://cdn.tailwindcss.com\u003c/code\u003e in the document head.\nWhen \u003ccode\u003e[markata-go.assets].mode = \u0026quot;self-hosted\u0026quot;\u003c/code\u003e, markata-go vendors this script\nand uses the local URL from \u003ccode\u003easset_urls\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einclude = false\u003c/code\u003e disables auto-inclusion; the build can still run.\u003c/li\u003e\n\u003cli\u003eFast mode skips Tailwind rebuilds when the compiled asset already exists.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBy default markata-go uses its managed Tailwind CLI version instead of a global\n\u003ccode\u003etailwindcss\u003c/code\u003e on your \u003ccode\u003ePATH\u003c/code\u003e, which keeps builds consistent across machines. Set\n\u003ccode\u003eauto_install = false\u003c/code\u003e or \u003ccode\u003ebinary = \u0026quot;/path/to/tailwindcss\u0026quot;\u003c/code\u003e only when you want to\noverride that behavior.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eValidation warning:\u003c/strong\u003e If \u003ccode\u003einclude = \u0026quot;css\u0026quot;\u003c/code\u003e and \u003ccode\u003e[markata-go.css_purge].enabled = false\u003c/code\u003e,\nmarkata-go emits a warning because Tailwind outputs an intentionally large CSS bundle.\u003c/p\u003e\n\u003cp\u003eFor Tailwind-first sites with a custom reset strategy, either set \u003ccode\u003epreflight = true\u003c/code\u003e\nor provide your own \u003ccode\u003econfig_file\u003c/code\u003e. User-supplied Tailwind config files are respected as-is.\u003c/p\u003e\n\u003ch3 id=\"aesthetic-settings-markata-go\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAesthetic Settings (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#aesthetic-settings-markata-go\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAesthetics control the non-color visual aspects of your site: border radius, spacing, shadows, and borders. While palettes control \u003cem\u003ewhat colors\u003c/em\u003e you use, aesthetics control \u003cem\u003ehow things are shaped\u003c/em\u003e.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eaesthetic\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;balanced\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAesthetic preset to use\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eaesthetic\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;elevated\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eAvailable aesthetics:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAesthetic\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebalanced\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault. Comfortable rounding, subtle shadows, normal spacing\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebrutal\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSharp corners, thick borders, tight spacing, no shadows\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eminimal\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo rounding, maximum whitespace, no shadows, hairline borders\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eelevated\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerous rounding, layered shadows, generous spacing\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eprecision\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSubtle corners, compact spacing, hairline borders, minimal shadows\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"aesthetic-overrides-markata-go-aesthetic_overrides\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAesthetic Overrides (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.aesthetic_overrides]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#aesthetic-overrides-markata-go-aesthetic_overrides\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eFine-tune individual aesthetic values without creating a full custom aesthetic:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eborder_radius\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003evaries\u003c/td\u003e\n\u003ctd\u003eCSS border-radius value (e.g., \u003ccode\u003e\u0026quot;8px\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;0\u0026quot;\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003espacing_scale\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003efloat\u003c/td\u003e\n\u003ctd\u003evaries\u003c/td\u003e\n\u003ctd\u003eSpacing multiplier (e.g., \u003ccode\u003e1.0\u003c/code\u003e, \u003ccode\u003e1.5\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eborder_width\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003evaries\u003c/td\u003e\n\u003ctd\u003eCSS border-width value (e.g., \u003ccode\u003e\u0026quot;1px\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;3px\u0026quot;\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eborder_style\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003evaries\u003c/td\u003e\n\u003ctd\u003eCSS border-style value (e.g., \u003ccode\u003e\u0026quot;solid\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;none\u0026quot;\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshadow_intensity\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003efloat\u003c/td\u003e\n\u003ctd\u003evaries\u003c/td\u003e\n\u003ctd\u003eShadow opacity multiplier (0.0-1.0)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshadow_size\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003evaries\u003c/td\u003e\n\u003ctd\u003eShadow size: \u003ccode\u003e\u0026quot;none\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;sm\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;md\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;lg\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;xl\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eaesthetic\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;balanced\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Override specific values\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaesthetic_overrides\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eborder_radius\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;16px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshadow_intensity\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003espacing_scale\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e1.2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCombining with palettes:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eaesthetic\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;elevated\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-mocha\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSee the [[themes-and-styling|Themes Guide]] for detailed aesthetic customization and the full list of built-in presets.\u003c/p\u003e\n\u003ch3 id=\"layout-components-markata-go-components\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLayout Components (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.components]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#layout-components-markata-go-components\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go includes a configurable layout components system for navigation, footer, and sidebars. Each component can be enabled/disabled and positioned via configuration.\u003c/p\u003e\n\u003ch4 id=\"navigation-component-markata-go-components-nav\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNavigation Component (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.components.nav]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#navigation-component-markata-go-components-nav\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow navigation\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eposition\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;header\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePosition: \u003ccode\u003e\u0026quot;header\u0026quot;\u003c/code\u003e or \u003ccode\u003e\u0026quot;sidebar\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estyle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;horizontal\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eStyle: \u003ccode\u003e\u0026quot;horizontal\u0026quot;\u003c/code\u003e or \u003ccode\u003e\u0026quot;vertical\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eitems\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earray\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNavigation links (overrides top-level nav)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;header\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;horizontal\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eitems\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elabel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Home\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eitems\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elabel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/blog/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eitems\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elabel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;GitHub\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://github.com/user\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexternal\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"footer-component-markata-go-components-footer\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFooter Component (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.components.footer]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#footer-component-markata-go-components-footer\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow footer\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etext\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCustom footer text\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshow_copyright\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow copyright line\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elinks\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earray\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFooter links\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efooter\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Thanks for reading!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_copyright\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efooter\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elinks\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elabel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;RSS\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/rss.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efooter\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elinks\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elabel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;GitHub\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://github.com/user\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexternal\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"document-sidebar-markata-go-components-doc_sidebar\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocument Sidebar (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.components.doc_sidebar]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#document-sidebar-markata-go-components-doc_sidebar\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eTable of contents sidebar for long-form content.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow TOC sidebar\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eposition\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;right\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePosition: \u003ccode\u003e\u0026quot;left\u0026quot;\u003c/code\u003e or \u003ccode\u003e\u0026quot;right\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewidth\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;250px\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSidebar width\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emin_depth\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e2\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMinimum heading level (h2 = 2)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emax_depth\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e4\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMaximum heading level (h4 = 4)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edoc_sidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;right\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewidth\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;280px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emin_depth\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_depth\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo show the TOC only on blog-layout posts (pages rendered with \u003ccode\u003epost.html\u003c/code\u003e), use \u003ccode\u003eshow_toc\u003c/code\u003e under \u003ccode\u003e[markata-go.layout.blog]\u003c/code\u003e instead. When \u003ccode\u003edoc_sidebar.enabled = true\u003c/code\u003e, it takes precedence and its \u003ccode\u003eposition\u003c/code\u003e and \u003ccode\u003ewidth\u003c/code\u003e are used. See the Blog Layout section below.\u003c/p\u003e\n\u003ch4 id=\"feed-sidebar-markata-go-components-feed_sidebar\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Sidebar (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.components.feed_sidebar]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#feed-sidebar-markata-go-components-feed_sidebar\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eSeries/collection navigation sidebar for posts in the same feed.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow feed sidebar\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eposition\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;left\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePosition: \u003ccode\u003e\u0026quot;left\u0026quot;\u003c/code\u003e or \u003ccode\u003e\u0026quot;right\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewidth\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;250px\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSidebar width\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCustom title (defaults to feed title)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeeds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earray\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFeed slugs to show navigation for\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emax_posts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003einteger\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e0\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInitial server-rendered sidebar window; public HTML feeds can progressively load the rest from static chunks\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_sidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;left\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewidth\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;250px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;In this series\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tutorials\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;guides\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_posts\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e51\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"sidebar-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSidebar behavior\u003c/span\u003e \u003ca href=\"#sidebar-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eThe document and feed sidebars are drawers at every width. Each drawer has a\nsmall handle (\u0026ldquo;Series\u0026rdquo; on the left, \u0026ldquo;On this page\u0026rdquo; on the right). Clicking the\nhandle, or pressing \u003ccode\u003eb\u003c/code\u003e (left) / \u003ccode\u003eShift+B\u003c/code\u003e (right), opens the drawer; doing it\nagain closes it. Drawers never open on hover, so they cannot pop in and out\nwhile you read. Hovering or focusing a handle shows its hotkey (\u003ccode\u003eb\u003c/code\u003e or \u003ccode\u003e⇧B\u003c/code\u003e),\nand the handle\u0026rsquo;s tooltip names it too.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWide screens (\u003ccode\u003e1201px\u003c/code\u003e and up):\u003c/strong\u003e an open drawer docks beside the article\nand pushes the content aside instead of covering it. With both drawers open\nthe article sits between them, and it narrows if the viewport cannot fit all\nthree at full width. The open/closed choice is remembered per side in browser\nstorage and restored on later pages without animating. While the site header\nis on screen the drawer starts just below it; once you scroll past the header\nthe drawer fills the full viewport height. Each drawer has a single themed\nscrollbar.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eNarrow screens (\u003ccode\u003e1200px\u003c/code\u003e and below):\u003c/strong\u003e the handles become small pills in the\nbottom corners. An open drawer slides over the page with a dimmed backdrop,\nand only one drawer is open at a time. Tapping the backdrop, pressing\n\u003ccode\u003eEscape\u003c/code\u003e, following a link inside the drawer, or tapping the pill again closes\nit, and focus returns to the handle. Overlay drawers always start closed and\ndon\u0026rsquo;t change the remembered wide-screen state. A content sidebar\n(\u003ccode\u003e[markata-go.content_sidebar]\u003c/code\u003e) stacks below the article at this width.\u003c/p\u003e\n\u003cp\u003eThe feed drawer also carries the feed picker, a \u003ccode\u003ecurrent/total\u003c/code\u003e counter, and\nprevious/next feed buttons (\u003ccode\u003e{\u003c/code\u003e / \u003ccode\u003e}\u003c/code\u003e) for switching between primary feeds.\u003c/p\u003e\n\u003cp\u003eTOC entries are built from the heading\u0026rsquo;s visible text: resolved wikilinks,\nMarkdown links, emphasis and inline code are stripped, so the sidebar never\nshows raw HTML or markup. TOC anchors always match the rendered heading ids,\nincluding duplicate headings (\u003ccode\u003esetup\u003c/code\u003e, \u003ccode\u003esetup-1\u003c/code\u003e, \u003ccode\u003esetup-2\u003c/code\u003e), headings with\ninline code such as \u003ccode\u003e`update_meta`\u003c/code\u003e, headings with smart quotes, and\nexplicit \u003ccode\u003e{#custom-id}\u003c/code\u003e attributes. Lines starting with \u003ccode\u003e#\u003c/code\u003e inside fenced code\nblocks are never treated as headings.\u003c/p\u003e\n\u003cp\u003eClicking a TOC entry moves quickly to the heading with a short glide (under a\nquarter of a second, starting close to the target so long jumps don\u0026rsquo;t\nstream the whole page past). The URL hash updates and the heading briefly\nhighlights. Scrolling, touching or pressing a key during the glide hands\ncontrol back to you immediately. With \u003ccode\u003eprefers-reduced-motion\u003c/code\u003e, the jump is\ninstant. As you read, a marker slides along the TOC rail to the current\nsection, and the TOC keeps that entry in view.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eHeader on narrow screens:\u003c/strong\u003e below \u003ccode\u003e1201px\u003c/code\u003e the header switches to a compact\nlayout (title and controls on one row, search below, then a single scrollable\nnav strip).\u003c/p\u003e\n\u003ch4 id=\"share-component-markata-go-components-share\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eShare Component (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.components.share]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#share-component-markata-go-components-share\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eAdd a \u0026ldquo;Share this post\u0026rdquo; grid to the end of every article so readers can send your content to social platforms or copy the link.\u003c/p\u003e\n\u003cp\u003ePost pages also include a separate \u003ccode\u003eCopy this post\u003c/code\u003e control near the article title. That top-of-post menu exposes \u003ccode\u003eURL\u003c/code\u003e, \u003ccode\u003eRich\u003c/code\u003e, \u003ccode\u003eMarkdown\u003c/code\u003e, and \u003ccode\u003eText\u003c/code\u003e clipboard options based on the current post output. To remove the menu without removing the share grid or disabling post formats, set:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epost_copy\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003ecomponents.post_copy.enabled\u003c/code\u003e defaults to \u003ccode\u003etrue\u003c/code\u003e. The setting applies to post pages, including custom post templates that include the built-in copy component.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow the component.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;Share this post\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHeading text above the buttons.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eposition\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;bottom\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eModifier used by CSS (applied as \u003ccode\u003eshare-panel--\u0026lt;position\u0026gt;\u003c/code\u003e).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eplatforms\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earray\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[\u0026quot;twitter\u0026quot;,\u0026quot;bluesky\u0026quot;,\u0026quot;linkedin\u0026quot;,\u0026quot;whatsapp\u0026quot;,\u0026quot;facebook\u0026quot;,\u0026quot;telegram\u0026quot;,\u0026quot;pinterest\u0026quot;,\u0026quot;reddit\u0026quot;,\u0026quot;hacker_news\u0026quot;,\u0026quot;email\u0026quot;,\u0026quot;copy\u0026quot;]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOrdered list of platform keys to render. Omit entries to hide them.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecustom\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003etable\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCustom platform definitions (\u003ccode\u003ename\u003c/code\u003e, \u003ccode\u003eicon\u003c/code\u003e, \u003ccode\u003eurl\u003c/code\u003e). Icon paths without \u003ccode\u003e/\u003c/code\u003e, \u003ccode\u003ehttp\u003c/code\u003e, or \u003ccode\u003edata:\u003c/code\u003e are resolved via \u003ccode\u003etheme_asset_hashed\u003c/code\u003e (e.g., \u003ccode\u003eicons/share/mastodon.svg\u003c/code\u003e).\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eshare\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Share this post\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eplatforms\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;twitter\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;mastodon\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;linkedin\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;copy\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eshare\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecustom\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emastodon\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Mastodon\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eicon\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;mastodon.svg\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://mastodon.social/share?text={{title}}\u0026amp;url={{url}}\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSupported placeholders for share URLs:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e{{title}}\u003c/code\u003e → URL-encoded post title (falls back to site title or slug).\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e{{url}}\u003c/code\u003e → URL-encoded absolute post URL (\u003ccode\u003econfig.url\u003c/code\u003e + \u003ccode\u003epost.href\u003c/code\u003e).\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e{{excerpt}}\u003c/code\u003e → URL-encoded post description or excerpt when provided.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCopying uses the Clipboard API with a DOM fallback, updates the button label/tooltip to \u0026ldquo;Link copied\u0026rdquo; for 2 seconds, and shows a small desktop-only toast. Built-in platforms include Twitter, Bluesky, LinkedIn, WhatsApp, Facebook, Telegram, Pinterest, Reddit, Hacker News, Email, and Copy Link, each with a coordinated icon from \u003ccode\u003epkg/themes/default/static/icons/share/\u003c/code\u003e.\u003c/p\u003e\n\u003ch4 id=\"post-connections-component-markata-go-components-post_connections\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePost Connections Component (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.components.post_connections]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#post-connections-component-markata-go-components-post_connections\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eConfigure backlinks/outlinks UI on post pages. You can render a graph, a list, or both, and tune thresholds independently.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable post connections UI.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edisplay\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earray\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e['graph']\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eModes to render: \u003ccode\u003egraph\u003c/code\u003e, \u003ccode\u003elist\u003c/code\u003e, or both.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emin_links\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLower bound (inlinks + outlinks) to render any mode.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emax_links\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e0\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUpper bound to render any mode (\u003ccode\u003e0\u003c/code\u003e = no max).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egraph_min_links\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e3\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLower bound for graph mode.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egraph_max_links\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e0\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUpper bound for graph mode (\u003ccode\u003e0\u003c/code\u003e = no max).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elist_min_links\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLower bound for list mode.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elist_max_links\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e0\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUpper bound for list mode (\u003ccode\u003e0\u003c/code\u003e = no max).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einlinks_limit\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e8\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMax inlinks shown in list mode.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eoutlinks_limit\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e8\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMax outlinks shown in list mode.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe graph loader is only emitted on pages that render the graph preview, so pages that stay in list-only mode avoid the graph JavaScript entirely.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epost_connections\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edisplay\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;list\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;graph\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Show list first, then graph for denser pages\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elist_min_links\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elist_max_links\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egraph_min_links\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egraph_max_links\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einlinks_limit\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutlinks_limit\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"indieauth-settings-markata-go-indieauth\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIndieAuth Settings (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.indieauth]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#indieauth-settings-markata-go-indieauth\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://indieauth.net/\"\u003eIndieAuth\u003c/a\u003e is a decentralized identity protocol that allows you to use your own domain to sign in to websites. markata-go can add the necessary \u003ccode\u003e\u0026lt;link\u0026gt;\u003c/code\u003e tags to your site\u0026rsquo;s HTML head.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable IndieAuth link tags in HTML head\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eauthorization_endpoint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eURL of your authorization endpoint\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etoken_endpoint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eURL of your token endpoint\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eme_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eYour profile URL for \u003ccode\u003erel=\u0026quot;me\u0026quot;\u003c/code\u003e links\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eindieauth\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauthorization_endpoint\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://indieauth.com/auth\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etoken_endpoint\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://tokens.indieauth.com/token\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eme_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://github.com/yourusername\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen enabled, this adds the following link tags to your site\u0026rsquo;s \u003ccode\u003e\u0026lt;head\u0026gt;\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;authorization_endpoint\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://indieauth.com/auth\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;token_endpoint\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://tokens.indieauth.com/token\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;me\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://github.com/yourusername\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"webmention-settings-markata-go-webmention\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWebmention Settings (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.webmention]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#webmention-settings-markata-go-webmention\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://www.w3.org/TR/webmention/\"\u003eWebmention\u003c/a\u003e is a web standard for conversations and interactions across websites. markata-go can add the webmention endpoint link tag to your site.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable Webmention link tag in HTML head\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eendpoint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eURL of your Webmention endpoint\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebmention\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eendpoint\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://webmention.io/example.com/webmention\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen enabled, this adds the following link tag to your site\u0026rsquo;s \u003ccode\u003e\u0026lt;head\u0026gt;\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;webmention\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://webmention.io/example.com/webmention\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePopular Webmention services:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://webmention.io/\"\u003ewebmention.io\u003c/a\u003e - Free hosted webmention service\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://brid.gy/\"\u003eBridgy\u003c/a\u003e - Connects social media interactions to webmentions\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"websub-settings-markata-go-websub\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWebSub Settings (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.websub]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#websub-settings-markata-go-websub\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://www.w3.org/TR/websub/\"\u003eWebSub\u003c/a\u003e enables near-real-time feed delivery by advertising hub URLs. When enabled, markata-go adds discovery links to HTML pages and RSS/Atom feeds.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable WebSub discovery links\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehubs\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earray\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eList of WebSub hub URLs\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebsub\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehubs\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://hub.example.com/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHTML \u003ccode\u003e\u0026lt;head\u0026gt;\u003c/code\u003e includes \u003ccode\u003e\u0026lt;link rel=\u0026quot;hub\u0026quot; href=\u0026quot;...\u0026quot;\u0026gt;\u003c/code\u003e for each hub\u003c/li\u003e\n\u003cli\u003eRSS/Atom feeds include \u003ccode\u003erel=\u0026quot;hub\u0026quot;\u003c/code\u003e and \u003ccode\u003erel=\u0026quot;self\u0026quot;\u003c/code\u003e links\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"head-configuration-markata-go-head\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHead Configuration (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.head]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#head-configuration-markata-go-head\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe head configuration allows you to customize elements in the HTML \u003ccode\u003e\u0026lt;head\u0026gt;\u003c/code\u003e section, including custom meta tags, links, scripts, and feed alternate links.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etext\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRaw HTML to include in head (use with caution)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emeta\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earray\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCustom meta tags\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elink\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earray\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCustom link tags\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003escript\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earray\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCustom script tags\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ealternate_feeds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earray\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFeed alternate links (RSS, Atom, JSON)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"alternate-feed-links\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAlternate Feed Links\u003c/span\u003e \u003ca href=\"#alternate-feed-links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eBy default, markata-go includes RSS and Atom feed links in the \u003ccode\u003e\u0026lt;head\u0026gt;\u003c/code\u003e. You can customize which feeds are advertised:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Customize which feeds get \u0026lt;link rel=\u0026#34;alternate\u0026#34;\u0026gt; tags\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ealternate_feeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;rss\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;RSS Feed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/rss.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ealternate_feeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;atom\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Atom Feed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/atom.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ealternate_feeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;JSON Feed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/feed.json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eSupported feed types:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eMIME Type\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erss\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eapplication/rss+xml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRSS 2.0 feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eatom\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eapplication/atom+xml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAtom 1.0 feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ejson\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eapplication/feed+json\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eJSON Feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eExample: Only advertise JSON Feed:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ealternate_feeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;JSON Feed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/feed.json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eExample: Feed per section:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ealternate_feeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;rss\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog RSS\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/blog/rss.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ealternate_feeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;rss\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Tutorials RSS\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/tutorials/rss.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"custom-meta-tags\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Meta Tags\u003c/span\u003e \u003ca href=\"#custom-meta-tags\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emeta\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;author\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Jane Doe\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emeta\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eproperty\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;og:site_name\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"custom-link-tags\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Link Tags\u003c/span\u003e \u003ca href=\"#custom-link-tags\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elink\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;icon\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/favicon.ico\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elink\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;preconnect\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://fonts.googleapis.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecrossorigin\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"custom-script-tags\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Script Tags\u003c/span\u003e \u003ca href=\"#custom-script-tags\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esrc\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/js/analytics.js\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"glob-settings-markata-go-glob\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGlob Settings (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.glob]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#glob-settings-markata-go-glob\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epatterns\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring[]\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[\u0026quot;pages/**/*.md\u0026quot;, \u0026quot;posts/**/*.md\u0026quot;]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGlob patterns to find content files\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003euse_gitignore\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRespect .gitignore when finding files\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eslug_mode\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;flat\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSlug derivation mode: \u003ccode\u003eflat\u003c/code\u003e or \u003ccode\u003epath\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;posts/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pages/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003euse_gitignore\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug_mode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;flat\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003eslug_mode\u003c/code\u003e controls how markata derives a slug when frontmatter does not explicitly set \u003ccode\u003eslug\u003c/code\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eflat\u003c/code\u003e keeps the current default behavior and uses the filename only. \u003ccode\u003eposts/2026/hello-world.md\u003c/code\u003e becomes \u003ccode\u003ehello-world\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epath\u003c/code\u003e derives the slug from the content path, strips leading \u003ccode\u003eposts/\u003c/code\u003e or \u003ccode\u003epages/\u003c/code\u003e, and treats \u003ccode\u003eindex.md\u003c/code\u003e or \u003ccode\u003eREADME.md\u003c/code\u003e as the directory root. \u003ccode\u003eposts/notes/today.md\u003c/code\u003e becomes \u003ccode\u003enotes/today\u003c/code\u003e, and \u003ccode\u003epages/docs/README.md\u003c/code\u003e becomes \u003ccode\u003edocs\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFrontmatter \u003ccode\u003eslug\u003c/code\u003e still overrides either mode.\u003c/p\u003e\n\u003cp\u003eYou can also mix both behaviors by directory with \u003ccode\u003eslug_rules\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug_mode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;flat\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eslug_rules\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eprefix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;posts/blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;flat\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eslug_rules\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eprefix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;posts/notes\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;path\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRules match by content path prefix, and the longest matching prefix wins. That lets you keep primary content flat while letting notes or docs stay nested.\u003c/p\u003e\n\u003ch3 id=\"markdown-settings-markata-go-markdown\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMarkdown Settings (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.markdown]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#markdown-settings-markata-go-markdown\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eextensions\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring[]\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMarkdown extensions to enable\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eAvailable extensions:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003etables\u003c/code\u003e - GFM tables\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estrikethrough\u003c/code\u003e - \u003cdel\u003estrikethrough\u003c/del\u003e text\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eautolinks\u003c/code\u003e - Automatic URL linking\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etasklist\u003c/code\u003e - Task list checkboxes\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eextensions\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tables\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;strikethrough\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;autolinks\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tasklist\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"syntax-highlighting-markata-go-markdown-highlight\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSyntax Highlighting (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.markdown.highlight]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#syntax-highlighting-markata-go-markdown-highlight\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable syntax highlighting\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etheme\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChroma theme (empty = auto from palette)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eline_numbers\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow line numbers in code blocks\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehighlight\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;github-dark\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Or leave empty for auto-detection\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eline_numbers\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"template-selection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Selection\u003c/span\u003e \u003ca href=\"#template-selection\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eNamed presets and global per-format fallbacks are loaded from the\n\u003ccode\u003e[markata-go]\u003c/code\u003e namespace and work in TOML, YAML, and JSON configuration files.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplate_presets\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblog\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etxt\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog.txt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog.md\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eog\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog-og.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefault_templates\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;post.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etxt\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default.txt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen a post selects \u003ccode\u003etemplate = \u0026quot;blog\u0026quot;\u003c/code\u003e, the matching preset is used first.\n\u003ccode\u003edefault_templates\u003c/code\u003e is used after post, preset, and layout selection when no\nearlier template supplies the requested format.\u003c/p\u003e\n\u003ch3 id=\"error-pages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eError Pages\u003c/span\u003e \u003ca href=\"#error-pages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigure the generated 404 page with \u003ccode\u003e[markata-go.error_pages]\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eerror_pages\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenable_404\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecustom_404_template\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;404.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_suggestions\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe built-in \u003ccode\u003e404.html\u003c/code\u003e uses the site\u0026rsquo;s theme and offers a search field, the\nrequested address, and links back to the home page and archive. To customize its\nlayout, provide a \u003ccode\u003e404.html\u003c/code\u003e template in your \u003ccode\u003etemplates/\u003c/code\u003e directory. It extends\nthe post page by default, so it can use the same navigation, palette, and theme\ncontrols as the rest of the site.\u003c/p\u003e\n\u003ch3 id=\"resource-hints\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eResource Hints\u003c/span\u003e \u003ca href=\"#resource-hints\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eResource-hint settings use \u003ccode\u003e[markata-go.resource_hints]\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_detect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude_domains\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe feature is configured independently from plugin registration. Its default\nsettings enable hints and automatic detection; set \u003ccode\u003eenabled = false\u003c/code\u003e to keep\nthe typed setting disabled.\u003c/p\u003e\n\u003ch3 id=\"mermaid-settings-markata-go-mermaid\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMermaid Settings (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.mermaid]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#mermaid-settings-markata-go-mermaid\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWhether mermaid diagram processing is active\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emode\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;client\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRendering mode: \u003ccode\u003eclient\u003c/code\u003e (browser-side), \u003ccode\u003ecli\u003c/code\u003e (mmdc), or \u003ccode\u003echromium\u003c/code\u003e (headless Chrome)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecdn_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/assets/vendor/mermaid/mermaid.min.js\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMermaid JS URL (local by default)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etheme\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;default\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMermaid theme: \u003ccode\u003edefault\u003c/code\u003e, \u003ccode\u003edark\u003c/code\u003e, \u003ccode\u003eforest\u003c/code\u003e, \u003ccode\u003eneutral\u003c/code\u003e. Ignored when \u003ccode\u003euse_css_variables\u003c/code\u003e is true.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003euse_css_variables\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDerive diagram colors from site CSS custom properties. Nodes and edge labels use the surface color, labels use the text color, borders and edges use the border color (falling back to the primary color), and clusters use the background color.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elightbox\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable click-to-zoom lightbox overlay with interactive pan and zoom via svg-pan-zoom.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elightbox_selector\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;.glightbox-mermaid\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCSS selector for lightbox links (backward compatibility; programmatic API does not use it).\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eIn client mode, diagrams rerender when readers change the active theme or\npalette. Chromium mode uses the same palette colors in its static SVGs. CLI mode\nuses the Mermaid CLI theme and configuration.\u003c/p\u003e\n\u003ch4 id=\"cli-mode-settings-markata-go-mermaid-cli\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCLI Mode Settings (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.mermaid.cli]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#cli-mode-settings-markata-go-mermaid-cli\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emmdc_path\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePath to the mmdc binary. Auto-detected if empty.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eextra_args\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAdditional command-line arguments passed to mmdc.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"chromium-mode-settings-markata-go-mermaid-chromium\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChromium Mode Settings (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.mermaid.chromium]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#chromium-mode-settings-markata-go-mermaid-chromium\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebrowser_path\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePath to Chrome/Chromium binary. Auto-detected if empty.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etimeout\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e30\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMaximum seconds to wait for a diagram to render.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emax_concurrent\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e4\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMaximum number of parallel diagram renders.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eno_sandbox\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDisable Chromium sandbox. Required in containers (Docker, Distrobox, etc.).\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emermaid\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003euse_css_variables\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Diagrams automatically match your site palette\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elightbox\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e             \u003cspan class=\"c\"\u003e# Click any diagram to zoom, pan, and explore\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo pre-render diagrams to static SVGs using Chromium (no client-side JS needed):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emermaid\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;chromium\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emermaid\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003echromium\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etimeout\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e30\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_concurrent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# no_sandbox = true         # Required inside Docker or other containers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePre-rendered Mermaid SVGs are cached automatically. Hot builds reuse cached SVGs\nwhen the diagram source and rendering inputs match, avoiding repeated Chromium or\n\u003ccode\u003emmdc\u003c/code\u003e rendering for unchanged diagrams.\u003c/p\u003e\n\u003ch4 id=\"chromium-in-containers-docker-distrobox-podman\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChromium in Containers (Docker, Distrobox, Podman)\u003c/span\u003e \u003ca href=\"#chromium-in-containers-docker-distrobox-podman\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eChromium\u0026rsquo;s sandbox requires kernel capabilities that most containers restrict.\nSet \u003ccode\u003eno_sandbox = true\u003c/code\u003e when running inside Docker, Distrobox, Podman, or\nsimilar environments:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emermaid\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003echromium\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eno_sandbox\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eInstalling Chrome without sudo:\u003c/strong\u003e If your container does not have Chrome or\nChromium installed, download \u003ccode\u003echrome-headless-shell\u003c/code\u003e from\n\u003ca href=\"https://googlechromelabs.github.io/chrome-for-testing/\"\u003eChrome for Testing\u003c/a\u003e.\nThis is a lightweight headless binary (~180 MB) that requires no GUI\ndependencies and no root access:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Download and extract (adjust version as needed)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e /tmp\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -fsSL https://storage.googleapis.com/chrome-for-testing-public/LATEST_RELEASE_STABLE -o version.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eVERSION\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003ecat version.txt\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -fsSL \u003cspan class=\"s2\"\u003e\u0026#34;https://storage.googleapis.com/chrome-for-testing-public/\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eVERSION\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e/linux64/chrome-headless-shell-linux64.zip\u0026#34;\u003c/span\u003e -o headless.zip\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eunzip headless.zip\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Install to ~/.local (no sudo needed)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir -p ~/.local/lib/chrome-headless-shell\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emv chrome-headless-shell-linux64/* ~/.local/lib/chrome-headless-shell/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create a wrapper script so markata-go auto-detects it\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir -p ~/.local/bin\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecat \u0026gt; ~/.local/bin/headless-shell \u003cspan class=\"s\"\u003e\u0026lt;\u0026lt; \u0026#39;EOF\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e#!/bin/sh\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003eexec \u0026#34;$HOME/.local/lib/chrome-headless-shell/chrome-headless-shell\u0026#34; \u0026#34;$@\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003eEOF\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003echmod +x ~/.local/bin/headless-shell\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Verify\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eheadless-shell --version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003emarkata-go auto-detects \u003ccode\u003eheadless-shell\u003c/code\u003e in your \u003ccode\u003ePATH\u003c/code\u003e. You can also set the\npath explicitly:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emermaid\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003echromium\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebrowser_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/home/you/.local/lib/chrome-headless-shell/chrome-headless-shell\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eno_sandbox\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo disable the lightbox overlay (diagrams render inline only):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emermaid\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elightbox\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo use a fixed Mermaid theme instead of CSS variables:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emermaid\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003euse_css_variables\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dark\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSee the \u003ca href=\"../reference/plugins.md#mermaid\"\u003eplugin reference\u003c/a\u003e for full details on lightbox interaction, CSS classes, and theming.\u003c/p\u003e\n\u003ch3 id=\"image-optimization-settings-markata-go-image_optimization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eImage Optimization Settings (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.image_optimization]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#image-optimization-settings-markata-go-image_optimization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable image optimization\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eformats\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring[]\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;avif\u0026quot;, \u0026quot;webp\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOutput formats to generate\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003equality\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e80\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault quality for all formats\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eavif_quality\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e80\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAVIF quality override\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewebp_quality\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e80\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWebP quality override\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewidths\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint[]\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[480, 768, 1200]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eResponsive widths to generate\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esizes\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;100vw\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSizes attribute for responsive sources\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecache_dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.markata/image-cache\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCache directory for encode metadata\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eavifenc_path\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePath to \u003ccode\u003eavifenc\u003c/code\u003e (auto-detect if empty)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecwebp_path\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePath to \u003ccode\u003ecwebp\u003c/code\u003e (auto-detect if empty)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eimage_optimization\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avif\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;webp\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003equality\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewidths\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e480\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e768\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1200\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esizes\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;100vw\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe plugin generates local AVIF/WebP variants when an encoder is available. Trusted\nDropper image URLs receive responsive \u003ccode\u003esrcset\u003c/code\u003e candidates that use Dropper\u0026rsquo;s width\nparameter; the build does not download or generate those remote variants. Other\nexternal URLs and data URIs remain unchanged. Missing local encoders do not fail\nthe build.\u003c/p\u003e\n\u003ch3 id=\"layout-system-markata-go-layout\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLayout System (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.layout]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#layout-system-markata-go-layout\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe layout system controls page structure including sidebars, table of contents, headers, and footers. Different layouts can be assigned to different content types.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;blog\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault layout: \u003ccode\u003e\u0026quot;docs\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;blog\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;landing\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;bare\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epaths\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003emap\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMap URL prefixes to layouts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeeds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003emap\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMap feed slugs to layouts\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elayout\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Default layout for all pages\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Path-based layout selection\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elayout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/docs/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/blog/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/about/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;landing\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Feed-based layout selection\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elayout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"documentation-layout-markata-go-layout-docs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocumentation Layout (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.layout.docs]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#documentation-layout-markata-go-layout-docs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eThe default theme includes a documentation page template. Set \u003ccode\u003ename = \u0026quot;docs\u0026quot;\u003c/code\u003e\nto get a documentation sidebar, a centered reading column, and an optional\ntable of contents. Add a project template at \u003ccode\u003elayouts/docs.html\u003c/code\u003e only when you\nneed to replace the built-in markup.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esidebar_position\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;left\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSidebar position: \u003ccode\u003e\u0026quot;left\u0026quot;\u003c/code\u003e or \u003ccode\u003e\u0026quot;right\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esidebar_width\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;280px\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSidebar width\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esidebar_collapsible\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAllow sidebar collapse\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esidebar_default_open\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSidebar open by default\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etoc_position\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;right\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTOC position: \u003ccode\u003e\u0026quot;left\u0026quot;\u003c/code\u003e or \u003ccode\u003e\u0026quot;right\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etoc_width\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;220px\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTOC width\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etoc_collapsible\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAllow TOC collapse\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etoc_default_open\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTOC open by default\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econtent_max_width\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;800px\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMaximum content width\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eheader_style\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;minimal\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHeader: \u003ccode\u003e\u0026quot;full\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;minimal\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;transparent\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;none\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efooter_style\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;minimal\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFooter: \u003ccode\u003e\u0026quot;full\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;minimal\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;none\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elayout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edocs\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar_position\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;left\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar_width\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;280px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etoc_position\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;right\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etoc_width\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;220px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtent_max_width\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;800px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eheader_style\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;minimal\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efooter_style\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;minimal\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe default template uses Markata\u0026rsquo;s shared base page, theme assets, sidebar\nnavigation, and post typography. It reads sidebar entries from\n\u003ccode\u003e[markata-go.sidebar]\u003c/code\u003e and table-of-contents entries from the document\nheadings. A project \u003ccode\u003etemplates/layouts/docs.html\u003c/code\u003e takes precedence when you\nneed custom markup.\u003c/p\u003e\n\u003ch4 id=\"blog-layout-markata-go-layout-blog\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBlog Layout (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.layout.blog]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#blog-layout-markata-go-layout-blog\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eSingle-column layout optimized for reading long-form content.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econtent_max_width\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;720px\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMaximum content width\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshow_toc\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow the table of contents sidebar on blog-layout posts that have headings\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etoc_position\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;right\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTOC position if enabled: \u003ccode\u003e\u0026quot;left\u0026quot;\u003c/code\u003e or \u003ccode\u003e\u0026quot;right\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etoc_width\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;200px\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTOC width\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eheader_style\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;full\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHeader style\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efooter_style\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;full\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFooter style\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshow_author\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDisplay post author\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshow_date\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDisplay post date\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshow_tags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDisplay post tags\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshow_reading_time\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDisplay estimated reading time\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshow_prev_next\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDisplay prev/next navigation\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elayout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblog\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtent_max_width\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;720px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_toc\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_author\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_tags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_reading_time\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_prev_next\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"landing-layout-markata-go-layout-landing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLanding Layout (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.layout.landing]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#landing-layout-markata-go-layout-landing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eFull-width layout for marketing pages and home pages.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econtent_max_width\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;100%\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMaximum content width\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eheader_style\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;transparent\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHeader style\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eheader_sticky\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSticky header\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efooter_style\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;full\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFooter style\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehero_enabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable hero section\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elayout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elanding\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtent_max_width\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;100%\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eheader_style\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;transparent\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eheader_sticky\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehero_enabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"sidebar-configuration-markata-go-sidebar\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSidebar Configuration (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.sidebar]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#sidebar-configuration-markata-go-sidebar\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigure the sidebar navigation component for documentation and guides.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow sidebar\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eposition\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;left\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePosition: \u003ccode\u003e\u0026quot;left\u0026quot;\u003c/code\u003e or \u003ccode\u003e\u0026quot;right\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewidth\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;280px\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSidebar width\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecollapsible\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAllow collapse\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edefault_open\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOpen by default\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSidebar title/header\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emulti_feed\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMulti-feed mode with sections\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeeds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring[]\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFeed slugs for multi-feed mode\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;left\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewidth\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;280px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Documentation\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Manual navigation structure\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Getting Started\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/docs/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Guides\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003echildren\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Configuration\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/docs/guides/configuration/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Templates\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/docs/guides/templates/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Themes\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/docs/guides/themes/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Feeds\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/docs/guides/feeds/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Reference\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003echildren\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;CLI\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/docs/reference/cli/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Plugins\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/docs/reference/plugins/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"path-specific-sidebars-markata-go-sidebar-paths\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePath-Specific Sidebars (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.sidebar.paths]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#path-specific-sidebars-markata-go-sidebar-paths\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eConfigure different sidebar content for different URL paths.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/docs/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Documentation\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efeed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Auto-generate from this feed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/guides/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Guides\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/guides/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauto_generate\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edirectory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;guides\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eorder_by\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;nav_order\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"multi-feed-sidebars\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMulti-Feed Sidebars\u003c/span\u003e \u003ca href=\"#multi-feed-sidebars\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eShow posts from multiple feeds in collapsible sections.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emulti_feed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;guides\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorials\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_sections\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efeed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Documentation\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecollapsed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_sections\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efeed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;guides\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Guides\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecollapsed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_items\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"table-of-contents-markata-go-toc\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTable of Contents (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.toc]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#table-of-contents-markata-go-toc\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigure the table of contents component for document navigation.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow TOC\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eauto_enable\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAuto-show based on thresholds\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emin_toc_links\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e3\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMin headings for auto-show\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emin_word_count\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e500\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMin words for auto-show\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eposition\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;right\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePosition: \u003ccode\u003e\u0026quot;left\u0026quot;\u003c/code\u003e or \u003ccode\u003e\u0026quot;right\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewidth\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;220px\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTOC width\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emin_depth\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e2\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMinimum heading level (h2 = 2)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emax_depth\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e4\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMaximum heading level (h4 = 4)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;On this page\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTOC section title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecollapsible\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAllow collapse\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edefault_open\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOpen by default\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003escroll_spy\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHighlight current section\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etoc\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_enable\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Auto-show TOC for long posts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emin_toc_links\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e           \u003cspan class=\"c\"\u003e# Show if 3+ headings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emin_word_count\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e500\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Show if 500+ words\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;right\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewidth\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;220px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;On this page\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emin_depth\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_depth\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escroll_spy\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"header-configuration-markata-go-header\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHeader Configuration (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.header]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#header-configuration-markata-go-header\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigure the header component for layouts.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estyle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;full\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eStyle: \u003ccode\u003e\u0026quot;full\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;minimal\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;transparent\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;none\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esticky\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eStick to top when scrolling\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshow_logo\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDisplay site logo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshow_title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDisplay site title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshow_nav\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDisplay navigation links\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshow_search\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDisplay search box\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshow_theme_toggle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDisplay dark/light toggle in header (legacy gate; also controlled by \u003ccode\u003etheme.switcher.mode_toggle\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eheader\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;full\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esticky\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_logo\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_title\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_nav\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_search\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_theme_toggle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"footer-configuration-markata-go-footer_layout\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFooter Configuration (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.footer_layout]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#footer-configuration-markata-go-footer_layout\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigure the footer component for layouts.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estyle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;full\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eStyle: \u003ccode\u003e\u0026quot;full\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;minimal\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;none\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esticky\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eStick to bottom\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshow_copyright\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDisplay copyright notice\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecopyright_text\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCustom copyright text\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshow_social_links\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDisplay social media links\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshow_nav_links\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDisplay navigation links\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efooter_layout\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;full\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esticky\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_copyright\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecopyright_text\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;© 2024 My Site. All rights reserved.\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_social_links\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_nav_links\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"link-avatars-markata-go-link_avatars\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLink Avatars (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.link_avatars]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#link-avatars-markata-go-link_avatars\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd favicon icons next to external links.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable link avatars\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emode\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;js\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;js\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;local\u0026quot;\u003c/code\u003e, or \u003ccode\u003e\u0026quot;hosted\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eselector\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;a[href^='http']\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCSS selector for links to enhance\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eservice\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;duckduckgo\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFavicon service (\u003ccode\u003educkduckgo\u003c/code\u003e, \u003ccode\u003egoogle\u003c/code\u003e, \u003ccode\u003ecustom\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etemplate\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCustom service template (used when \u003ccode\u003eservice = \u0026quot;custom\u0026quot;\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esize\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e16\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eIcon size in pixels\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eposition\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;before\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;before\u0026quot;\u003c/code\u003e or \u003ccode\u003e\u0026quot;after\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eignore_domains\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring[]\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDomains to skip\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eignore_origins\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring[]\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFull origins to skip\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eignore_selectors\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring[]\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCSS selectors to skip\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eignore_classes\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring[]\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCSS classes to skip\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eignore_ids\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring[]\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eElement IDs to skip\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehosted_base_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBase URL for hosted mode assets\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elink_avatars\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;local\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eservice\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;duckduckgo\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esize\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;before\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eignore_domains\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;localhost\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;127.0.0.1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"blogroll-configuration-markata-go-blogroll\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBlogroll Configuration (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.blogroll]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#blogroll-configuration-markata-go-blogroll\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigure the blogroll and RSS reader functionality to display feeds from blogs you follow.\nBlogroll fetches are cached by fetch timestamp, and stale cached results are reused when\nrefresh attempts fail.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable blogroll plugin\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecache_dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;cache/blogroll\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCache directory\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecache_duration\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;24h\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCache TTL (Go duration format)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etimeout\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e30\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHTTP timeout in seconds\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econcurrent_requests\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e5\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMax parallel feed fetches\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emax_entries_per_feed\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e50\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMax entries per feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efallback_image_service\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLast-resort screenshot template for Reader previews after article and source images\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cache/blogroll\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_duration\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;24h\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etimeout\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e30\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econcurrent_requests\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_entries_per_feed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Custom templates\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blogroll.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereader\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;reader.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"adding-feeds-markata-go-blogroll-feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdding Feeds (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[[markata-go.blogroll.feeds]]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#adding-feeds-markata-go-blogroll-feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eRequired\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eurl\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eRSS or Atom feed URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eDisplay name (auto-fetched if not set)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edescription\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eShort description\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecategory\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eGroup feeds together\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring[]\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eAdditional labels\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esite_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eMain website URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eimage_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eLogo or icon URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eactive\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eSet \u003ccode\u003efalse\u003c/code\u003e to disable\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Technology blogs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://simonwillison.net/atom/everything/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Simon Willison\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Creator of Datasette, Django co-creator\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecategory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Technology\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;python\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ai\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;llm\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://jvns.ca/atom.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Julia Evans\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Making hard things easy to understand\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecategory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Technology\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;linux\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;networking\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Design blogs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://css-tricks.com/feed/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;CSS-Tricks\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecategory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Design\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;css\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;frontend\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eGenerated pages:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/blogroll/\u003c/code\u003e - Directory of all feeds grouped by category\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/reader/\u003c/code\u003e - Curated reader page with day grouping, source favicons, and columns\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSee the \u003ca href=\"/docs/guides/blogroll/\"\u003eBlogroll Guide\u003c/a\u003e for detailed configuration and customization.\u003c/p\u003e\n\u003ch3 id=\"post-output-formats-markata-go-post_formats\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePost Output Formats (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.post_formats]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#post-output-formats-markata-go-post_formats\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehtml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate standard HTML pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkdown\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate raw markdown source\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etext\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate plain terminal-friendly text output\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eansi\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate ANSI-styled terminal output\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eog\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate OpenGraph card HTML\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epost_formats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e       \u003cspan class=\"c\"\u003e# /slug/index.html (default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e   \u003cspan class=\"c\"\u003e# /slug.md (canonical) - enabled by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e       \u003cspan class=\"c\"\u003e# /slug.txt (canonical) - enabled by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eansi\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e       \u003cspan class=\"c\"\u003e# /slug.ansi (canonical) - opt-in rich terminal output\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eog\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e         \u003cspan class=\"c\"\u003e# /slug/og/index.html (social card)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eReversed Redirects for txt/md/ansi\u003c/strong\u003e: For \u003ccode\u003e.txt\u003c/code\u003e, \u003ccode\u003e.md\u003c/code\u003e, and \u003ccode\u003e.ansi\u003c/code\u003e formats, content is placed at the canonical URL (\u003ccode\u003e/slug.txt\u003c/code\u003e, \u003ccode\u003e/slug.md\u003c/code\u003e, \u003ccode\u003e/slug.ansi\u003c/code\u003e) with backwards-compatible redirects at \u003ccode\u003e/slug/index.\u0026lt;ext\u0026gt;\u003c/code\u003e and \u003ccode\u003e/slug/index.\u0026lt;ext\u0026gt;/index.html\u003c/code\u003e. This supports standard web txt files like \u003ccode\u003erobots.txt\u003c/code\u003e, \u003ccode\u003ellms.txt\u003c/code\u003e, and \u003ccode\u003ehumans.txt\u003c/code\u003e while adding an explicit ANSI terminal view.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCanonical URLs and Alternate Links\u003c/strong\u003e: When post formats are enabled, markata-go automatically adds:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e\u0026lt;link rel=\u0026quot;canonical\u0026quot;\u0026gt;\u003c/code\u003e pointing to the post\u0026rsquo;s primary URL (for SEO)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e\u0026lt;link rel=\u0026quot;alternate\u0026quot;\u0026gt;\u003c/code\u003e for each enabled format:\n\u003cul\u003e\n\u003cli\u003eMarkdown: \u003ccode\u003etype=\u0026quot;text/markdown\u0026quot;\u003c/code\u003e linking to \u003ccode\u003e/slug.md\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eANSI terminal: \u003ccode\u003etype=\u0026quot;text/plain\u0026quot;\u003c/code\u003e linking to \u003ccode\u003e/slug.ansi\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eOG Card: \u003ccode\u003etype=\u0026quot;text/html\u0026quot;\u003c/code\u003e linking to \u003ccode\u003eog/\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eVisible Format Links\u003c/strong\u003e: When alternate formats are enabled, posts and feeds display visible links allowing visitors to access content in their preferred format.\u003c/p\u003e\n\u003cp\u003eFeed sidebar variant links use the same canonical short URLs (\u003ccode\u003e/slug.md\u003c/code\u003e, \u003ccode\u003e/slug.txt\u003c/code\u003e, \u003ccode\u003e/slug.ansi\u003c/code\u003e) rather than nested \u003ccode\u003e/slug/index.\u0026lt;ext\u0026gt;\u003c/code\u003e paths.\nIf a post format is disabled, its sidebar link is omitted.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePer-post frontmatter overrides\u003c/strong\u003e: A post can override any of these format flags in frontmatter with a \u003ccode\u003epost_formats\u003c/code\u003e object. Overrides merge with the site defaults, so omitted keys continue to inherit from \u003ccode\u003e[markata-go.post_formats]\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;One-off terminal post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epost_formats\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eansi\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eog\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOG card pages automatically include:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e\u0026lt;link rel=\u0026quot;canonical\u0026quot;\u0026gt;\u003c/code\u003e pointing back to the original post\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e\u0026lt;meta name=\u0026quot;robots\u0026quot; content=\u0026quot;noindex, nofollow\u0026quot;\u0026gt;\u003c/code\u003e to prevent search engine indexing\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSee the [[post-formats|Post Output Formats Guide]] for detailed usage including social image generation and content negotiation.\u003c/p\u003e\n\u003ch3 id=\"llm-friendly-site-index-markata-go-llms_txt\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLLM-Friendly Site Index (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.llms_txt]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#llm-friendly-site-index-markata-go-llms_txt\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFull-site builds generate a concise \u003ccode\u003e/llms.txt\u003c/code\u003e Markdown index by default.\nIt lists the site overview, up to 30 public documentation/recent pages, and\na sitemap link if available. Private, draft, unpublished, skipped, and\n\u003ccode\u003enoindex\u003c/code\u003e posts are excluded. Links prefer the generated \u003ccode\u003e.md\u003c/code\u003e version\nof pages when enabled and fall back to HTML URLs otherwise.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ellms_txt\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_pages\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e30\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eenabled\u003c/code\u003e: defaults to \u003ccode\u003etrue\u003c/code\u003e; set \u003ccode\u003efalse\u003c/code\u003e to disable the generator.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emax_pages\u003c/code\u003e: defaults to \u003ccode\u003e30\u003c/code\u003e, clamped to \u003ccode\u003e1-100\u003c/code\u003e (invalid values\nuse the default).\u003c/li\u003e\n\u003cli\u003eA hand-authored \u003ccode\u003ellms.md\u003c/code\u003e (published with text format), project\n\u003ccode\u003estatic/llms.txt\u003c/code\u003e, or unmanaged \u003ccode\u003eoutput/llms.txt\u003c/code\u003e takes precedence.\u003c/li\u003e\n\u003cli\u003eA private \u003ccode\u003ellms.md\u003c/code\u003e does not suppress the public generated index. Authored\nsources remain authoritative when automatic generation is disabled.\u003c/li\u003e\n\u003cli\u003eAbsolute links use the configured site URL only when it has no credentials,\nquery, or fragment; otherwise the index uses relative links.\u003c/li\u003e\n\u003cli\u003eSingle-page builds never generate this site-wide index.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ellms.txt\u003c/code\u003e is a content guide, \u003cstrong\u003enot\u003c/strong\u003e a robots/training permission policy.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSee \u003ca href=\"/docs/guides/standard-txt-files/\"\u003eStandard Web Txt Files\u003c/a\u003e.\u003c/p\u003e\n\u003ch3 id=\"well-known-files-markata-go-well_known\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWell-Known Files (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.well_known]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#well-known-files-markata-go-well_known\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable auto-generated \u003ccode\u003e.well-known\u003c/code\u003e endpoints\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eauto_generate\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earray\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[...]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEntries to auto-generate from site metadata\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003essh_fingerprint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSSH fingerprint for \u003ccode\u003e/.well-known/sshfp\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ekeybase_username\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eKeybase username for \u003ccode\u003e/.well-known/keybase.txt\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewell_known\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_generate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;host-meta\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;host-meta.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;webfinger\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;nodeinfo\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;links\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Optional entries requiring config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003essh_fingerprint\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;SHA256:abcdef...\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ekeybase_username\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;username\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eGenerated files:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/host-meta\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/host-meta.json\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/webfinger\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/nodeinfo\u003c/code\u003e and \u003ccode\u003e/nodeinfo/2.0\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/time\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/links\u003c/code\u003e (grouped outbound links by target domain; enabled by default)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/internal-links\u003c/code\u003e (grouped internal links by target URL; enabled by default)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/external-links/\u003c/code\u003e (HTML view of the same grouped outbound link data)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/internal-links/\u003c/code\u003e (HTML view of grouped internal link destinations)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/sshfp\u003c/code\u003e (when \u003ccode\u003essh_fingerprint\u003c/code\u003e is set)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/keybase.txt\u003c/code\u003e (when \u003ccode\u003ekeybase_username\u003c/code\u003e is set)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTemplates live under \u003ccode\u003etemplates/well-known/\u003c/code\u003e plus \u003ccode\u003etemplates/external-links.html\u003c/code\u003e and \u003ccode\u003etemplates/internal-links.html\u003c/code\u003e for the HTML page overrides.\u003c/p\u003e\n\u003ch3 id=\"content-templates-content_templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContent Templates (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[content_templates]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#content-templates-content_templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eContent templates configure the \u003ccode\u003emarkata-go new\u003c/code\u003e command, controlling default frontmatter and output directories for different content types.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edirectory\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;content-templates\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDirectory for user-defined template files\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eplacement\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{post:\u0026quot;pages/post\u0026quot;,page:\u0026quot;pages\u0026quot;,docs:\u0026quot;docs\u0026quot;}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMap of template names to output directories\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etemplates\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earray\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCustom template definitions\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent_templates\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edirectory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;content-templates\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Override default directory placement\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent_templates\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eplacement\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e          \u003cspan class=\"c\"\u003e# markata-go new -t post creates in blog/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epage\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pages\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edocs\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;documentation\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Define custom templates\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent_templates\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorial\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edirectory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebody\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;## Prerequisites\\n\\n## Steps\\n\\n## Summary\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent_templates\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efrontmatter\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplateKey\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorial\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eseries\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent_templates\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;recipe\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edirectory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;recipes\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebody\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;## Ingredients\\n\\n## Instructions\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent_templates\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efrontmatter\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplateKey\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;recipe\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eprep_time\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecook_time\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eservings\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eFile-based Templates:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCreate markdown files in the \u003ccode\u003econtent-templates/\u003c/code\u003e directory (or your configured directory):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# content-templates/changelog.md\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003estarter\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003echangelog\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eRecord notable changes for a release.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ealiases\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003erelease-notes\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplateKey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003echangelog\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e_directory\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003echangelogs\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{title}}\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{date}}\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Added\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Changed\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Fixed\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe \u003ccode\u003e_directory\u003c/code\u003e field in frontmatter specifies the output directory and is removed from generated content.\u003c/p\u003e\n\u003cp\u003eMarkdown starters are shared by \u003ccode\u003emarkata-go new\u003c/code\u003e, its interactive TUI, and the\nweb workbench. Optional \u003ccode\u003estarter.name\u003c/code\u003e, \u003ccode\u003estarter.description\u003c/code\u003e, and\n\u003ccode\u003estarter.aliases\u003c/code\u003e fields describe the starter without consuming page\nfrontmatter keys. Supported variables are \u003ccode\u003e{{title}}\u003c/code\u003e, \u003ccode\u003e{{slug}}\u003c/code\u003e, \u003ccode\u003e{{date}}\u003c/code\u003e, and\n\u003ccode\u003e{{datetime}}\u003c/code\u003e. See \u003ca href=\"content-starters.md\"\u003eShared Markdown content starters\u003c/a\u003e\nfor the full format and examples.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eUsage:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new --list                     \u003cspan class=\"c1\"\u003e# List all templates\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new \u003cspan class=\"s2\"\u003e\u0026#34;My Post\u0026#34;\u003c/span\u003e                  \u003cspan class=\"c1\"\u003e# Use default (post) template\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new \u003cspan class=\"s2\"\u003e\u0026#34;Tutorial\u0026#34;\u003c/span\u003e -t tutorial     \u003cspan class=\"c1\"\u003e# Use custom template\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new \u003cspan class=\"s2\"\u003e\u0026#34;Recipe\u0026#34;\u003c/span\u003e -t recipe --dir custom  \u003cspan class=\"c1\"\u003e# Override directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBuilt-in content templates are listed with aliases in \u003ccode\u003emarkata-go new --list\u003c/code\u003e, such as \u003ccode\u003enote (aka: ping, thought, status, tweet)\u003c/code\u003e. Built-in aliases are also accepted directly with \u003ccode\u003e--template\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eGenerated files include frontmatter plus the configured body template, but they do not include a starter \u003ccode\u003e# H1\u003c/code\u003e heading. markata-go already renders the page title from frontmatter, so starter content should begin with body text or \u003ccode\u003e##\u003c/code\u003e sections.\u003c/p\u003e\n\u003cp\u003eSee [[cli-reference|CLI Reference]] for complete \u003ccode\u003enew\u003c/code\u003e command documentation.\u003c/p\u003e\n\u003ch3 id=\"search-settings-search\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSearch Settings (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[search]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#search-settings-search\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSite-wide search is enabled by default using \u003ca href=\"https://pagefind.app/\"\u003ePagefind\u003c/a\u003e. You can also use the built-in bleve search engine for a self-hosted API.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable/disable search\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebackend\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;pagefind\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSearch engine: \u003ccode\u003e\u0026quot;pagefind\u0026quot;\u003c/code\u003e or \u003ccode\u003e\u0026quot;bleve\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eendpoint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;/api/search\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAPI endpoint path for bleve search\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eposition\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;navbar\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWhere to show search: \u003ccode\u003enavbar\u003c/code\u003e, \u003ccode\u003esidebar\u003c/code\u003e, \u003ccode\u003efooter\u003c/code\u003e, \u003ccode\u003ecustom\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eplaceholder\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;Search...\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSearch input placeholder text\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshow_images\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow thumbnails in search results\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexcerpt_length\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e200\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCharacters for result excerpts\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebackend\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pagefind\u0026#34;\u003c/span\u003e        \u003cspan class=\"c\"\u003e# or \u0026#34;bleve\u0026#34; for self-hosted API\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eendpoint\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/api/search\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# API path (bleve only)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;navbar\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eplaceholder\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Search...\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_images\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexcerpt_length\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e200\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Pagefind CLI options\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epagefind\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebundle_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;_pagefind\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Output directory for search index\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eroot_selector\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;main\u0026#34;\u003c/span\u003e       \u003cspan class=\"c\"\u003e# CSS selector for searchable content\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude_selectors\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;.no-search\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;nav\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;footer\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Elements to exclude\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Bleve search API options\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebleve\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efuzzy\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e               \u003cspan class=\"c\"\u003e# Default fuzzy matching\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elimit\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# Default result limit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_limit\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e             \u003cspan class=\"c\"\u003e# Maximum allowed limit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecors_origins\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;*\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Allowed CORS origins\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePrivacy:\u003c/strong\u003e Private posts are searchable by public metadata such as title, description, tags, and date. Their body content and media are never included in the search index or exposed by the search API.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDev mode:\u003c/strong\u003e During \u003ccode\u003emarkata-go serve\u003c/code\u003e, the bleve search API is automatically mounted at the configured endpoint. A dev-only script injects \u003ccode\u003ewindow.__markataSearchEndpoint\u003c/code\u003e so the frontend can use the local API — this is never included in production builds.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRequirements:\u003c/strong\u003e Pagefind CLI must be installed. Install the standalone binary from \u003ca href=\"https://github.com/Pagefind/pagefind/releases\"\u003eGitHub releases\u003c/a\u003e, or enable \u003ccode\u003eauto_install = true\u003c/code\u003e under \u003ccode\u003e[search.pagefind]\u003c/code\u003e to let markata-go download it automatically. If not installed, search is skipped with a warning.\u003c/p\u003e\n\u003cp\u003eSee the [[search|Search Guide]] for detailed usage and customization.\u003c/p\u003e\n\u003ch3 id=\"feed-defaults-markata-go-feed_defaults\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Defaults (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.feed_defaults]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#feed-defaults-markata-go-feed_defaults\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSet \u003ccode\u003eviews = [\u0026quot;default\u0026quot;, \u0026quot;simple\u0026quot;, \u0026quot;calendar\u0026quot;]\u003c/code\u003e to choose the available HTML\npresentations. All three are enabled by default. Per-feed \u003ccode\u003eviews\u003c/code\u003e replaces this\nlist; omitted values inherit it. Every explicit list must include \u003ccode\u003edefault\u003c/code\u003e,\nand an empty list or unknown name is invalid. Disabling \u003ccode\u003esimple\u003c/code\u003e suppresses its\nHTML output even when \u003ccode\u003eformats.simple_html\u003c/code\u003e is true; disabling \u003ccode\u003ecalendar\u003c/code\u003e removes\nits controls and assets. Syndication formats are independent.\nSee \u003ca href=\"./feed-views.md\"\u003eFeed Views\u003c/a\u003e for examples.\u003c/p\u003e\n\u003cp\u003eThe implicit \u003ca href=\"./pins.md\"\u003ePins feed\u003c/a\u003e uses 100 items per page and manual pagination.\nTo change those values, define a feed with \u003ccode\u003eslug = \u0026quot;pins\u0026quot;\u003c/code\u003e; its configuration\ntakes precedence over the built-in Pins definition.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eitems_per_page\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e10\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault items per page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eorphan_threshold\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e3\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMinimum items for a separate page\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eorphan_threshold\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esimple_html\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esitemap\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;feed.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esimple_html\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;simple-feed.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;feed.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;atom.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;feed.json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecard\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;card.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esitemap\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;sitemap.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esyndication\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_items\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_content\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esite_archive_disabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efeed_archives_disabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds_page\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Feeds\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Browse the public feeds available on this site.\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;feeds.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug_prefix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;feeds\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"feed-format-options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Format Options\u003c/span\u003e \u003ca href=\"#feed-format-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFormat\u003c/th\u003e\n\u003cth\u003eOutput Path\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehtml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/{slug}/index.html\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePaginated HTML pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esimple_html\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/{slug}/simple/index.html\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCompact HTML list\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erss\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/{slug}/rss.xml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRSS 2.0 feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eatom\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/{slug}/atom.xml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAtom 1.0 feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ejson\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/{slug}/feed.json\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eJSON Feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esitemap\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/{slug}/sitemap.xml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSitemap XML\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkdown\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/{slug}.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMarkdown output\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etext\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/{slug}.txt\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePlain text output\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"feed-configuration-markata-go-feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Configuration (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[[markata-go.feeds]]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#feed-configuration-markata-go-feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEach feed is defined as an array item. The default config ships with an archive feed at \u003ccode\u003e/archive/\u003c/code\u003e.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eslug\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eURL-safe identifier (empty = root index)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFeed title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edescription\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFeed description\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efilter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFilter expression for selecting posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esort\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eField to sort posts by\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ereverse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReverse sort order\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eitems_per_page\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003einherited\u003c/td\u003e\n\u003ctd\u003eItems per page (inherits from defaults)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eorphan_threshold\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003einherited\u003c/td\u003e\n\u003ctd\u003eOrphan threshold (inherits from defaults)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elimit\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e0\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHard cap on total items (0 = unlimited)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e0\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSkip the first N items (0 = none)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eformats\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003einherited\u003c/td\u003e\n\u003ctd\u003eOutput formats (inherits from defaults)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etemplates\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003einherited\u003c/td\u003e\n\u003ctd\u003eTemplates (inherits from defaults)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003earchive_disabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDisable \u003ccode\u003e/{slug}/archive/*\u003c/code\u003e syndication endpoints for this feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eSet an individual feed format to \u003ccode\u003efalse\u003c/code\u003e to disable it while inheriting the\nother formats from \u003ccode\u003e[markata-go.feed_defaults.formats]\u003c/code\u003e. Omitted format keys\nkeep their default values in TOML, YAML, and JSON configs. For example:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;draft\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esitemap\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Main blog feed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;All blog posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Home page feed (empty slug = root index.html)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Latest Posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Featured posts feed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;featured\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Featured\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Featured posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and featured == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"series-settings-markata-go-series\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSeries Settings (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go.series]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#series-settings-markata-go-series\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSeries automatically generate ordered feed pages and navigation from \u003ccode\u003eseries\u003c/code\u003e frontmatter.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eslug_prefix\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;series\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eURL prefix for series feeds (e.g., \u003ccode\u003e/series/\u0026lt;name\u0026gt;/\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eauto_sidebar\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAuto-enable the series sidebar on series posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edefaults\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003esee below\u003c/td\u003e\n\u003ctd\u003eDefault settings for all series feeds\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eoverrides\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003emap[string]object\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePer-series overrides (keyed by series slug or name)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug_prefix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;series\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_sidebar\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefaults\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esimple_html\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esitemap\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eoverrides\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;building-a-rest-api\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Building a REST API with Go\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;A complete guide from zero to production\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eoverrides\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;building-a-rest-api\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"environment-variable-overrides\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment Variable Overrides\u003c/span\u003e \u003ca href=\"#environment-variable-overrides\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAll configuration options can be overridden via environment variables using the \u003ccode\u003eMARKATA_GO_\u003c/code\u003e prefix.\u003c/p\u003e\n\u003ch3 id=\"variable-naming-convention\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVariable Naming Convention\u003c/span\u003e \u003ca href=\"#variable-naming-convention\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnvironment variables follow the pattern: \u003ccode\u003eMARKATA_GO_{SECTION}_{KEY}\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eKeys are UPPERCASE\u003c/li\u003e\n\u003cli\u003eUnderscores separate nested keys\u003c/li\u003e\n\u003cli\u003eSection names use underscores\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Core settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_OUTPUT_DIR\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003edist\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_TITLE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_CONCURRENCY\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Glob settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_GLOB_PATTERNS\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;posts/**/*.md,pages/*.md\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_GLOB_USE_GITIGNORE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Markdown settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_MARKDOWN_EXTENSIONS\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tables,strikethrough\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Feed defaults\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_FEED_DEFAULTS_ITEMS_PER_PAGE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e20\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_FEEDS_DEFAULTS_ORPHAN_THRESHOLD\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_FEED_DEFAULTS_FORMATS_HTML\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_FEED_DEFAULTS_FORMATS_RSS\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_FEED_DEFAULTS_SYNDICATION_MAX_ITEMS\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e50\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_FEED_DEFAULTS_SYNDICATION_INCLUDE_CONTENT\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Blogroll settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_BLOGROLL_ENABLED\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"value-formats\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eValue Formats\u003c/span\u003e \u003ca href=\"#value-formats\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eFormat\u003c/th\u003e\n\u003cth\u003eExamples\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eString\u003c/td\u003e\n\u003ctd\u003ePlain text\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_TITLE=\u0026quot;My Site\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eInteger\u003c/td\u003e\n\u003ctd\u003eNumeric\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_CONCURRENCY=4\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBoolean\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e/\u003ccode\u003efalse\u003c/code\u003e/\u003ccode\u003e1\u003c/code\u003e/\u003ccode\u003e0\u003c/code\u003e/\u003ccode\u003eyes\u003c/code\u003e/\u003ccode\u003eno\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_GLOB_USE_GITIGNORE=true\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eList\u003c/td\u003e\n\u003ctd\u003eComma-separated\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_HOOKS=\u0026quot;glob,load,render\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"build-with-environment-overrides\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild with Environment Overrides\u003c/span\u003e \u003ca href=\"#build-with-environment-overrides\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Override output directory for a single build\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_OUTPUT_DIR\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003edist markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build for staging environment\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://staging.example.com markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Increase concurrency\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_CONCURRENCY\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"multiple-config-files-config-merging\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMultiple Config Files (Config Merging)\u003c/span\u003e \u003ca href=\"#multiple-config-files-config-merging\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou can merge multiple configuration files together using the \u003ccode\u003e--merge-config\u003c/code\u003e (or \u003ccode\u003e-m\u003c/code\u003e) flag. This is useful for:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eEnvironment-specific overrides\u003c/strong\u003e (e.g., \u003ccode\u003emarkata-go.local.toml\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFast build configurations\u003c/strong\u003e (e.g., \u003ccode\u003efast-markata-go.toml\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTemporary overrides\u003c/strong\u003e without modifying your main config\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"how-config-merging-works\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow Config Merging Works\u003c/span\u003e \u003ca href=\"#how-config-merging-works\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigs are merged in order, with later configs taking precedence:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eDefaults\u003c/strong\u003e - Built-in default values\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBase config\u003c/strong\u003e - Your main config file (\u003ccode\u003emarkata-go.toml\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMerge configs\u003c/strong\u003e - Each \u003ccode\u003e--merge-config\u003c/code\u003e file, in order\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eEnvironment variables\u003c/strong\u003e - \u003ccode\u003eMARKATA_GO_*\u003c/code\u003e vars (highest precedence)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"example-fast-build-config\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample: Fast Build Config\u003c/span\u003e \u003ca href=\"#example-fast-build-config\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate a \u003ccode\u003efast-markata-go.toml\u003c/code\u003e for quick development builds:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Only process specific files for fast builds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eglob_patterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;posts/draft-*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Disable blogroll for faster builds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse it with:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Merge fast config with base config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --merge-config fast-markata-go.toml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Or use the short flag\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build -m fast-markata-go.toml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"example-multiple-merge-configs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample: Multiple Merge Configs\u003c/span\u003e \u003ca href=\"#example-multiple-merge-configs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eYou can specify multiple merge configs. They are applied in order:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Base config + local overrides + debug settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build -m markata-go.local.toml -m debug.toml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"example-no-base-config\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample: No Base Config\u003c/span\u003e \u003ca href=\"#example-no-base-config\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eYou can use merge configs without a base config (uses defaults as base):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Just use defaults + your override file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build -c \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e -m fast-markata-go.toml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"common-merge-config-patterns\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Merge Config Patterns\u003c/span\u003e \u003ca href=\"#common-merge-config-patterns\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eLocal Development\u003c/strong\u003e (\u003ccode\u003emarkata-go.local.toml\u003c/code\u003e - add to \u003ccode\u003e.gitignore\u003c/code\u003e):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;http://localhost:8080\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econcurrency\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eFast Build\u003c/strong\u003e (\u003ccode\u003efast.toml\u003c/code\u003e):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Limit to specific files\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eglob_patterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;posts/current/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eNote on Boolean Fields\u003c/strong\u003e: Merging \u003ccode\u003eenabled = false\u003c/code\u003e into a base config with \u003ccode\u003eenabled = true\u003c/code\u003e requires environment variables. Use \u003ccode\u003eMARKATA_GO_BLOGROLL_ENABLED=false\u003c/code\u003e instead.\u003c/p\u003e\n\u003ch2 id=\"configuration-cli-commands\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration CLI Commands\u003c/span\u003e \u003ca href=\"#configuration-cli-commands\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"config-show\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003econfig show\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#config-show\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDisplay the resolved configuration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Same as `markata-go config show`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Show as YAML (default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config show\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Show as JSON\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config show --json\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Show as TOML\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config show --toml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Include merged override files\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config show -m fast-markata-go.toml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003econfig show\u003c/code\u003e uses the same config resolution path as \u003ccode\u003ebuild\u003c/code\u003e and \u003ccode\u003eserve\u003c/code\u003e, including any \u003ccode\u003e--merge-config\u003c/code\u003e overrides.\u003c/p\u003e\n\u003cp\u003eYAML output includes source comments by default. Comments identify whether an\neffective value came from a config file (with its path and line), an environment\nvariable, a CLI override, or a default. Use \u003ccode\u003e--no-annotate\u003c/code\u003e for plain YAML;\nJSON and TOML output remain unannotated and parseable. In an interactive\nterminal, YAML is syntax highlighted using the configured palette.\u003c/p\u003e\n\u003cp\u003eDefault and file-backed comments include a copyable \u003ccode\u003emarkata-go config set \u0026lt;key\u0026gt; \u0026lt;value\u0026gt;\u003c/code\u003e command so you can override a setting without locating its\nconfiguration file manually.\u003c/p\u003e\n\u003cp\u003eConflicting format requests such as \u003ccode\u003emarkata-go config show --json --toml\u003c/code\u003e fail with usage exit code \u003ccode\u003e2\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"config-get\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003econfig get\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#config-get\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGet a specific configuration value:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Get top-level value\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config get output_dir\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Get nested value with dot notation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config get glob.patterns\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config get feed_defaults.items_per_page\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config get feed_defaults.formats.html\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"config-set\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003econfig set\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#config-set\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUpdate a specific configuration value in-place:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Set top-level value\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config \u003cspan class=\"nb\"\u003eset\u003c/span\u003e url \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Set nested value\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config \u003cspan class=\"nb\"\u003eset\u003c/span\u003e glob.patterns \u003cspan class=\"s1\"\u003e\u0026#39;[\u0026#34;posts/**/*.md\u0026#34;, \u0026#34;pages/**/*.md\u0026#34;]\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003econfig set\u003c/code\u003e preserves file permissions for TOML, YAML, and JSON files. In CGO-enabled builds, TOML/YAML edits use tree-sitter byte ranges so existing comments, ordering, and formatting stay intact.\u003c/p\u003e\n\u003ch3 id=\"config-validate\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003econfig validate\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#config-validate\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eValidate the configuration file:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Validate default config file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config validate\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Validate specific config file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config validate -c custom.toml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Validate with merged overrides\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config validate -m fast-markata-go.toml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003econfig validate\u003c/code\u003e uses the same merged configuration resolution as \u003ccode\u003ebuild\u003c/code\u003e and \u003ccode\u003eserve\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eExample output:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e✓ Configuration is valid\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eOr with errors:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e✗ Configuration errors:\n  - url: URL must include a scheme (e.g., https://)\n  - concurrency: must be \u0026gt;= 0 (0 means auto-detect)\n  - glob.patterns: no glob patterns specified, no files will be processed (warning)\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"config-init\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003econfig init\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#config-init\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGenerate a starter configuration file:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create markata-go.toml with defaults\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config init\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create YAML config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config init site.yaml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Overwrite existing file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config init --force\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"configuration-merging\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration Merging\u003c/span\u003e \u003ca href=\"#configuration-merging\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go merges configuration from multiple sources in order of increasing precedence:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e┌─────────────────────────────────────────────────────────────────────┐\n│                    CONFIGURATION RESOLUTION                          │\n├─────────────────────────────────────────────────────────────────────┤\n│  1. Built-in defaults                                                │\n│  2. User config file (~/.config/markata-go/config.toml)             │\n│  3. Local config file (./markata-go.toml)                           │\n│  4. Environment variables (MARKATA_GO_*)                            │\n│  5. CLI arguments (--output-dir, --config, etc.)                    │\n│                                                                      │\n│  Later sources OVERRIDE earlier sources                              │\n│  Nested objects are DEEP MERGED                                     │\n│  Arrays REPLACE (not append)                                        │\n└─────────────────────────────────────────────────────────────────────┘\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"merge-behavior-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMerge Behavior\u003c/span\u003e \u003ca href=\"#merge-behavior-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eScalar values:\u003c/strong\u003e Later wins\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# User config: output_dir = \u0026#34;dist\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Local config: output_dir = \u0026#34;public\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Result: output_dir = \u0026#34;public\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eObjects:\u003c/strong\u003e Deep merge\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# User config:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Local config:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Result:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# html = true   (from user)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# rss = true    (from user)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# atom = true   (from local)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eArrays:\u003c/strong\u003e Replace (not append)\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# User config: patterns = [\u0026#34;**/*.md\u0026#34;]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Local config: patterns = [\u0026#34;posts/*.md\u0026#34;, \u0026#34;pages/*.md\u0026#34;]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Result: patterns = [\u0026#34;posts/*.md\u0026#34;, \u0026#34;pages/*.md\u0026#34;]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"default-values\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDefault Values\u003c/span\u003e \u003ca href=\"#default-values\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen no configuration is provided, markata-go uses these defaults:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;output\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplates_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;templates\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eassets_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;static\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehooks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econcurrency\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Auto-detect based on CPU cores\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pages/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;posts/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003euse_gitignore\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eorphan_threshold\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"authors-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuthors Configuration\u003c/span\u003e \u003ca href=\"#authors-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe authors system lets you define author profiles in your configuration and reference them from post frontmatter. This enables multi-author support where each post can have one or more authors with rich metadata.\u003c/p\u003e\n\u003ch3 id=\"basic-setup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Setup\u003c/span\u003e \u003ca href=\"#basic-setup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egenerate_pages\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Generate individual author profile pages\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efeeds_enabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e     \u003cspan class=\"c\"\u003e# Generate per-author feeds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ejane\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Jane Doe\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erole\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;author\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://janedoe.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eactive\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e            \u003cspan class=\"c\"\u003e# Assigned to posts with no explicit author\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Bob Smith\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erole\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;editor\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eactive\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"author-fields\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuthor Fields\u003c/span\u003e \u003ca href=\"#author-fields\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEach author entry supports these fields:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003erequired\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eDisplay name\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebio\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003eShort biography\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eemail\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003eContact email (must contain \u003ccode\u003e@\u003c/code\u003e if set)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eavatar\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003eAvatar image URL or path\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eurl\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003ePersonal website URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erole\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003eRole label (e.g., \u0026ldquo;author\u0026rdquo;, \u0026ldquo;editor\u0026rdquo;)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eguest\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWhether this is a guest author\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eactive\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWhether the author is currently active\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edefault\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault author for posts without explicit authors\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econtribution\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003eFree-text contribution description\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econtributions\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCReDiT taxonomy roles\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"referencing-authors-in-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReferencing Authors in Posts\u003c/span\u003e \u003ca href=\"#referencing-authors-in-posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse author IDs in post frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Our Collaborative Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ejane\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ebob\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe legacy single-author field is also supported:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Solo Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Jane Doe\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePriority:\u003c/strong\u003e \u003ccode\u003eauthors\u003c/code\u003e array takes precedence over \u003ccode\u003eauthor\u003c/code\u003e string. If neither is specified, the default author (the one with \u003ccode\u003edefault = true\u003c/code\u003e) is assigned automatically.\u003c/p\u003e\n\u003ch3 id=\"author-configuration-options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuthor Configuration Options\u003c/span\u003e \u003ca href=\"#author-configuration-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egenerate_pages\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate individual author profile pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eurl_pattern\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eURL pattern for author pages (e.g., \u003ccode\u003e/authors/{id}/\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeeds_enabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate per-author feeds\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"full-author-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFull Author Example\u003c/span\u003e \u003ca href=\"#full-author-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egenerate_pages\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efeeds_enabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewaylon\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Waylon Walker\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebio\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Python and Go developer, blogger\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eemail\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;waylon@example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eavatar\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/images/waylon.jpg\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://waylonwalker.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erole\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;author\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eactive\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtributions\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Writing\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Original Draft\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eguest\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Guest Writer\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erole\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;editor\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eguest\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eactive\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtribution\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Technical review\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eRelated:\u003c/strong\u003e See the \u003ca href=\"frontmatter.md\"\u003eFrontmatter Guide\u003c/a\u003e for details on the \u003ccode\u003eauthors\u003c/code\u003e and \u003ccode\u003eauthor\u003c/code\u003e fields.\u003c/p\u003e\n\u003ch2 id=\"encryption-settings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEncryption Settings\u003c/span\u003e \u003ca href=\"#encryption-settings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEncryption protects private post content with AES-256-GCM client-side encryption. It is \u003cstrong\u003eenabled by default\u003c/strong\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eencryption\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                             \u003cspan class=\"c\"\u003e# default: true\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault_key\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e                    \u003cspan class=\"c\"\u003e# default: \u0026#34;default\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edecryption_hint\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;DM me for access\u0026#34;\u003c/span\u003e       \u003cspan class=\"c\"\u003e# optional hint shown to visitors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eencryption\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprivate_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ediary\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;personal\u0026#34;\u003c/span\u003e                         \u003cspan class=\"c\"\u003e# tag \u0026#34;diary\u0026#34; auto-encrypts with key \u0026#34;personal\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edraft-ideas\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e                    \u003cspan class=\"c\"\u003e# tag \u0026#34;draft-ideas\u0026#34; encrypts with default key\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable/disable encryption processing\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edefault_key\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;default\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eKey name when post doesn\u0026rsquo;t specify one\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edecryption_hint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHelp text shown next to password prompt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eprivate_tags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003emap\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMaps tag names to encryption key names\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenforce_strength\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRequire key passwords to meet the strength policy\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emin_estimated_crack_time\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;10y\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMinimum estimated crack time per key (supports \u003ccode\u003ey\u003c/code\u003e, \u003ccode\u003ed\u003c/code\u003e, \u003ccode\u003eh\u003c/code\u003e, \u003ccode\u003em\u003c/code\u003e, \u003ccode\u003es\u003c/code\u003e units)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emin_password_length\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e14\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMinimum password length enforced for every encryption key\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eEncryption keys are loaded from environment variables:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_KEY_DEFAULT\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003emy-password\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_KEY_PERSONAL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003eanother-password\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou can also override the enforcement policy:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_ENFORCE_STRENGTH\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_MIN_ESTIMATED_CRACK_TIME\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e5d\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_MIN_PASSWORD_LENGTH\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e20\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eRelated:\u003c/strong\u003e See the \u003ca href=\"encryption.md\"\u003eEncryption Guide\u003c/a\u003e for complete documentation on making posts private.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"complete-configuration-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComplete Configuration Example\u003c/span\u003e \u003ca href=\"#complete-configuration-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere\u0026rsquo;s a comprehensive example showing all available options:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Site metadata\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Awesome Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;A blog about technology and life\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauthor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Jane Doe\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elanguage\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;en\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauthor_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/about/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emanaging_editor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;editor@example.com (Jane Doe)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewebmaster\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;webmaster@example.com (Jane Doe)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecopyright\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Copyright 2026 Jane Doe\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Directory configuration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplates_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;templates\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eassets_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;static\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Plugin configuration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehooks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edisabled_hooks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Performance\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econcurrency\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Auto-detect\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Content discovery\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;posts/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;pages/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;docs/**/*.md\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003euse_gitignore\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Markdown processing\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eextensions\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tables\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;strikethrough\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;autolinks\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tasklist\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Feed defaults (inherited by all feeds)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eorphan_threshold\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;feed.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;rss.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;atom.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;feed.json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecard\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;partials/card.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esyndication\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_items\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_content\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Home page feed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Latest Posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Blog archive\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;All blog posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Featured posts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;featured\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Featured Posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Hand-picked featured content\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and featured == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Authors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egenerate_pages\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efeeds_enabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ejane\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Jane Doe\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erole\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;author\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://janedoe.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eactive\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# CSS minification\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecss_minify\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epreserve_comments\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Copyright\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# JS minification\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ejs_minify\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"common-configuration-patterns\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Configuration Patterns\u003c/span\u003e \u003ca href=\"#common-configuration-patterns\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"minimal-blog\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMinimal Blog\u003c/span\u003e \u003ca href=\"#minimal-blog\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://myblog.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;posts/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"documentation-site\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocumentation Site\u003c/span\u003e \u003ca href=\"#documentation-site\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Project Docs\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://docs.example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;docs/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eextensions\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tables\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tasklist\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Documentation\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"multi-section-site\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMulti-Section Site\u003c/span\u003e \u003ca href=\"#multi-section-site\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;content/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Blog section\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;blog\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Tutorials section\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;tutorial\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Projects section\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;projects\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Projects\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;project\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"ci-cd-deployment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCI/CD Deployment\u003c/span\u003e \u003ca href=\"#ci-cd-deployment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# URL set via environment variable in CI\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dist\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;content/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen in CI:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"css-and-js-minification\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCSS and JS Minification\u003c/span\u003e \u003ca href=\"#css-and-js-minification\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go automatically minifies CSS and JS files in the output directory to reduce file sizes.\u003c/p\u003e\n\u003ch3 id=\"css-minification\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCSS Minification\u003c/span\u003e \u003ca href=\"#css-minification\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecss_minify\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                      \u003cspan class=\"c\"\u003e# Enable CSS minification (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;variables.css\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e         \u003cspan class=\"c\"\u003e# Files to skip\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epreserve_comments\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Copyright\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e   \u003cspan class=\"c\"\u003e# Comment substrings to preserve\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable/disable CSS minification\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexclude\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFile names or glob patterns to skip (e.g., \u003ccode\u003e\u0026quot;vendor-*.css\u0026quot;\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epreserve_comments\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSubstrings that identify comments to keep\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"js-minification\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJS Minification\u003c/span\u003e \u003ca href=\"#js-minification\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ejs_minify\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                      \u003cspan class=\"c\"\u003e# Enable JS minification (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pagefind-ui.js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Files to skip\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable/disable JS minification\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexclude\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFile names or glob patterns to skip (e.g., \u003ccode\u003e\u0026quot;vendor-*.js\u0026quot;\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eFiles with \u003ccode\u003e.min.js\u003c/code\u003e extension are automatically skipped (already minified).\u003c/p\u003e\n\u003cp\u003eBoth plugins run at the very end of the Write stage (\u003ccode\u003ePriorityLast\u003c/code\u003e), after all CSS/JS-generating plugins have finished.\u003c/p\u003e\n\u003cp\u003eBoth plugins memoize exact current-input minification results in the private\n\u003ccode\u003e\u0026lt;content_dir\u0026gt;/.markata/asset-minify/v1/\u003c/code\u003e cache. A nonempty top-level\n\u003ccode\u003e[markata-go] cache_dir\u003c/code\u003e override is used as supplied, independently of whether\nthe build cache is enabled. Keep the cache outside published output; unsafe\nlocations warn and disable reuse. CSS \u003ccode\u003epreserve_comments\u003c/code\u003e changes invalidate\nthe transform recipe; changed recipes always minify current stage-input bytes.\nComments already removed require regeneration from authoritative source, not\nrecovery from a historical cache snapshot.\nReuse requires the exact transform input and matching recipe, never a prior\noutput or retry digest. Hits still publish atomically with normal \u003ccode\u003e0644\u003c/code\u003e\npermissions (except empty JavaScript); repeated retained CSS output may need\nfresh transformations because comment handling can be non-idempotent.\nFast mode, exclusions, disabled plugins, and \u003ccode\u003e_pagefind\u003c/code\u003e remain skipped.\nSee \u003ca href=\"performance.md#persistent-css-and-javascript-minification\"\u003ePersistent CSS and JavaScript Minification\u003c/a\u003e\nfor recovery, upgrade, privacy, and measurement guidance.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"validation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eValidation\u003c/span\u003e \u003ca href=\"#validation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go validates configuration on load and can report both errors and warnings:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eErrors\u003c/strong\u003e (prevent build):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eInvalid URL format (missing scheme or host)\u003c/li\u003e\n\u003cli\u003eNegative \u003ccode\u003eitems_per_page\u003c/code\u003e or \u003ccode\u003eorphan_threshold\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eNegative \u003ccode\u003econcurrency\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eWarnings\u003c/strong\u003e (build continues):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEmpty glob patterns (no files will be processed)\u003c/li\u003e\n\u003cli\u003eFeed with no output formats enabled\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eRun validation explicitly:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config validate\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/getting-started/\"\u003eGetting Started\u003c/a\u003e - Quick start guide\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/themes/\"\u003eThemes Guide\u003c/a\u003e - Theme and palette customization\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/feeds/\"\u003eFeeds Guide\u003c/a\u003e - Detailed feed configuration\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/blogroll/\"\u003eBlogroll Guide\u003c/a\u003e - RSS reader and blogroll setup\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/templates/\"\u003eTemplates Guide\u003c/a\u003e - Template configuration and usage\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/sidebars/\"\u003eSidebars Guide\u003c/a\u003e - Sidebar navigation setup\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/frontmatter/\"\u003eFrontmatter Guide\u003c/a\u003e - Post metadata reference\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/reference/cli/\"\u003eCLI Reference\u003c/a\u003e - Command-line interface reference\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/reference/plugins/\"\u003ePlugin Reference\u003c/a\u003e - Plugin configuration and development\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"video-loading-preferences\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVideo loading preferences\u003c/span\u003e \u003ca href=\"#video-loading-preferences\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emd_video\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eautoplay\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epreload\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;none\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtrols\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThese defaults show native controls without automatic video downloads. Setting\n\u003ccode\u003eautoplay = true\u003c/code\u003e preserves author intent in generated markup. Full Quality or\nalready measured fast Auto at page entry can start unrequested authored videos; Save Data and\nconstrained Auto suppress expensive automatic playback. Raw HTML follows its\nown autoplay attribute rather than the Markdown setting. See\n\u003ca href=\"../adaptive-loading/\"\u003eAdaptive loading\u003c/a\u003e for user modes and no-JS behavior, and\n\u003ca href=\"../plugins/#md_video\"\u003emd_video\u003c/a\u003e for the full plugin configuration.\u003c/p\u003e\n",
      "content_text": "\n## Configuration\n\nmarkata-go uses a flexible configuration system that supports multiple file formats, environment variable overrides, and intelligent merging from multiple sources.\n\n## Chart data disclosures\n\n`[markata-go.chartjs] data_display = \"open\"` keeps chart data expanded before\nJavaScript initializes (the default). Set it to `\"collapsed\"` for a compact\ninitial view. Per-chart top-level JSON `data_display` overrides this default.\nThe summary stays usable without JavaScript. See\n[chart figures and fallbacks](markdown-chart-fallback.md) for titles, captions,\nand examples.\n\n## Compose Config Files\n\nUse `include` when one config file gets too large.\n\n```toml\n[markata-go]\ntitle = \"Example Site\"\ninclude = [\n  \"config/common/*.toml\",\n  \"config/feeds/*.toml\",\n  \"config/rss.toml\",\n]\n```\n\nRules:\n\n- paths are resolved relative to the file that declared the include\n- explicit files are loaded as written\n- glob matches are loaded in lexicographic order\n- repeated includes are loaded once\n- cycles fail with a clear error\n\n## Edit Settings While Serving\n\nWhile `markata-go serve` is running, every page has a small gear button in the bottom-left corner (or press `Alt+,`). It opens a **Site settings** sidebar listing every config option with its current value and description. Change a setting and the site rebuilds and reloads with it right away. The change is only a preview until you click **Bake** to write it into your config, or **Reset** to throw it away. `markata-go build` never includes the sidebar, so published sites don't have it. The sidebar and Bake only accept changes from the machine running `serve`; if you bind to `--host 0.0.0.0` to test on a phone, the phone can browse but cannot edit settings.\n\n1. Run `markata-go serve` and open the site.\n2. Click the gear. The **Common** section at the top has the settings most sites change (title, URL, palettes, style, font, nav, footer). Search to find anything else, for example `items_per_page`.\n3. Change a value. Text fields apply when you press Enter or leave the field; dropdowns, checkboxes, and numbers apply right away. The status line shows **Rebuilding… 3s** until the build finishes, then the page reloads with the change and the sidebar stays open where you left it. If the build fails, the error is shown instead.\n4. Keep going. Changed rows are highlighted, and **Revert** undoes one field. **Reset to default** removes a setting from your config so it falls back to the default shown on the row. While the sidebar is closed, a small **Previewing N unsaved changes · Reset · Review** bar next to the gear reminds you the site is showing unsaved changes.\n5. Click **Bake** to keep them. The sidebar shows the exact diff for every file it will edit (secret values are hidden). Click **Write** to save, or **Cancel**. The server writes the files, rebuilds, and live-reloads.\n6. Or click **Reset** to drop every unsaved change and go back to what your config files say.\n\nPreviews live in the serve process's memory only. Your files don't change until you bake. If you restart `markata-go serve`, the sidebar re-applies the edits you had staged in that browser tab. While a preview is active, builds use a separate cache in `.markata/serve-preview/`, so previewing never throws away your site's warm build cache.\n\nIf you changed the theme with the theme picker, the picker's choice is saved in your browser and would hide a palette, style, font, text size, or color mode preview. Previewing one of those settings clears the matching picker choice, and the status line tells you it did.\n\nWhen you run `markata-go serve \u003cfile\u003e` for a single page, sections for site-wide output such as feeds, tags, and the blogroll are hidden. Search or click **Show hidden sections** to see them.\n\nSettings with a fixed set of values, such as `glob.slug_mode`, `theme.palette`, `theme.fontpack`, `nav.position`, or `markdown.highlight.theme`, are dropdowns. Numbers with a range, such as `theme.background.color_mix` (0-1), are limited to that range. A value that isn't allowed gets a red message under the field and is not previewed, so a typo can't break the site; the status line lists every change that is not being previewed. Leave a field empty to use the default.\n\nEach row shows where a setting lives: **set in config/theme.toml** means that file defines it now, and **writes to ...** names the file a change will go to. The sidebar edits the file that owns the setting:\n\n- A key that is already set is edited where it is set (the file that wins, when several set it).\n- A new key goes to the file that already holds its group. For example, a new `feed_defaults.items_per_page` lands in the file that has `[markata-go.feed_defaults]`.\n- Otherwise it goes to your root config, or a new `markata-go.toml` when you have none.\n- A file passed with `--merge-config` is marked **override**, so you know the change won't be in your base config.\n- If your site has no config of its own and serve fell back to your global `~/.config/markata-go/config.toml`, the rows are marked **global** and Bake is refused, so a preview never changes the defaults for all your sites. Create a `markata-go.toml` in the site to bake.\n\nThis works with `include = [...]` files, config directories, and `--merge-config` files, in TOML, YAML, or JSON. Comments, key order, and other settings are kept.\n\nSome settings are shown but not editable in the sidebar; edit them in the file:\n\n- Lists of tables and maps, such as `nav`, `feeds`, and `head.meta`, show a summary like \"3 items\".\n- Secrets such as tokens and passwords are never sent to the browser.\n- A few fields that the config loader does not read are marked **Not read from config files**.\n\nChanges are checked before they stick. If a preview or bake makes the config invalid or does not load back as written, it is rejected (and a bake restores every file) and the sidebar shows the error. When a `MARKATA_GO_*` environment variable overrides a setting, the row says so, because the variable wins over both previews and files until it is unset.\n\nOn phones the sidebar opens full screen. `Alt+,` does nothing while you are typing in a field on the page.\n\nThe theme picker's **All settings** button opens this sidebar at the Theme section. Its **Bake** button writes only the look you picked, through the same checks and file selection as the sidebar (see [Themes Guide](/docs/guides/themes/#baking-a-look-into-your-config)).\n\n## Content Index\n\nEnable the optional metadata artifact with a plugin table:\n\n```toml\n[markata-go.content_index]\nenabled = true\noutput = \"content-index.json\"\n```\n\nThe output path is relative to `output_dir` unless it is absolute. The index\ncontains resolved public document metadata and feed membership, but never\ncomplete article bodies. See the [Content Index guide](/docs/guides/content-index/)\nfor the versioned format and consumer rules. Environment overrides are also\navailable for isolated builds: `MARKATA_GO_CONTENT_INDEX_ENABLED=true` and\n`MARKATA_GO_CONTENT_INDEX_OUTPUT=/tmp/content-index.json`.\n\nPrecedence:\n\n1. built-in defaults\n2. the root config file\n3. included files in declaration order\n4. glob matches in lexicographic order\n5. environment variables\n\nLater values win.\n\n### Merge Behavior\n\n- scalar values replace earlier values\n- explicit `false` and `0` are preserved\n- tables merge deeply\n- arrays of scalars replace earlier arrays\n- `[[markata-go.feeds]]` merges by `slug`\n\nThat last rule makes feed-heavy sites much easier to manage.\n\n## Image Library\n\nThe image library plugin is enabled by default. It writes a searchable page to\n`images/index.html` and versioned JSON inventories to `images/index.json` and\n`images.json`, relative to `output_dir`.\n\n```toml\n[markata-go.images]\nenabled = true\npath = \"images\"\ntemplate = \"images.html\"\nexport_json = true\ninclude_unreferenced = false\n```\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `true` | Generate the image page and inventory |\n| `path` | string | `\"images\"` | Relative output directory below `output_dir` |\n| `template` | string | `\"images.html\"` | HTML template name |\n| `export_json` | bool | `true` | Write `path/index.json` and `images.json` |\n| `include_unreferenced` | bool | `false` | Include image and video files found below `assets_dir` without public post usage; enable explicitly when a local authoring inventory should enumerate all supported assets |\n\nThe path must remain inside `output_dir`. Environment variables use the\n`MARKATA_GO_IMAGES_` prefix. See the [Image Library guide](/docs/guides/image-library/)\nfor discovery rules and template context.\n\n## Correcting Configuration Mistakes\n\nRun `markata-go config validate` after editing a config file. If a key closely\nresembles a built-in setting, markata-go reports the file and a possible\nspelling. For example, `output_dr` suggests `output_dir`, and\n`theme.palete` suggests `theme.palette`. Correct the key in the file and rerun\nthe command; markata-go never changes the file for you. Custom plugin sections\nremain supported.\n\n`markata-go config get \u003ckey\u003e` also suggests close key names. If the key is\nvalid but absent from the file, use `markata-go config show` to see its resolved\nvalue, including defaults. For a theme choice with a fixed list of values,\nvalidation shows allowed values and, when close enough, a possible correction.\n\n## Configuration File Locations\n\nmarkata-go searches for configuration files in the following order (first found wins):\n\n| Priority | Location | Description |\n|----------|----------|-------------|\n| 1 | `--config path/to/config.toml` | CLI-specified path |\n| 2 | `./markata-go.toml` | Current directory (TOML) |\n| 3 | `./markata-go.yaml` | Current directory (YAML) |\n| 4 | `./markata-go.yml` | Current directory (YAML alternate) |\n| 5 | `./markata-go.json` | Current directory (JSON) |\n| 6 | `~/.config/markata-go/config.toml` | User config directory |\n\nIf no configuration file is found, markata-go uses default values with any environment variable overrides applied.\n\n### Start With One Markdown File\n\nA configuration file is optional for a small site. The default content\npatterns include root Markdown plus the `pages/` and `posts/` directories, so\nthis minimal layout works:\n\n```text\npages/\n  sample.md\n```\n\n`markata-go build` and `markata-go serve` render `sample.md`, a homepage that\nlinks to it, and an `/archive/` page. The homepage also keeps the default RSS\nand Atom endpoints at `/rss.xml` and `/atom.xml`. Posts must be published to\nappear in these collections: use `published: true` in frontmatter. An empty\nsite still renders `/` with that reminder.\n\nTo render only one Markdown file with the bundled default theme, without\ngenerating a homepage, archive, or feeds, pass the file directly:\n\n```bash\nmarkata-go pages/sample.md\n# equivalent:\nmarkata-go build pages/sample.md\n```\n\n## Select A Site From Another Directory\n\nUse `--site-dir` when the site is not your current directory. This is useful\nfor aliases, scripts, and agents that manage more than one site.\n\n```bash\nmarkata-go --site-dir ~/sites/blog config show\nMARKATA_GO_SITE_DIR=~/notes/work markata-go list posts\n```\n\n`--site-dir` overrides `MARKATA_GO_SITE_DIR`; otherwise markata-go uses the\ncurrent directory. The selected site becomes the base for configuration\ndiscovery, relative config flags, templates, content files, and caches.\n\n## Supported Formats\n\n| Extension | Format | Notes |\n|-----------|--------|-------|\n| `.toml` | TOML | **Recommended** - Best for nested config, readable |\n| `.yaml`, `.yml` | YAML | Good for complex structures |\n| `.json` | JSON | Strict, good for programmatic generation |\n\n### TOML Example (Recommended)\n\n```toml\n[markata-go]\ntitle = \"My Site\"\ndescription = \"A site built with markata-go\"\nurl = \"https://example.com\"\noutput_dir = \"public\"\n\n[markata-go.glob]\npatterns = [\"posts/**/*.md\", \"pages/*.md\"]\nuse_gitignore = true\n\n[markata-go.markdown]\nextensions = [\"tables\", \"strikethrough\", \"tasklist\"]\n```\n\n### YAML Example\n\n```yaml\nmarkata-go:\n  title: My Site\n  description: A site built with markata-go\n  url: https://example.com\n  output_dir: public\n\n  glob:\n    patterns:\n      - \"posts/**/*.md\"\n      - \"pages/*.md\"\n    use_gitignore: true\n\n  markdown:\n    extensions:\n      - tables\n      - strikethrough\n      - tasklist\n```\n\n### JSON Example\n\n```json\n{\n  \"markata-go\": {\n    \"title\": \"My Site\",\n    \"description\": \"A site built with markata-go\",\n    \"url\": \"https://example.com\",\n    \"output_dir\": \"public\",\n    \"glob\": {\n      \"patterns\": [\"posts/**/*.md\", \"pages/*.md\"],\n      \"use_gitignore\": true\n    },\n    \"markdown\": {\n      \"extensions\": [\"tables\", \"strikethrough\", \"tasklist\"]\n    }\n  }\n}\n```\n\n## Configuration Namespacing\n\nAll configuration lives under the `[markata-go]` namespace. This:\n\n- Avoids conflicts with other tools in shared config files\n- Provides clear ownership for each plugin section\n- Enables tooling-friendly editor completions\n\n```toml\n# Root namespace - site-wide settings\n[markata-go]\ntitle = \"My Site\"\noutput_dir = \"public\"\n\n# Plugin namespaces\n[markata-go.glob]\npatterns = [\"pages/**/*.md\", \"posts/**/*.md\"]\n\n[markata-go.markdown]\nextensions = [\"tables\"]\n\n[markata-go.feeds]\n# Feed-specific config\n```\n\n## Configuration Options Reference\n\n### Core Settings (`[markata-go]`)\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `output_dir` | string | `\"output\"` | Build output directory |\n| `url` | string | `\"\"` | Site base URL (for absolute links) |\n| `title` | string | `\"\"` | Site title |\n| `description` | string | `\"\"` | Site description |\n| `author` | string | `\"\"` | Default author |\n| `license` | string `\\|` bool | (unset) | Select a license key (see below). Set to `false` to skip the attribution and warning. |\n| `assets_dir` | string | `\"static\"` | Static assets directory |\n| `templates_dir` | string | `\"templates\"` | Templates directory |\n| `hooks` | string[] | `[\"default\"]` | Plugins to load |\n| `disabled_hooks` | string[] | `[]` | Plugins to exclude |\n| `concurrency` | int | `0` | Worker threads (0 = auto based on CPU cores) |\n\n```toml\n[markata-go]\noutput_dir = \"public\"\nurl = \"https://example.com\"\ntitle = \"My Site\"\ndescription = \"A site built with markata-go\"\nauthor = \"Jane Doe\"\nassets_dir = \"static\"\ntemplates_dir = \"templates\"\nhooks = [\"default\"]\ndisabled_hooks = [\"sitemap\"]\nconcurrency = 4\n```\n\n### Python Docs (`[markata-go.python_docs]`)\n\nGenerate API reference pages from Python source files.\n\nThis plugin is strict opt-in: add `python_docs` to `[markata-go].hooks` and set `enabled = true`.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `false` | Enable source-backed Python docs generation |\n| `patterns` | string[] | `[\"**/*.py\"]` | Python file glob patterns |\n| `directories` | string[] | `[]` | Directory roots expanded to `dir/**/*.py` |\n| `exclude` | string[] | venv/cache defaults | Globs to skip |\n| `slug_prefix` | string | `\"api\"` | Prefix for generated module pages |\n| `template` | string | `\"\"` | Template used for generated docs posts |\n| `published` | bool | `false` | Include generated docs in feeds/search/sitemap |\n| `include_private` | bool | `false` | Include private `_symbols` |\n| `include_source` | bool | `true` | Include implementation snippets |\n| `include_module_code` | bool | `false` | Include module-level implementation source |\n| `tags` | string[] | `[\"python\", \"docs\"]` | Tags added to generated docs posts |\n| `interpreter` | string | auto-detect | Python executable used for AST extraction |\n\n```toml\n[markata-go]\nhooks = [\"default\", \"python_docs\"]\n\n[markata-go.python_docs]\nenabled = true\npatterns = [\"src/**/*.py\"]\nslug_prefix = \"api\"\ntemplate = \"docs\"\ninclude_source = true\n```\n\nSee [Python Source Docs](./python-docs.md) for the full workflow.\n\n### Embeds (`[embeds]`)\n\nControls internal and external embed behavior, including oEmbed resolution and Open Graph fallback.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `true` | Enable/disable embeds plugin |\n| `internal_card_class` | string | `\"embed-card\"` | CSS class for internal embed cards |\n| `external_card_class` | string | `\"embed-card embed-card-external\"` | CSS class for external embed cards |\n| `fetch_external` | bool | `true` | Fetch Open Graph metadata for external embeds |\n| `oembed_enabled` | bool | `true` | Enable oEmbed resolution |\n| `oembed_auto_discover` | bool | `false` | Discover oEmbed endpoints from HTML link tags |\n| `default_mode` | string | `\"card\"` | Default embed mode (`card`, `rich`, `performance`, `hover`, `image_only`) |\n| `oembed_providers_url` | string | `\"https://oembed.com/providers.json\"` | providers.json URL (empty disables) |\n| `resolution_strategy` | string | `\"oembed_first\"` | `oembed_first`, `og_first`, `oembed_only` |\n| `cache_dir` | string | `\".cache/embeds\"` | Cache directory for metadata |\n| `cache_ttl` | int | `604800` | Cache TTL (seconds) |\n| `timeout` | int | `10` | HTTP timeout (seconds) |\n| `fallback_title` | string | `\"External Link\"` | Title when metadata unavailable |\n| `show_image` | bool | `true` | Show images for external embeds |\n| `providers.\u003cname\u003e.mode` | string | (unset) | Provider mode override (`card`, `rich`, `performance`, `hover`, `image_only`) |\n\n```toml\n[embeds]\nenabled = true\ninternal_card_class = \"embed-card\"\nexternal_card_class = \"embed-card embed-card-external\"\nfetch_external = true\noembed_enabled = true\noembed_auto_discover = false\ndefault_mode = \"card\"\noembed_providers_url = \"https://oembed.com/providers.json\"\nresolution_strategy = \"oembed_first\"\ncache_dir = \".cache/embeds\"\ncache_ttl = 604800\ntimeout = 10\nfallback_title = \"External Link\"\nshow_image = true\n\n[embeds.providers]\nyoutube = { enabled = true, mode = \"rich\" }\nvimeo = { enabled = true }\ntiktok = { enabled = true }\nflickr = { enabled = true }\nspotify = { enabled = true }\nsoundcloud = { enabled = true }\ncodepen = { enabled = true }\ncodesandbox = { enabled = true }\njsfiddle = { enabled = true }\nobservable = { enabled = true }\ngithub = { enabled = true }\nslideshare = { enabled = true }\nprezi = { enabled = true }\nspeakerdeck = { enabled = true }\nissuu = { enabled = true }\ndatawrapper = { enabled = true }\nflourish = { enabled = true }\ninfogram = { enabled = true }\nreddit = { enabled = true }\ndailymotion = { enabled = true }\n```\n\n### External Link Hover (`[markata-go.external_link_hover]`)\n\nAdds hover preview cards to links that point to other sites. Disabled by\ndefault. See the [plugin reference](../reference/plugins.md#external_link_hover)\nfor data sources and output.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `false` | Enable/disable external link cards |\n| `fetch` | bool | `false` | Fetch metadata for URLs missing from the embeds cache (no network when `false`) |\n| `include_image` | bool | `true` | Include the page's preview image |\n| `favicon_service` | string | `\"\"` | Icon URL template with `{host}` / `{origin}`; empty disables icons |\n| `ignore_domains` | list | `[]` | Hosts (and subdomains) that never get cards |\n\n```toml\n[markata-go.external_link_hover]\nenabled = true\nfetch = true\nfavicon_service = \"https://icons.duckduckgo.com/ip3/{host}.ico\"\nignore_domains = [\"localhost\"]\n```\n\n### Vendor Assets (`[markata-go.assets]`)\n\nmarkata-go can self-host common third-party JS/CSS dependencies (HTMX, GLightbox, Mermaid, Chart.js, Cal-Heatmap, D3, Lite YouTube). When enabled, assets are downloaded into a cache directory and copied to `/assets/vendor` in the output. Templates use the `asset_urls` mapping injected by the CDN assets plugin.\n\n```toml\n[markata-go.assets]\nmode = \"self-hosted\"           # \"self-hosted\" (default), \"cdn\", or \"auto\"\ncache_dir = \".markata/assets-cache\"\noutput_dir = \"assets/vendor\"\nverify_integrity = true\n```\n\n### License configuration\n\nThe `license` key controls the attribution shown in the footer and whether the dev server reminds you to pick a license. It accepts either a string key (selects the attribution) or the literal `false` (hides the line and silences the warning). When the footer shows the copyright line, the license appears on the same line next to the copyright symbol; if copyright is disabled, the license renders as its own line.\n\nSupported license keys:\n\n- `all-rights-reserved` – All rights reserved.\n- `cc-by-4.0` (recommended) – Creative Commons Attribution 4.0 International (`https://creativecommons.org/licenses/by/4.0/`). The default when running `markata-go config init` or picking the recommended option in the init wizard.\n- `cc-by-sa-4.0` – Creative Commons Attribution-ShareAlike 4.0 International (`https://creativecommons.org/licenses/by-sa/4.0/`).\n- `cc-by-nc-4.0` – Creative Commons Attribution-NonCommercial 4.0 International (`https://creativecommons.org/licenses/by-nc/4.0/`).\n- `cc-by-nd-4.0` – Creative Commons Attribution-NoDerivatives 4.0 International (`https://creativecommons.org/licenses/by-nd/4.0/`).\n- `cc-by-nc-sa-4.0` – Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (`https://creativecommons.org/licenses/by-nc-sa/4.0/`).\n- `mit` – MIT License (`https://opensource.org/licenses/MIT`).\n\nWhen omitted, `license` defaults to `cc-by-4.0`. Set another supported string\nto override it, or set `license = false` to suppress footer attribution.\n\n### Navigation Links (`[[markata-go.nav]]`)\n\nNavigation links appear in the site header and define your site's main navigation.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `label` | string | Required | Display text for the link |\n| `url` | string | Required | Link destination (relative or absolute) |\n| `external` | bool | `false` | Opens link in new tab with noopener |\n\n```toml\n[[markata-go.nav]]\nlabel = \"Home\"\nurl = \"/\"\n\n[[markata-go.nav]]\nlabel = \"Blog\"\nurl = \"/blog/\"\n\n[[markata-go.nav]]\nlabel = \"Docs\"\nurl = \"/docs/\"\n\n[[markata-go.nav]]\nlabel = \"GitHub\"\nurl = \"https://github.com/WaylonWalker/markata-go\"\nexternal = true\n```\n\nThe default theme adds a small preview when a local header or footer navigation URL matches a generated feed or published post. For a feed such as `/blog/`, hovering the link or focusing it with a keyboard shows its description, public post count, total words, reading time, and publication rhythm when those values are available. For a post, the preview uses its description, tags, word count, and reading time. Enabled Reader and Blogroll links show the number of active followed sources; an enabled Random post link shows how many posts are in its draw. External and unmatched links stay as ordinary links. Previews remain open while the pointer moves from the link into the panel, close when it leaves, and appear above page content. They are hidden on narrow or touch screens, where the navigation is a scrollable strip.\n\nLinks inside a post can use the same preview. Write a normal Markdown link such as `[Start here](/start/)` or a wikilink such as `[[start]]`. When its destination is a public post or feed, hover or keyboard focus shows the destination title and available metadata. An absolute URL for the configured site also works; `http://localhost:8000/start/` works during local development. Tags shown on a post get a collection preview when their `/tags/\u003ctag\u003e/` feed exists. Links to other sites and links without a matching public page keep their usual behavior.\n\nTo give a feed link useful preview text, set `description` on its `[[markata-go.feeds]]` entry. For a post link, set `description` and `tags` in that post's frontmatter. The link URL must match the generated page path, such as `/blog/` or `/about/`.\n\nTo add a built-in **Random post** link:\n\n```toml\n[markata-go.random_post]\nenabled = true\npath = \"random\"                # generates /random/\nexclude_tags = [\"draft\"]       # optional\n\n[[markata-go.nav]]\nlabel = \"Random\"\nurl = \"/random/\"\n```\n\nIf you use sidebar navigation, add the same `url = \"/random/\"` link to `[[markata-go.sidebar.nav]]` (or to `[[markata-go.components.nav.items]]` if you're using the components system).\n\n### SEO Configuration (`[markata-go.seo]`)\n\nConfigure SEO metadata and structured data generation for better search engine visibility.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `twitter_handle` | string | `\"\"` | Twitter/X username (without @) for twitter:site |\n| `default_image` | string | `\"\"` | Default Open Graph image URL |\n| `logo_url` | string | `\"\"` | Site logo URL for Schema.org |\n\n```toml\n[markata-go.seo]\ntwitter_handle = \"waylonwalker\"\ndefault_image = \"/static/og-default.png\"\nlogo_url = \"/static/logo.png\"\n\n[markata-go.seo.structured_data]\nenabled = true\n\n[markata-go.seo.structured_data.publisher]\ntype = \"Organization\"\nname = \"My Company\"\nurl = \"https://example.com\"\nlogo = \"/static/logo.png\"\n\n[markata-go.seo.structured_data.default_author]\ntype = \"Person\"\nname = \"Jane Doe\"\nurl = \"https://example.com/about/\"\n```\n\n#### Structured Data Configuration\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `true` | Enable JSON-LD Schema.org generation |\n| `publisher` | object | `nil` | Publisher information |\n| `default_author` | object | `nil` | Default author for posts |\n\nWhen enabled, markata-go generates JSON-LD structured data for:\n- `WebSite` schema on the home page\n- `Article` or `BlogPosting` schema on posts\n- Breadcrumb navigation schema\n\n### Theme Settings (`[markata-go.theme]`)\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `name` | string | `\"default\"` | Theme name |\n| `palette` | string | `\"ayu-dark\"` | Color palette to use |\n| `palette_dark` | string | `\"\"` | Dark mode palette |\n| `fallback_mode` | string | `\"dark\"` | Mode for visitors who have not toggled it (`\"dark\"` or `\"light\"`); the OS preference is not used |\n| `seasonal` | boolean | `false` | Default visitors to the seasonal palette (northern hemisphere seasons plus world holidays). Needs the theme switcher; `palette` stays the fallback. See [Themes: Seasonal](/docs/guides/themes/#seasonal) |\n| `text_size` | string | `\"large\"` | Default reading-size preset: `\"small\"`, `\"medium\"`, `\"large\"`, or `\"x-large\"`. Article text additionally scales up on viewports ≥1800px. |\n| `show_text_size_control` | bool | `true` | Show the visitor-facing reading-size selector |\n| `custom_css` | string | `\"\"` | Custom CSS file path (relative to static/) |\n| `variables` | map | `{}` | CSS variable overrides |\n| `fontpack` | string | `\"system\"` | Font pack: zero-download system-ui headings/body with native monospace code (Brush is opt-in) |\n| `aesthetic` | string | `\"minimal\"` | Surface style: `minimal`, `balanced`, `elevated`, `precision`, or `brutal` |\n| `motif.kind` | string | `\"off\"` | Background motif (`off`, `block-w`, `letter`) |\n| `switcher.enabled` | bool | `true` | Show the live theme picker so visitors can choose any palette, style, and font; under `markata-go serve` its **Bake** button writes the current choices into your config (see [Themes Guide](/docs/guides/themes/)) |\n| `switcher.mode_toggle` | bool | `true` | Show the light/dark toggle next to the picker |\n\nThe default font pack is `system` (no downloaded font files). `brush` and `brush-poster` remain available for explicit site or page overrides. Built-in defaults do not cause migration warnings.\nIf your configuration supplies different values for `fontpack` and `theme.fontpack`, the nested value wins.\nThe loader reports that conflict once. Remove the legacy top-level `fontpack` to resolve the warning.\n\n```toml\n[markata-go.theme]\nname = \"default\"\npalette = \"catppuccin-mocha\"\n\n# Optional: different palette for dark mode\npalette_dark = \"catppuccin-mocha\"\n\n# Optional: fallback when system preference is unavailable\nfallback_mode = \"dark\"  # or \"light\"\n\n# Optional: default reading size and visitor control\ntext_size = \"large\"              # small, medium, large, or x-large\nshow_text_size_control = true\n\n# Optional: override specific CSS variables\n[markata-go.theme.variables]\n\"--color-primary\" = \"#8b5cf6\"\n\"--content-width\" = \"800px\"\n\n# Optional: add custom CSS file\ncustom_css = \"my-styles.css\"\n```\n\n**Available palettes:** `default-light`, `default-dark`, `catppuccin-mocha`, `catppuccin-latte`, `nord-dark`, `gruvbox-dark`, `dracula`, `rose-pine`, `solarized-dark`, `tokyo-night`\n\nSee the [[themes-and-styling|Themes Guide]] for detailed customization options.\n\n### Page CSS Bundles (`[markata-go.css_bundle]`)\n\n```toml\n[markata-go.css_bundle]\nenabled = true\npages = [\"index.html\"]\n```\n\n`pages` defaults to an empty list. Each entry names an HTML file relative to\n`output_dir`. Production builds bundle eligible head styles in cascade order\nafter CSS optimization. Fast builds skip page bundling. Existing `bundles`\ndefinitions continue to work independently. See [CSS optimization](themes/#css-optimization)\nfor stylesheet boundaries and runtime behavior.\n\n### CSS Purge (`[markata-go.css_purge]`)\n\n```toml\n[markata-go.css_purge]\nenabled = false\nverbose = false\npreserve = [\"js-*\", \"htmx-*\", \"theme-*\", \"palette-*\", \"md-code-*\"]\npreserve_attributes = [\"data-theme\", \"data-palette\", \"data-text-size\"]\nskip_files = [\"vendor/*\", \"normalize.css\"]\nwarning_threshold = 0\n```\n\nCSS purge removes unused rules by scanning generated HTML and keeping only selectors\nthat are actually present.\nThe built-in default safelist includes `md-code-*` for the article code-copy\nbutton, which is created by JavaScript after HTML generation. Without it, the\nbutton still works but loses its positioning and can cover code. When setting a\ncustom `preserve` list, include `\"md-code-*\"` alongside your own patterns;\ncustom lists replace, rather than extend, the defaults.\n The purge logic always preserves key @-rules and keeps\npseudo-only selectors like `:root` or `::selection` to avoid dropping base/theme styles.\nFull builds cache the discovered selector set and purged CSS under\n`.markata-cache/css-purge` in the content directory. The selector cache checks a content\nfingerprint of generated HTML paths and bytes. Purged CSS is reused only when stylesheet\nbytes, discovered selectors, and purge options match. Missing or invalid cache entries\nfall back to the normal scan or purge path.\n\n### Tailwind (`[markata-go.tailwind]`)\n\nmarkata-go can run the Tailwind standalone CLI automatically and wire the output\ninto your theme so you don't need a separate build step.\n\n```toml\n[markata-go.tailwind]\ninclude = \"css\"                # \"css\", \"js\", or false (default: \"css\")\npreflight = false               # Enable Tailwind Preflight reset styles (default: false)\ninput = \"tailwind.css\"          # Input CSS (relative to assets_dir)\noutput = \"markata-tailwind.css\" # Output CSS (relative to assets_dir)\nconfig_file = \"\"                # Optional tailwind.config.js path\nbuild = true                     # Run Tailwind CLI during build\nminify = true                    # Pass --minify to Tailwind CLI\nauto_install = true              # Auto-download Tailwind CLI (default: true)\nversion = \"v3.4.19\"             # Managed Tailwind CLI version tag\ncache_dir = \"\"                  # Cache dir for Tailwind CLI\nbinary = \"\"                     # Optional path to tailwindcss binary\nextra_args = []                  # Optional extra CLI arguments\nverbose = false                  # Verbose installer/build logs\n```\n\n**How it works:**\n\n- `input`/`output` resolve relative to `assets_dir` and are copied/fingerprinted\n  like any other static asset.\n- If `input` does not exist, markata-go generates a default Tailwind entry file for\n  you, so basic utility usage works without creating `tailwind.css` first.\n- If `extra_args` is empty and `config_file` is unset, markata-go generates a\n  temporary Tailwind config that scans a generated token manifest built from\n  rendered page HTML plus local JS/template sources. That generated config\n  disables Tailwind Preflight by default so utilities do not override markata-go's\n  built-in theme styles. Set `preflight = true` to opt back into the reset. The\n  manifest is hashed so Tailwind is skipped when the effective utility set has not changed.\n- `include = \"css\"` loads the compiled CSS. If `theme.custom_css` is unset, the\n  Tailwind output is assigned automatically. Explicit `theme.custom_css` always wins.\n- `include = \"js\"` injects `https://cdn.tailwindcss.com` in the document head.\n  When `[markata-go.assets].mode = \"self-hosted\"`, markata-go vendors this script\n  and uses the local URL from `asset_urls`.\n- `include = false` disables auto-inclusion; the build can still run.\n- Fast mode skips Tailwind rebuilds when the compiled asset already exists.\n\nBy default markata-go uses its managed Tailwind CLI version instead of a global\n`tailwindcss` on your `PATH`, which keeps builds consistent across machines. Set\n`auto_install = false` or `binary = \"/path/to/tailwindcss\"` only when you want to\noverride that behavior.\n\n**Validation warning:** If `include = \"css\"` and `[markata-go.css_purge].enabled = false`,\nmarkata-go emits a warning because Tailwind outputs an intentionally large CSS bundle.\n\nFor Tailwind-first sites with a custom reset strategy, either set `preflight = true`\nor provide your own `config_file`. User-supplied Tailwind config files are respected as-is.\n\n### Aesthetic Settings (`[markata-go]`)\n\nAesthetics control the non-color visual aspects of your site: border radius, spacing, shadows, and borders. While palettes control *what colors* you use, aesthetics control *how things are shaped*.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `aesthetic` | string | `\"balanced\"` | Aesthetic preset to use |\n\n```toml\n[markata-go]\naesthetic = \"elevated\"\n```\n\n**Available aesthetics:**\n\n| Aesthetic | Description |\n|-----------|-------------|\n| `balanced` | Default. Comfortable rounding, subtle shadows, normal spacing |\n| `brutal` | Sharp corners, thick borders, tight spacing, no shadows |\n| `minimal` | No rounding, maximum whitespace, no shadows, hairline borders |\n| `elevated` | Generous rounding, layered shadows, generous spacing |\n| `precision` | Subtle corners, compact spacing, hairline borders, minimal shadows |\n\n#### Aesthetic Overrides (`[markata-go.aesthetic_overrides]`)\n\nFine-tune individual aesthetic values without creating a full custom aesthetic:\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `border_radius` | string | varies | CSS border-radius value (e.g., `\"8px\"`, `\"0\"`) |\n| `spacing_scale` | float | varies | Spacing multiplier (e.g., `1.0`, `1.5`) |\n| `border_width` | string | varies | CSS border-width value (e.g., `\"1px\"`, `\"3px\"`) |\n| `border_style` | string | varies | CSS border-style value (e.g., `\"solid\"`, `\"none\"`) |\n| `shadow_intensity` | float | varies | Shadow opacity multiplier (0.0-1.0) |\n| `shadow_size` | string | varies | Shadow size: `\"none\"`, `\"sm\"`, `\"md\"`, `\"lg\"`, `\"xl\"` |\n\n```toml\n[markata-go]\naesthetic = \"balanced\"\n\n# Override specific values\n[markata-go.aesthetic_overrides]\nborder_radius = \"16px\"\nshadow_intensity = 0.8\nspacing_scale = 1.2\n```\n\n**Combining with palettes:**\n\n```toml\n[markata-go]\naesthetic = \"elevated\"\n\n[markata-go.theme]\npalette = \"catppuccin-mocha\"\n```\n\nSee the [[themes-and-styling|Themes Guide]] for detailed aesthetic customization and the full list of built-in presets.\n\n### Layout Components (`[markata-go.components]`)\n\nmarkata-go includes a configurable layout components system for navigation, footer, and sidebars. Each component can be enabled/disabled and positioned via configuration.\n\n#### Navigation Component (`[markata-go.components.nav]`)\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `true` | Show navigation |\n| `position` | string | `\"header\"` | Position: `\"header\"` or `\"sidebar\"` |\n| `style` | string | `\"horizontal\"` | Style: `\"horizontal\"` or `\"vertical\"` |\n| `items` | array | `[]` | Navigation links (overrides top-level nav) |\n\n```toml\n[markata-go.components.nav]\nenabled = true\nposition = \"header\"\nstyle = \"horizontal\"\n\n[[markata-go.components.nav.items]]\nlabel = \"Home\"\nurl = \"/\"\n\n[[markata-go.components.nav.items]]\nlabel = \"Blog\"\nurl = \"/blog/\"\n\n[[markata-go.components.nav.items]]\nlabel = \"GitHub\"\nurl = \"https://github.com/user\"\nexternal = true\n```\n\n#### Footer Component (`[markata-go.components.footer]`)\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `true` | Show footer |\n| `text` | string | `\"\"` | Custom footer text |\n| `show_copyright` | bool | `true` | Show copyright line |\n| `links` | array | `[]` | Footer links |\n\n```toml\n[markata-go.components.footer]\nenabled = true\ntext = \"Thanks for reading!\"\nshow_copyright = true\n\n[[markata-go.components.footer.links]]\nlabel = \"RSS\"\nurl = \"/rss.xml\"\n\n[[markata-go.components.footer.links]]\nlabel = \"GitHub\"\nurl = \"https://github.com/user\"\nexternal = true\n```\n\n#### Document Sidebar (`[markata-go.components.doc_sidebar]`)\n\nTable of contents sidebar for long-form content.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `false` | Show TOC sidebar |\n| `position` | string | `\"right\"` | Position: `\"left\"` or `\"right\"` |\n| `width` | string | `\"250px\"` | Sidebar width |\n| `min_depth` | int | `2` | Minimum heading level (h2 = 2) |\n| `max_depth` | int | `4` | Maximum heading level (h4 = 4) |\n\n```toml\n[markata-go.components.doc_sidebar]\nenabled = true\nposition = \"right\"\nwidth = \"280px\"\nmin_depth = 2\nmax_depth = 4\n```\n\nTo show the TOC only on blog-layout posts (pages rendered with `post.html`), use `show_toc` under `[markata-go.layout.blog]` instead. When `doc_sidebar.enabled = true`, it takes precedence and its `position` and `width` are used. See the Blog Layout section below.\n\n#### Feed Sidebar (`[markata-go.components.feed_sidebar]`)\n\nSeries/collection navigation sidebar for posts in the same feed.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `false` | Show feed sidebar |\n| `position` | string | `\"left\"` | Position: `\"left\"` or `\"right\"` |\n| `width` | string | `\"250px\"` | Sidebar width |\n| `title` | string | `\"\"` | Custom title (defaults to feed title) |\n| `feeds` | array | `[]` | Feed slugs to show navigation for |\n| `max_posts` | integer | `0` | Initial server-rendered sidebar window; public HTML feeds can progressively load the rest from static chunks |\n\n```toml\n[markata-go.components.feed_sidebar]\nenabled = true\nposition = \"left\"\nwidth = \"250px\"\ntitle = \"In this series\"\nfeeds = [\"tutorials\", \"guides\"]\nmax_posts = 51\n```\n\n#### Sidebar behavior\n\nThe document and feed sidebars are drawers at every width. Each drawer has a\nsmall handle (\"Series\" on the left, \"On this page\" on the right). Clicking the\nhandle, or pressing `b` (left) / `Shift+B` (right), opens the drawer; doing it\nagain closes it. Drawers never open on hover, so they cannot pop in and out\nwhile you read. Hovering or focusing a handle shows its hotkey (`b` or `⇧B`),\nand the handle's tooltip names it too.\n\n**Wide screens (`1201px` and up):** an open drawer docks beside the article\nand pushes the content aside instead of covering it. With both drawers open\nthe article sits between them, and it narrows if the viewport cannot fit all\nthree at full width. The open/closed choice is remembered per side in browser\nstorage and restored on later pages without animating. While the site header\nis on screen the drawer starts just below it; once you scroll past the header\nthe drawer fills the full viewport height. Each drawer has a single themed\nscrollbar.\n\n**Narrow screens (`1200px` and below):** the handles become small pills in the\nbottom corners. An open drawer slides over the page with a dimmed backdrop,\nand only one drawer is open at a time. Tapping the backdrop, pressing\n`Escape`, following a link inside the drawer, or tapping the pill again closes\nit, and focus returns to the handle. Overlay drawers always start closed and\ndon't change the remembered wide-screen state. A content sidebar\n(`[markata-go.content_sidebar]`) stacks below the article at this width.\n\nThe feed drawer also carries the feed picker, a `current/total` counter, and\nprevious/next feed buttons (`{` / `}`) for switching between primary feeds.\n\nTOC entries are built from the heading's visible text: resolved wikilinks,\nMarkdown links, emphasis and inline code are stripped, so the sidebar never\nshows raw HTML or markup. TOC anchors always match the rendered heading ids,\nincluding duplicate headings (`setup`, `setup-1`, `setup-2`), headings with\ninline code such as `` `update_meta` ``, headings with smart quotes, and\nexplicit `{#custom-id}` attributes. Lines starting with `#` inside fenced code\nblocks are never treated as headings.\n\nClicking a TOC entry moves quickly to the heading with a short glide (under a\nquarter of a second, starting close to the target so long jumps don't\nstream the whole page past). The URL hash updates and the heading briefly\nhighlights. Scrolling, touching or pressing a key during the glide hands\ncontrol back to you immediately. With `prefers-reduced-motion`, the jump is\ninstant. As you read, a marker slides along the TOC rail to the current\nsection, and the TOC keeps that entry in view.\n\n**Header on narrow screens:** below `1201px` the header switches to a compact\nlayout (title and controls on one row, search below, then a single scrollable\nnav strip).\n\n#### Share Component (`[markata-go.components.share]`)\n\nAdd a \"Share this post\" grid to the end of every article so readers can send your content to social platforms or copy the link.\n\nPost pages also include a separate `Copy this post` control near the article title. That top-of-post menu exposes `URL`, `Rich`, `Markdown`, and `Text` clipboard options based on the current post output. To remove the menu without removing the share grid or disabling post formats, set:\n\n```toml\n[markata-go.components.post_copy]\nenabled = false\n```\n\n`components.post_copy.enabled` defaults to `true`. The setting applies to post pages, including custom post templates that include the built-in copy component.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `true` | Show the component. |\n| `title` | string | `\"Share this post\"` | Heading text above the buttons. |\n| `position` | string | `\"bottom\"` | Modifier used by CSS (applied as `share-panel--\u003cposition\u003e`). |\n| `platforms` | array | `[\"twitter\",\"bluesky\",\"linkedin\",\"whatsapp\",\"facebook\",\"telegram\",\"pinterest\",\"reddit\",\"hacker_news\",\"email\",\"copy\"]` | Ordered list of platform keys to render. Omit entries to hide them. |\n| `custom` | table | `{}` | Custom platform definitions (`name`, `icon`, `url`). Icon paths without `/`, `http`, or `data:` are resolved via `theme_asset_hashed` (e.g., `icons/share/mastodon.svg`). |\n\n```toml\n[markata-go.components.share]\nenabled = true\ntitle = \"Share this post\"\n  platforms = [\"twitter\", \"mastodon\", \"linkedin\", \"copy\"]\n\n[markata-go.components.share.custom]\nmastodon = { name = \"Mastodon\", icon = \"mastodon.svg\", url = \"https://mastodon.social/share?text={{title}}\u0026url={{url}}\" }\n```\n\nSupported placeholders for share URLs:\n\n- `{{title}}` → URL-encoded post title (falls back to site title or slug).\n- `{{url}}` → URL-encoded absolute post URL (`config.url` + `post.href`).\n- `{{excerpt}}` → URL-encoded post description or excerpt when provided.\n\nCopying uses the Clipboard API with a DOM fallback, updates the button label/tooltip to \"Link copied\" for 2 seconds, and shows a small desktop-only toast. Built-in platforms include Twitter, Bluesky, LinkedIn, WhatsApp, Facebook, Telegram, Pinterest, Reddit, Hacker News, Email, and Copy Link, each with a coordinated icon from `pkg/themes/default/static/icons/share/`.\n\n#### Post Connections Component (`[markata-go.components.post_connections]`)\n\nConfigure backlinks/outlinks UI on post pages. You can render a graph, a list, or both, and tune thresholds independently.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `true` | Enable post connections UI. |\n| `display` | array | `['graph']` | Modes to render: `graph`, `list`, or both. |\n| `min_links` | int | `1` | Lower bound (inlinks + outlinks) to render any mode. |\n| `max_links` | int | `0` | Upper bound to render any mode (`0` = no max). |\n| `graph_min_links` | int | `3` | Lower bound for graph mode. |\n| `graph_max_links` | int | `0` | Upper bound for graph mode (`0` = no max). |\n| `list_min_links` | int | `1` | Lower bound for list mode. |\n| `list_max_links` | int | `0` | Upper bound for list mode (`0` = no max). |\n| `inlinks_limit` | int | `8` | Max inlinks shown in list mode. |\n| `outlinks_limit` | int | `8` | Max outlinks shown in list mode. |\n\nThe graph loader is only emitted on pages that render the graph preview, so pages that stay in list-only mode avoid the graph JavaScript entirely.\n\n```toml\n[markata-go.components.post_connections]\nenabled = true\ndisplay = [\"list\", \"graph\"]\n\n# Show list first, then graph for denser pages\nlist_min_links = 1\nlist_max_links = 5\ngraph_min_links = 6\ngraph_max_links = 0\n\ninlinks_limit = 6\noutlinks_limit = 10\n```\n\n### IndieAuth Settings (`[markata-go.indieauth]`)\n\n[IndieAuth](https://indieauth.net/) is a decentralized identity protocol that allows you to use your own domain to sign in to websites. markata-go can add the necessary `\u003clink\u003e` tags to your site's HTML head.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `false` | Enable IndieAuth link tags in HTML head |\n| `authorization_endpoint` | string | `\"\"` | URL of your authorization endpoint |\n| `token_endpoint` | string | `\"\"` | URL of your token endpoint |\n| `me_url` | string | `\"\"` | Your profile URL for `rel=\"me\"` links |\n\n```toml\n[markata-go.indieauth]\nenabled = true\nauthorization_endpoint = \"https://indieauth.com/auth\"\ntoken_endpoint = \"https://tokens.indieauth.com/token\"\nme_url = \"https://github.com/yourusername\"\n```\n\nWhen enabled, this adds the following link tags to your site's `\u003chead\u003e`:\n\n```html\n\u003clink rel=\"authorization_endpoint\" href=\"https://indieauth.com/auth\"\u003e\n\u003clink rel=\"token_endpoint\" href=\"https://tokens.indieauth.com/token\"\u003e\n\u003clink rel=\"me\" href=\"https://github.com/yourusername\"\u003e\n```\n\n### Webmention Settings (`[markata-go.webmention]`)\n\n[Webmention](https://www.w3.org/TR/webmention/) is a web standard for conversations and interactions across websites. markata-go can add the webmention endpoint link tag to your site.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `false` | Enable Webmention link tag in HTML head |\n| `endpoint` | string | `\"\"` | URL of your Webmention endpoint |\n\n```toml\n[markata-go.webmention]\nenabled = true\nendpoint = \"https://webmention.io/example.com/webmention\"\n```\n\nWhen enabled, this adds the following link tag to your site's `\u003chead\u003e`:\n\n```html\n\u003clink rel=\"webmention\" href=\"https://webmention.io/example.com/webmention\"\u003e\n```\n\n**Popular Webmention services:**\n- [webmention.io](https://webmention.io/) - Free hosted webmention service\n- [Bridgy](https://brid.gy/) - Connects social media interactions to webmentions\n\n### WebSub Settings (`[markata-go.websub]`)\n\n[WebSub](https://www.w3.org/TR/websub/) enables near-real-time feed delivery by advertising hub URLs. When enabled, markata-go adds discovery links to HTML pages and RSS/Atom feeds.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `false` | Enable WebSub discovery links |\n| `hubs` | array | `[]` | List of WebSub hub URLs |\n\n```toml\n[markata-go.websub]\nenabled = true\nhubs = [\"https://hub.example.com/\"]\n```\n\n**Output:**\n- HTML `\u003chead\u003e` includes `\u003clink rel=\"hub\" href=\"...\"\u003e` for each hub\n- RSS/Atom feeds include `rel=\"hub\"` and `rel=\"self\"` links\n\n### Head Configuration (`[markata-go.head]`)\n\nThe head configuration allows you to customize elements in the HTML `\u003chead\u003e` section, including custom meta tags, links, scripts, and feed alternate links.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `text` | string | `\"\"` | Raw HTML to include in head (use with caution) |\n| `meta` | array | `[]` | Custom meta tags |\n| `link` | array | `[]` | Custom link tags |\n| `script` | array | `[]` | Custom script tags |\n| `alternate_feeds` | array | `[]` | Feed alternate links (RSS, Atom, JSON) |\n\n#### Alternate Feed Links\n\nBy default, markata-go includes RSS and Atom feed links in the `\u003chead\u003e`. You can customize which feeds are advertised:\n\n```toml\n[markata-go.head]\n# Customize which feeds get \u003clink rel=\"alternate\"\u003e tags\n[[markata-go.head.alternate_feeds]]\ntype = \"rss\"\ntitle = \"RSS Feed\"\nhref = \"/rss.xml\"\n\n[[markata-go.head.alternate_feeds]]\ntype = \"atom\"\ntitle = \"Atom Feed\"\nhref = \"/atom.xml\"\n\n[[markata-go.head.alternate_feeds]]\ntype = \"json\"\ntitle = \"JSON Feed\"\nhref = \"/feed.json\"\n```\n\n**Supported feed types:**\n| Type | MIME Type | Description |\n|------|-----------|-------------|\n| `rss` | `application/rss+xml` | RSS 2.0 feed |\n| `atom` | `application/atom+xml` | Atom 1.0 feed |\n| `json` | `application/feed+json` | JSON Feed |\n\n**Example: Only advertise JSON Feed:**\n\n```toml\n[[markata-go.head.alternate_feeds]]\ntype = \"json\"\ntitle = \"JSON Feed\"\nhref = \"/feed.json\"\n```\n\n**Example: Feed per section:**\n\n```toml\n[[markata-go.head.alternate_feeds]]\ntype = \"rss\"\ntitle = \"Blog RSS\"\nhref = \"/blog/rss.xml\"\n\n[[markata-go.head.alternate_feeds]]\ntype = \"rss\"\ntitle = \"Tutorials RSS\"\nhref = \"/tutorials/rss.xml\"\n```\n\n#### Custom Meta Tags\n\n```toml\n[[markata-go.head.meta]]\nname = \"author\"\ncontent = \"Jane Doe\"\n\n[[markata-go.head.meta]]\nproperty = \"og:site_name\"\ncontent = \"My Site\"\n```\n\n#### Custom Link Tags\n\n```toml\n[[markata-go.head.link]]\nrel = \"icon\"\nhref = \"/favicon.ico\"\n\n[[markata-go.head.link]]\nrel = \"preconnect\"\nhref = \"https://fonts.googleapis.com\"\ncrossorigin = true\n```\n\n#### Custom Script Tags\n\n```toml\n[[markata-go.head.script]]\nsrc = \"/js/analytics.js\"\n```\n\n### Glob Settings (`[markata-go.glob]`)\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `patterns` | string[] | `[\"pages/**/*.md\", \"posts/**/*.md\"]` | Glob patterns to find content files |\n| `use_gitignore` | bool | `true` | Respect .gitignore when finding files |\n| `slug_mode` | string | `\"flat\"` | Slug derivation mode: `flat` or `path` |\n\n```toml\n[markata-go.glob]\npatterns = [\"posts/**/*.md\", \"pages/*.md\", \"docs/**/*.md\"]\nuse_gitignore = true\nslug_mode = \"flat\"\n```\n\n`slug_mode` controls how markata derives a slug when frontmatter does not explicitly set `slug`:\n\n- `flat` keeps the current default behavior and uses the filename only. `posts/2026/hello-world.md` becomes `hello-world`.\n- `path` derives the slug from the content path, strips leading `posts/` or `pages/`, and treats `index.md` or `README.md` as the directory root. `posts/notes/today.md` becomes `notes/today`, and `pages/docs/README.md` becomes `docs`.\n\nFrontmatter `slug` still overrides either mode.\n\nYou can also mix both behaviors by directory with `slug_rules`:\n\n```toml\n[markata-go.glob]\nslug_mode = \"flat\"\n\n[[markata-go.glob.slug_rules]]\nprefix = \"posts/blog\"\nmode = \"flat\"\n\n[[markata-go.glob.slug_rules]]\nprefix = \"posts/notes\"\nmode = \"path\"\n```\n\nRules match by content path prefix, and the longest matching prefix wins. That lets you keep primary content flat while letting notes or docs stay nested.\n\n### Markdown Settings (`[markata-go.markdown]`)\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `extensions` | string[] | `[]` | Markdown extensions to enable |\n\nAvailable extensions:\n- `tables` - GFM tables\n- `strikethrough` - ~~strikethrough~~ text\n- `autolinks` - Automatic URL linking\n- `tasklist` - Task list checkboxes\n\n```toml\n[markata-go.markdown]\nextensions = [\"tables\", \"strikethrough\", \"autolinks\", \"tasklist\"]\n```\n\n#### Syntax Highlighting (`[markata-go.markdown.highlight]`)\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `true` | Enable syntax highlighting |\n| `theme` | string | `\"\"` | Chroma theme (empty = auto from palette) |\n| `line_numbers` | bool | `false` | Show line numbers in code blocks |\n\n```toml\n[markata-go.markdown.highlight]\nenabled = true\ntheme = \"github-dark\"    # Or leave empty for auto-detection\nline_numbers = false\n```\n\n### Template Selection\n\nNamed presets and global per-format fallbacks are loaded from the\n`[markata-go]` namespace and work in TOML, YAML, and JSON configuration files.\n\n```toml\n[markata-go.template_presets.blog]\nhtml = \"blog.html\"\ntxt = \"blog.txt\"\nmarkdown = \"blog.md\"\nog = \"blog-og.html\"\n\n[markata-go.default_templates]\nhtml = \"post.html\"\ntxt = \"default.txt\"\n```\n\nWhen a post selects `template = \"blog\"`, the matching preset is used first.\n`default_templates` is used after post, preset, and layout selection when no\nearlier template supplies the requested format.\n\n### Error Pages\n\nConfigure the generated 404 page with `[markata-go.error_pages]`:\n\n```toml\n[markata-go.error_pages]\nenable_404 = true\ncustom_404_template = \"404.html\"\nmax_suggestions = 5\n```\n\nThe built-in `404.html` uses the site's theme and offers a search field, the\nrequested address, and links back to the home page and archive. To customize its\nlayout, provide a `404.html` template in your `templates/` directory. It extends\nthe post page by default, so it can use the same navigation, palette, and theme\ncontrols as the rest of the site.\n\n### Resource Hints\n\nResource-hint settings use `[markata-go.resource_hints]`:\n\n```toml\n[markata-go.resource_hints]\nenabled = true\nauto_detect = true\nexclude_domains = [\"example.com\"]\n```\n\nThe feature is configured independently from plugin registration. Its default\nsettings enable hints and automatic detection; set `enabled = false` to keep\nthe typed setting disabled.\n\n### Mermaid Settings (`[markata-go.mermaid]`)\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `true` | Whether mermaid diagram processing is active |\n| `mode` | string | `\"client\"` | Rendering mode: `client` (browser-side), `cli` (mmdc), or `chromium` (headless Chrome) |\n| `cdn_url` | string | `/assets/vendor/mermaid/mermaid.min.js` | Mermaid JS URL (local by default) |\n| `theme` | string | `\"default\"` | Mermaid theme: `default`, `dark`, `forest`, `neutral`. Ignored when `use_css_variables` is true. |\n| `use_css_variables` | bool | `true` | Derive diagram colors from site CSS custom properties. Nodes and edge labels use the surface color, labels use the text color, borders and edges use the border color (falling back to the primary color), and clusters use the background color. |\n| `lightbox` | bool | `true` | Enable click-to-zoom lightbox overlay with interactive pan and zoom via svg-pan-zoom. |\n| `lightbox_selector` | string | `\".glightbox-mermaid\"` | CSS selector for lightbox links (backward compatibility; programmatic API does not use it). |\n\nIn client mode, diagrams rerender when readers change the active theme or\npalette. Chromium mode uses the same palette colors in its static SVGs. CLI mode\nuses the Mermaid CLI theme and configuration.\n\n#### CLI Mode Settings (`[markata-go.mermaid.cli]`)\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `mmdc_path` | string | `\"\"` | Path to the mmdc binary. Auto-detected if empty. |\n| `extra_args` | string | `\"\"` | Additional command-line arguments passed to mmdc. |\n\n#### Chromium Mode Settings (`[markata-go.mermaid.chromium]`)\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `browser_path` | string | `\"\"` | Path to Chrome/Chromium binary. Auto-detected if empty. |\n| `timeout` | int | `30` | Maximum seconds to wait for a diagram to render. |\n| `max_concurrent` | int | `4` | Maximum number of parallel diagram renders. |\n| `no_sandbox` | bool | `false` | Disable Chromium sandbox. Required in containers (Docker, Distrobox, etc.). |\n\n```toml\n[markata-go.mermaid]\nenabled = true\ntheme = \"default\"\nuse_css_variables = true    # Diagrams automatically match your site palette\nlightbox = true             # Click any diagram to zoom, pan, and explore\n```\n\nTo pre-render diagrams to static SVGs using Chromium (no client-side JS needed):\n\n```toml\n[markata-go.mermaid]\nmode = \"chromium\"\n\n[markata-go.mermaid.chromium]\ntimeout = 30\nmax_concurrent = 4\n# no_sandbox = true         # Required inside Docker or other containers\n```\n\nPre-rendered Mermaid SVGs are cached automatically. Hot builds reuse cached SVGs\nwhen the diagram source and rendering inputs match, avoiding repeated Chromium or\n`mmdc` rendering for unchanged diagrams.\n\n#### Chromium in Containers (Docker, Distrobox, Podman)\n\nChromium's sandbox requires kernel capabilities that most containers restrict.\nSet `no_sandbox = true` when running inside Docker, Distrobox, Podman, or\nsimilar environments:\n\n```toml\n[markata-go.mermaid.chromium]\nno_sandbox = true\n```\n\n**Installing Chrome without sudo:** If your container does not have Chrome or\nChromium installed, download `chrome-headless-shell` from\n[Chrome for Testing](https://googlechromelabs.github.io/chrome-for-testing/).\nThis is a lightweight headless binary (~180 MB) that requires no GUI\ndependencies and no root access:\n\n```bash\n# Download and extract (adjust version as needed)\ncd /tmp\ncurl -fsSL https://storage.googleapis.com/chrome-for-testing-public/LATEST_RELEASE_STABLE -o version.txt\nVERSION=$(cat version.txt)\ncurl -fsSL \"https://storage.googleapis.com/chrome-for-testing-public/${VERSION}/linux64/chrome-headless-shell-linux64.zip\" -o headless.zip\nunzip headless.zip\n\n# Install to ~/.local (no sudo needed)\nmkdir -p ~/.local/lib/chrome-headless-shell\nmv chrome-headless-shell-linux64/* ~/.local/lib/chrome-headless-shell/\n\n# Create a wrapper script so markata-go auto-detects it\nmkdir -p ~/.local/bin\ncat \u003e ~/.local/bin/headless-shell \u003c\u003c 'EOF'\n#!/bin/sh\nexec \"$HOME/.local/lib/chrome-headless-shell/chrome-headless-shell\" \"$@\"\nEOF\nchmod +x ~/.local/bin/headless-shell\n\n# Verify\nheadless-shell --version\n```\n\nmarkata-go auto-detects `headless-shell` in your `PATH`. You can also set the\npath explicitly:\n\n```toml\n[markata-go.mermaid.chromium]\nbrowser_path = \"/home/you/.local/lib/chrome-headless-shell/chrome-headless-shell\"\nno_sandbox = true\n```\n\nTo disable the lightbox overlay (diagrams render inline only):\n\n```toml\n[markata-go.mermaid]\nlightbox = false\n```\n\nTo use a fixed Mermaid theme instead of CSS variables:\n\n```toml\n[markata-go.mermaid]\nuse_css_variables = false\ntheme = \"dark\"\n```\n\nSee the [plugin reference](../reference/plugins.md#mermaid) for full details on lightbox interaction, CSS classes, and theming.\n\n### Image Optimization Settings (`[markata-go.image_optimization]`)\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `true` | Enable image optimization |\n| `formats` | string[] | `\"avif\", \"webp\"` | Output formats to generate |\n| `quality` | int | `80` | Default quality for all formats |\n| `avif_quality` | int | `80` | AVIF quality override |\n| `webp_quality` | int | `80` | WebP quality override |\n| `widths` | int[] | `[480, 768, 1200]` | Responsive widths to generate |\n| `sizes` | string | `\"100vw\"` | Sizes attribute for responsive sources |\n| `cache_dir` | string | `.markata/image-cache` | Cache directory for encode metadata |\n| `avifenc_path` | string | `\"\"` | Path to `avifenc` (auto-detect if empty) |\n| `cwebp_path` | string | `\"\"` | Path to `cwebp` (auto-detect if empty) |\n\n```toml\n[markata-go.image_optimization]\nenabled = true\nformats = [\"avif\", \"webp\"]\nquality = 80\nwidths = [480, 768, 1200]\nsizes = \"100vw\"\n```\n\nThe plugin generates local AVIF/WebP variants when an encoder is available. Trusted\nDropper image URLs receive responsive `srcset` candidates that use Dropper's width\nparameter; the build does not download or generate those remote variants. Other\nexternal URLs and data URIs remain unchanged. Missing local encoders do not fail\nthe build.\n\n### Layout System (`[markata-go.layout]`)\n\nThe layout system controls page structure including sidebars, table of contents, headers, and footers. Different layouts can be assigned to different content types.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `name` | string | `\"blog\"` | Default layout: `\"docs\"`, `\"blog\"`, `\"landing\"`, `\"bare\"` |\n| `paths` | map | `{}` | Map URL prefixes to layouts |\n| `feeds` | map | `{}` | Map feed slugs to layouts |\n\n```toml\n[markata-go.layout]\nname = \"docs\"  # Default layout for all pages\n\n# Path-based layout selection\n[markata-go.layout.paths]\n\"/docs/\" = \"docs\"\n\"/blog/\" = \"blog\"\n\"/about/\" = \"landing\"\n\n# Feed-based layout selection\n[markata-go.layout.feeds]\n\"docs\" = \"docs\"\n\"blog\" = \"blog\"\n```\n\n#### Documentation Layout (`[markata-go.layout.docs]`)\n\nThe default theme includes a documentation page template. Set `name = \"docs\"`\nto get a documentation sidebar, a centered reading column, and an optional\ntable of contents. Add a project template at `layouts/docs.html` only when you\nneed to replace the built-in markup.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `sidebar_position` | string | `\"left\"` | Sidebar position: `\"left\"` or `\"right\"` |\n| `sidebar_width` | string | `\"280px\"` | Sidebar width |\n| `sidebar_collapsible` | bool | `true` | Allow sidebar collapse |\n| `sidebar_default_open` | bool | `true` | Sidebar open by default |\n| `toc_position` | string | `\"right\"` | TOC position: `\"left\"` or `\"right\"` |\n| `toc_width` | string | `\"220px\"` | TOC width |\n| `toc_collapsible` | bool | `true` | Allow TOC collapse |\n| `toc_default_open` | bool | `true` | TOC open by default |\n| `content_max_width` | string | `\"800px\"` | Maximum content width |\n| `header_style` | string | `\"minimal\"` | Header: `\"full\"`, `\"minimal\"`, `\"transparent\"`, `\"none\"` |\n| `footer_style` | string | `\"minimal\"` | Footer: `\"full\"`, `\"minimal\"`, `\"none\"` |\n\n```toml\n[markata-go.layout.docs]\nsidebar_position = \"left\"\nsidebar_width = \"280px\"\ntoc_position = \"right\"\ntoc_width = \"220px\"\ncontent_max_width = \"800px\"\nheader_style = \"minimal\"\nfooter_style = \"minimal\"\n```\n\nThe default template uses Markata's shared base page, theme assets, sidebar\nnavigation, and post typography. It reads sidebar entries from\n`[markata-go.sidebar]` and table-of-contents entries from the document\nheadings. A project `templates/layouts/docs.html` takes precedence when you\nneed custom markup.\n\n#### Blog Layout (`[markata-go.layout.blog]`)\n\nSingle-column layout optimized for reading long-form content.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `content_max_width` | string | `\"720px\"` | Maximum content width |\n| `show_toc` | bool | `false` | Show the table of contents sidebar on blog-layout posts that have headings |\n| `toc_position` | string | `\"right\"` | TOC position if enabled: `\"left\"` or `\"right\"` |\n| `toc_width` | string | `\"200px\"` | TOC width |\n| `header_style` | string | `\"full\"` | Header style |\n| `footer_style` | string | `\"full\"` | Footer style |\n| `show_author` | bool | `true` | Display post author |\n| `show_date` | bool | `true` | Display post date |\n| `show_tags` | bool | `true` | Display post tags |\n| `show_reading_time` | bool | `true` | Display estimated reading time |\n| `show_prev_next` | bool | `true` | Display prev/next navigation |\n\n```toml\n[markata-go.layout.blog]\ncontent_max_width = \"720px\"\nshow_toc = true\nshow_author = true\nshow_date = true\nshow_tags = true\nshow_reading_time = true\nshow_prev_next = true\n```\n\n#### Landing Layout (`[markata-go.layout.landing]`)\n\nFull-width layout for marketing pages and home pages.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `content_max_width` | string | `\"100%\"` | Maximum content width |\n| `header_style` | string | `\"transparent\"` | Header style |\n| `header_sticky` | bool | `true` | Sticky header |\n| `footer_style` | string | `\"full\"` | Footer style |\n| `hero_enabled` | bool | `true` | Enable hero section |\n\n```toml\n[markata-go.layout.landing]\ncontent_max_width = \"100%\"\nheader_style = \"transparent\"\nheader_sticky = true\nhero_enabled = true\n```\n\n### Sidebar Configuration (`[markata-go.sidebar]`)\n\nConfigure the sidebar navigation component for documentation and guides.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `true` | Show sidebar |\n| `position` | string | `\"left\"` | Position: `\"left\"` or `\"right\"` |\n| `width` | string | `\"280px\"` | Sidebar width |\n| `collapsible` | bool | `true` | Allow collapse |\n| `default_open` | bool | `true` | Open by default |\n| `title` | string | `\"\"` | Sidebar title/header |\n| `multi_feed` | bool | `false` | Multi-feed mode with sections |\n| `feeds` | string[] | `[]` | Feed slugs for multi-feed mode |\n\n```toml\n[markata-go.sidebar]\nenabled = true\nposition = \"left\"\nwidth = \"280px\"\ntitle = \"Documentation\"\n\n# Manual navigation structure\n[[markata-go.sidebar.nav]]\ntitle = \"Getting Started\"\nhref = \"/docs/\"\n\n[[markata-go.sidebar.nav]]\ntitle = \"Guides\"\nchildren = [\n    { title = \"Configuration\", href = \"/docs/guides/configuration/\" },\n    { title = \"Templates\", href = \"/docs/guides/templates/\" },\n    { title = \"Themes\", href = \"/docs/guides/themes/\" },\n    { title = \"Feeds\", href = \"/docs/guides/feeds/\" },\n]\n\n[[markata-go.sidebar.nav]]\ntitle = \"Reference\"\nchildren = [\n    { title = \"CLI\", href = \"/docs/reference/cli/\" },\n    { title = \"Plugins\", href = \"/docs/reference/plugins/\" },\n]\n```\n\n#### Path-Specific Sidebars (`[markata-go.sidebar.paths]`)\n\nConfigure different sidebar content for different URL paths.\n\n```toml\n[markata-go.sidebar.paths.\"/docs/\"]\ntitle = \"Documentation\"\nfeed = \"docs\"  # Auto-generate from this feed\n\n[markata-go.sidebar.paths.\"/guides/\"]\ntitle = \"Guides\"\n[markata-go.sidebar.paths.\"/guides/\".auto_generate]\ndirectory = \"guides\"\norder_by = \"nav_order\"\n```\n\n#### Multi-Feed Sidebars\n\nShow posts from multiple feeds in collapsible sections.\n\n```toml\n[markata-go.sidebar]\nmulti_feed = true\nfeeds = [\"docs\", \"guides\", \"tutorials\"]\n\n[[markata-go.sidebar.feed_sections]]\nfeed = \"docs\"\ntitle = \"Documentation\"\ncollapsed = false\n\n[[markata-go.sidebar.feed_sections]]\nfeed = \"guides\"\ntitle = \"Guides\"\ncollapsed = true\nmax_items = 10\n```\n\n### Table of Contents (`[markata-go.toc]`)\n\nConfigure the table of contents component for document navigation.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `true` | Show TOC |\n| `auto_enable` | bool | `false` | Auto-show based on thresholds |\n| `min_toc_links` | int | `3` | Min headings for auto-show |\n| `min_word_count` | int | `500` | Min words for auto-show |\n| `position` | string | `\"right\"` | Position: `\"left\"` or `\"right\"` |\n| `width` | string | `\"220px\"` | TOC width |\n| `min_depth` | int | `2` | Minimum heading level (h2 = 2) |\n| `max_depth` | int | `4` | Maximum heading level (h4 = 4) |\n| `title` | string | `\"On this page\"` | TOC section title |\n| `collapsible` | bool | `true` | Allow collapse |\n| `default_open` | bool | `true` | Open by default |\n| `scroll_spy` | bool | `true` | Highlight current section |\n\n```toml\n[markata-go.toc]\nenabled = true\nauto_enable = true          # Auto-show TOC for long posts\nmin_toc_links = 3           # Show if 3+ headings\nmin_word_count = 500        # Show if 500+ words\nposition = \"right\"\nwidth = \"220px\"\ntitle = \"On this page\"\nmin_depth = 2\nmax_depth = 4\nscroll_spy = true\n```\n\n### Header Configuration (`[markata-go.header]`)\n\nConfigure the header component for layouts.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `style` | string | `\"full\"` | Style: `\"full\"`, `\"minimal\"`, `\"transparent\"`, `\"none\"` |\n| `sticky` | bool | `true` | Stick to top when scrolling |\n| `show_logo` | bool | `true` | Display site logo |\n| `show_title` | bool | `true` | Display site title |\n| `show_nav` | bool | `true` | Display navigation links |\n| `show_search` | bool | `true` | Display search box |\n| `show_theme_toggle` | bool | `true` | Display dark/light toggle in header (legacy gate; also controlled by `theme.switcher.mode_toggle`) |\n\n```toml\n[markata-go.header]\nstyle = \"full\"\nsticky = true\nshow_logo = true\nshow_title = true\nshow_nav = true\nshow_search = true\nshow_theme_toggle = true\n```\n\n### Footer Configuration (`[markata-go.footer_layout]`)\n\nConfigure the footer component for layouts.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `style` | string | `\"full\"` | Style: `\"full\"`, `\"minimal\"`, `\"none\"` |\n| `sticky` | bool | `false` | Stick to bottom |\n| `show_copyright` | bool | `true` | Display copyright notice |\n| `copyright_text` | string | `\"\"` | Custom copyright text |\n| `show_social_links` | bool | `true` | Display social media links |\n| `show_nav_links` | bool | `true` | Display navigation links |\n\n```toml\n[markata-go.footer_layout]\nstyle = \"full\"\nsticky = false\nshow_copyright = true\ncopyright_text = \"© 2024 My Site. All rights reserved.\"\nshow_social_links = true\nshow_nav_links = true\n```\n\n### Link Avatars (`[markata-go.link_avatars]`)\n\nAdd favicon icons next to external links.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `false` | Enable link avatars |\n| `mode` | string | `\"js\"` | `\"js\"`, `\"local\"`, or `\"hosted\"` |\n| `selector` | string | `\"a[href^='http']\"` | CSS selector for links to enhance |\n| `service` | string | `\"duckduckgo\"` | Favicon service (`duckduckgo`, `google`, `custom`) |\n| `template` | string | `\"\"` | Custom service template (used when `service = \"custom\"`) |\n| `size` | int | `16` | Icon size in pixels |\n| `position` | string | `\"before\"` | `\"before\"` or `\"after\"` |\n| `ignore_domains` | string[] | `[]` | Domains to skip |\n| `ignore_origins` | string[] | `[]` | Full origins to skip |\n| `ignore_selectors` | string[] | `[]` | CSS selectors to skip |\n| `ignore_classes` | string[] | `[]` | CSS classes to skip |\n| `ignore_ids` | string[] | `[]` | Element IDs to skip |\n| `hosted_base_url` | string | `\"\"` | Base URL for hosted mode assets |\n\n```toml\n[markata-go.link_avatars]\nenabled = true\nmode = \"local\"\nservice = \"duckduckgo\"\nsize = 16\nposition = \"before\"\nignore_domains = [\"localhost\", \"127.0.0.1\"]\n```\n\n### Blogroll Configuration (`[markata-go.blogroll]`)\n\nConfigure the blogroll and RSS reader functionality to display feeds from blogs you follow.\nBlogroll fetches are cached by fetch timestamp, and stale cached results are reused when\nrefresh attempts fail.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `false` | Enable blogroll plugin |\n| `cache_dir` | string | `\"cache/blogroll\"` | Cache directory |\n| `cache_duration` | string | `\"24h\"` | Cache TTL (Go duration format) |\n| `timeout` | int | `30` | HTTP timeout in seconds |\n| `concurrent_requests` | int | `5` | Max parallel feed fetches |\n| `max_entries_per_feed` | int | `50` | Max entries per feed |\n| `fallback_image_service` | string | `\"\"` | Last-resort screenshot template for Reader previews after article and source images |\n\n```toml\n[markata-go.blogroll]\nenabled = true\ncache_dir = \"cache/blogroll\"\ncache_duration = \"24h\"\ntimeout = 30\nconcurrent_requests = 5\nmax_entries_per_feed = 50\n\n# Custom templates\n[markata-go.blogroll.templates]\nblogroll = \"blogroll.html\"\nreader = \"reader.html\"\n```\n\n#### Adding Feeds (`[[markata-go.blogroll.feeds]]`)\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `url` | string | Yes | RSS or Atom feed URL |\n| `title` | string | No | Display name (auto-fetched if not set) |\n| `description` | string | No | Short description |\n| `category` | string | No | Group feeds together |\n| `tags` | string[] | No | Additional labels |\n| `site_url` | string | No | Main website URL |\n| `image_url` | string | No | Logo or icon URL |\n| `active` | bool | No | Set `false` to disable |\n\n```toml\n# Technology blogs\n[[markata-go.blogroll.feeds]]\nurl = \"https://simonwillison.net/atom/everything/\"\ntitle = \"Simon Willison\"\ndescription = \"Creator of Datasette, Django co-creator\"\ncategory = \"Technology\"\ntags = [\"python\", \"ai\", \"llm\"]\n\n[[markata-go.blogroll.feeds]]\nurl = \"https://jvns.ca/atom.xml\"\ntitle = \"Julia Evans\"\ndescription = \"Making hard things easy to understand\"\ncategory = \"Technology\"\ntags = [\"linux\", \"networking\"]\n\n# Design blogs\n[[markata-go.blogroll.feeds]]\nurl = \"https://css-tricks.com/feed/\"\ntitle = \"CSS-Tricks\"\ncategory = \"Design\"\ntags = [\"css\", \"frontend\"]\n```\n\n**Generated pages:**\n- `/blogroll/` - Directory of all feeds grouped by category\n- `/reader/` - Curated reader page with day grouping, source favicons, and columns\n\nSee the [Blogroll Guide](/docs/guides/blogroll/) for detailed configuration and customization.\n\n### Post Output Formats (`[markata-go.post_formats]`)\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `html` | bool | `true` | Generate standard HTML pages |\n| `markdown` | bool | `true` | Generate raw markdown source |\n| `text` | bool | `true` | Generate plain terminal-friendly text output |\n| `ansi` | bool | `false` | Generate ANSI-styled terminal output |\n| `og` | bool | `true` | Generate OpenGraph card HTML |\n\n```toml\n[markata-go.post_formats]\nhtml = true       # /slug/index.html (default)\nmarkdown = true   # /slug.md (canonical) - enabled by default\ntext = true       # /slug.txt (canonical) - enabled by default\nansi = true       # /slug.ansi (canonical) - opt-in rich terminal output\nog = true         # /slug/og/index.html (social card)\n```\n\n**Reversed Redirects for txt/md/ansi**: For `.txt`, `.md`, and `.ansi` formats, content is placed at the canonical URL (`/slug.txt`, `/slug.md`, `/slug.ansi`) with backwards-compatible redirects at `/slug/index.\u003cext\u003e` and `/slug/index.\u003cext\u003e/index.html`. This supports standard web txt files like `robots.txt`, `llms.txt`, and `humans.txt` while adding an explicit ANSI terminal view.\n\n**Canonical URLs and Alternate Links**: When post formats are enabled, markata-go automatically adds:\n\n- `\u003clink rel=\"canonical\"\u003e` pointing to the post's primary URL (for SEO)\n- `\u003clink rel=\"alternate\"\u003e` for each enabled format:\n  - Markdown: `type=\"text/markdown\"` linking to `/slug.md`\n  - ANSI terminal: `type=\"text/plain\"` linking to `/slug.ansi`\n  - OG Card: `type=\"text/html\"` linking to `og/`\n\n**Visible Format Links**: When alternate formats are enabled, posts and feeds display visible links allowing visitors to access content in their preferred format.\n\nFeed sidebar variant links use the same canonical short URLs (`/slug.md`, `/slug.txt`, `/slug.ansi`) rather than nested `/slug/index.\u003cext\u003e` paths.\nIf a post format is disabled, its sidebar link is omitted.\n\n**Per-post frontmatter overrides**: A post can override any of these format flags in frontmatter with a `post_formats` object. Overrides merge with the site defaults, so omitted keys continue to inherit from `[markata-go.post_formats]`.\n\n```yaml\n---\ntitle: \"One-off terminal post\"\npost_formats:\n  ansi: true\n  og: false\n---\n```\n\nOG card pages automatically include:\n- `\u003clink rel=\"canonical\"\u003e` pointing back to the original post\n- `\u003cmeta name=\"robots\" content=\"noindex, nofollow\"\u003e` to prevent search engine indexing\n\nSee the [[post-formats|Post Output Formats Guide]] for detailed usage including social image generation and content negotiation.\n\n### LLM-Friendly Site Index (`[markata-go.llms_txt]`)\n\nFull-site builds generate a concise `/llms.txt` Markdown index by default.\nIt lists the site overview, up to 30 public documentation/recent pages, and\na sitemap link if available. Private, draft, unpublished, skipped, and\n`noindex` posts are excluded. Links prefer the generated `.md` version\nof pages when enabled and fall back to HTML URLs otherwise.\n\n```toml\n[markata-go.llms_txt]\nenabled = true\nmax_pages = 30\n```\n\n- `enabled`: defaults to `true`; set `false` to disable the generator.\n- `max_pages`: defaults to `30`, clamped to `1-100` (invalid values\n  use the default).\n- A hand-authored `llms.md` (published with text format), project\n  `static/llms.txt`, or unmanaged `output/llms.txt` takes precedence.\n- A private `llms.md` does not suppress the public generated index. Authored\n  sources remain authoritative when automatic generation is disabled.\n- Absolute links use the configured site URL only when it has no credentials,\n  query, or fragment; otherwise the index uses relative links.\n- Single-page builds never generate this site-wide index.\n- `llms.txt` is a content guide, **not** a robots/training permission policy.\n\nSee [Standard Web Txt Files](/docs/guides/standard-txt-files/).\n\n### Well-Known Files (`[markata-go.well_known]`)\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `true` | Enable auto-generated `.well-known` endpoints |\n| `auto_generate` | array | `[...]` | Entries to auto-generate from site metadata |\n| `ssh_fingerprint` | string | `\"\"` | SSH fingerprint for `/.well-known/sshfp` |\n| `keybase_username` | string | `\"\"` | Keybase username for `/.well-known/keybase.txt` |\n\n```toml\n[markata-go.well_known]\nenabled = true\nauto_generate = [\"host-meta\", \"host-meta.json\", \"webfinger\", \"nodeinfo\", \"time\", \"links\"]\n\n# Optional entries requiring config\nssh_fingerprint = \"SHA256:abcdef...\"\nkeybase_username = \"username\"\n```\n\n**Generated files:**\n- `/.well-known/host-meta`\n- `/.well-known/host-meta.json`\n- `/.well-known/webfinger`\n- `/.well-known/nodeinfo` and `/nodeinfo/2.0`\n- `/.well-known/time`\n- `/.well-known/links` (grouped outbound links by target domain; enabled by default)\n- `/.well-known/internal-links` (grouped internal links by target URL; enabled by default)\n- `/external-links/` (HTML view of the same grouped outbound link data)\n- `/internal-links/` (HTML view of grouped internal link destinations)\n- `/.well-known/sshfp` (when `ssh_fingerprint` is set)\n- `/.well-known/keybase.txt` (when `keybase_username` is set)\n\nTemplates live under `templates/well-known/` plus `templates/external-links.html` and `templates/internal-links.html` for the HTML page overrides.\n\n### Content Templates (`[content_templates]`)\n\nContent templates configure the `markata-go new` command, controlling default frontmatter and output directories for different content types.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `directory` | string | `\"content-templates\"` | Directory for user-defined template files |\n| `placement` | object | `{post:\"pages/post\",page:\"pages\",docs:\"docs\"}` | Map of template names to output directories |\n| `templates` | array | `[]` | Custom template definitions |\n\n```toml\n[content_templates]\ndirectory = \"content-templates\"\n\n# Override default directory placement\n[content_templates.placement]\npost = \"blog\"          # markata-go new -t post creates in blog/\npage = \"pages\"\ndocs = \"documentation\"\n\n# Define custom templates\n[[content_templates.templates]]\nname = \"tutorial\"\ndirectory = \"tutorials\"\nbody = \"## Prerequisites\\n\\n## Steps\\n\\n## Summary\"\n\n[content_templates.templates.frontmatter]\ntemplateKey = \"tutorial\"\nseries = \"\"\n\n[[content_templates.templates]]\nname = \"recipe\"\ndirectory = \"recipes\"\nbody = \"## Ingredients\\n\\n## Instructions\"\n\n[content_templates.templates.frontmatter]\ntemplateKey = \"recipe\"\nprep_time = \"\"\ncook_time = \"\"\nservings = 4\n```\n\n**File-based Templates:**\n\nCreate markdown files in the `content-templates/` directory (or your configured directory):\n\n```markdown\n---\n# content-templates/changelog.md\nstarter:\n  name: changelog\n  description: Record notable changes for a release.\n  aliases:\n    - release-notes\ntemplateKey: changelog\n_directory: changelogs\ntitle: \"{{title}}\"\ndate: \"{{date}}\"\npublished: false\nversion: \"\"\n---\n\n## Added\n\n## Changed\n\n## Fixed\n```\n\nThe `_directory` field in frontmatter specifies the output directory and is removed from generated content.\n\nMarkdown starters are shared by `markata-go new`, its interactive TUI, and the\nweb workbench. Optional `starter.name`, `starter.description`, and\n`starter.aliases` fields describe the starter without consuming page\nfrontmatter keys. Supported variables are `{{title}}`, `{{slug}}`, `{{date}}`, and\n`{{datetime}}`. See [Shared Markdown content starters](content-starters.md)\nfor the full format and examples.\n\n**Usage:**\n\n```bash\nmarkata-go new --list                     # List all templates\nmarkata-go new \"My Post\"                  # Use default (post) template\nmarkata-go new \"Tutorial\" -t tutorial     # Use custom template\nmarkata-go new \"Recipe\" -t recipe --dir custom  # Override directory\n```\n\nBuilt-in content templates are listed with aliases in `markata-go new --list`, such as `note (aka: ping, thought, status, tweet)`. Built-in aliases are also accepted directly with `--template`.\n\nGenerated files include frontmatter plus the configured body template, but they do not include a starter `# H1` heading. markata-go already renders the page title from frontmatter, so starter content should begin with body text or `##` sections.\n\nSee [[cli-reference|CLI Reference]] for complete `new` command documentation.\n\n### Search Settings (`[search]`)\n\nSite-wide search is enabled by default using [Pagefind](https://pagefind.app/). You can also use the built-in bleve search engine for a self-hosted API.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `true` | Enable/disable search |\n| `backend` | string | `\"pagefind\"` | Search engine: `\"pagefind\"` or `\"bleve\"` |\n| `endpoint` | string | `\"/api/search\"` | API endpoint path for bleve search |\n| `position` | string | `\"navbar\"` | Where to show search: `navbar`, `sidebar`, `footer`, `custom` |\n| `placeholder` | string | `\"Search...\"` | Search input placeholder text |\n| `show_images` | bool | `true` | Show thumbnails in search results |\n| `excerpt_length` | int | `200` | Characters for result excerpts |\n\n```toml\n[search]\nenabled = true\nbackend = \"pagefind\"        # or \"bleve\" for self-hosted API\nendpoint = \"/api/search\"    # API path (bleve only)\nposition = \"navbar\"\nplaceholder = \"Search...\"\nshow_images = true\nexcerpt_length = 200\n\n# Pagefind CLI options\n[search.pagefind]\nbundle_dir = \"_pagefind\"    # Output directory for search index\nroot_selector = \"main\"       # CSS selector for searchable content\nexclude_selectors = [\".no-search\", \"nav\", \"footer\"]  # Elements to exclude\n\n# Bleve search API options\n[search.bleve]\nfuzzy = false               # Default fuzzy matching\nlimit = 20                  # Default result limit\nmax_limit = 100             # Maximum allowed limit\ncors_origins = [\"*\"]        # Allowed CORS origins\n```\n\n**Privacy:** Private posts are searchable by public metadata such as title, description, tags, and date. Their body content and media are never included in the search index or exposed by the search API.\n\n**Dev mode:** During `markata-go serve`, the bleve search API is automatically mounted at the configured endpoint. A dev-only script injects `window.__markataSearchEndpoint` so the frontend can use the local API — this is never included in production builds.\n\n**Requirements:** Pagefind CLI must be installed. Install the standalone binary from [GitHub releases](https://github.com/Pagefind/pagefind/releases), or enable `auto_install = true` under `[search.pagefind]` to let markata-go download it automatically. If not installed, search is skipped with a warning.\n\nSee the [[search|Search Guide]] for detailed usage and customization.\n\n### Feed Defaults (`[markata-go.feed_defaults]`)\n\nSet `views = [\"default\", \"simple\", \"calendar\"]` to choose the available HTML\npresentations. All three are enabled by default. Per-feed `views` replaces this\nlist; omitted values inherit it. Every explicit list must include `default`,\nand an empty list or unknown name is invalid. Disabling `simple` suppresses its\nHTML output even when `formats.simple_html` is true; disabling `calendar` removes\nits controls and assets. Syndication formats are independent.\nSee [Feed Views](./feed-views.md) for examples.\n\nThe implicit [Pins feed](./pins.md) uses 100 items per page and manual pagination.\nTo change those values, define a feed with `slug = \"pins\"`; its configuration\ntakes precedence over the built-in Pins definition.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `items_per_page` | int | `10` | Default items per page |\n| `orphan_threshold` | int | `3` | Minimum items for a separate page |\n\n```toml\n[markata-go.feed_defaults]\nitems_per_page = 10\norphan_threshold = 3\n\n[markata-go.feed_defaults.formats]\nhtml = true\nsimple_html = true\nrss = true\natom = true\njson = true\nsitemap = true\nmarkdown = false\ntext = false\n\n[markata-go.feed_defaults.templates]\nhtml = \"feed.html\"\nsimple_html = \"simple-feed.html\"\nrss = \"feed.xml\"\natom = \"atom.xml\"\njson = \"feed.json\"\ncard = \"card.html\"\nsitemap = \"sitemap.xml\"\n\n[markata-go.feed_defaults.syndication]\nmax_items = 20\ninclude_content = true\nsite_archive_disabled = false\nfeed_archives_disabled = false\n\n[markata-go.feeds_page]\nenabled = true\ntitle = \"Feeds\"\ndescription = \"Browse the public feeds available on this site.\"\ntemplate = \"feeds.html\"\nslug_prefix = \"feeds\"\n```\n\n### Feed Format Options\n\n| Format | Output Path | Description |\n|--------|-------------|-------------|\n| `html` | `/{slug}/index.html` | Paginated HTML pages |\n| `simple_html` | `/{slug}/simple/index.html` | Compact HTML list |\n| `rss` | `/{slug}/rss.xml` | RSS 2.0 feed |\n| `atom` | `/{slug}/atom.xml` | Atom 1.0 feed |\n| `json` | `/{slug}/feed.json` | JSON Feed |\n| `sitemap` | `/{slug}/sitemap.xml` | Sitemap XML |\n| `markdown` | `/{slug}.md` | Markdown output |\n| `text` | `/{slug}.txt` | Plain text output |\n\n### Feed Configuration (`[[markata-go.feeds]]`)\n\nEach feed is defined as an array item. The default config ships with an archive feed at `/archive/`.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `slug` | string | `\"\"` | URL-safe identifier (empty = root index) |\n| `title` | string | `\"\"` | Feed title |\n| `description` | string | `\"\"` | Feed description |\n| `filter` | string | `\"\"` | Filter expression for selecting posts |\n| `sort` | string | `\"\"` | Field to sort posts by |\n| `reverse` | bool | `false` | Reverse sort order |\n| `items_per_page` | int | inherited | Items per page (inherits from defaults) |\n| `orphan_threshold` | int | inherited | Orphan threshold (inherits from defaults) |\n| `limit` | int | `0` | Hard cap on total items (0 = unlimited) |\n| `offset` | int | `0` | Skip the first N items (0 = none) |\n| `formats` | object | inherited | Output formats (inherits from defaults) |\n| `templates` | object | inherited | Templates (inherits from defaults) |\n| `archive_disabled` | bool | `false` | Disable `/{slug}/archive/*` syndication endpoints for this feed |\n\nSet an individual feed format to `false` to disable it while inheriting the\nother formats from `[markata-go.feed_defaults.formats]`. Omitted format keys\nkeep their default values in TOML, YAML, and JSON configs. For example:\n\n```toml\n[[markata-go.feeds]]\nslug = \"draft\"\n[markata-go.feeds.formats]\nsitemap = false\n```\n\n```toml\n# Main blog feed\n[[markata-go.feeds]]\nslug = \"blog\"\ntitle = \"Blog\"\ndescription = \"All blog posts\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 10\n\n[markata-go.feeds.formats]\nhtml = true\nrss = true\natom = true\njson = true\n\n# Home page feed (empty slug = root index.html)\n[[markata-go.feeds]]\nslug = \"\"\ntitle = \"Latest Posts\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 5\n\n[markata-go.feeds.formats]\nhtml = true\n\n# Featured posts feed\n[[markata-go.feeds]]\nslug = \"featured\"\ntitle = \"Featured\"\ndescription = \"Featured posts\"\nfilter = \"published == True and featured == True\"\nsort = \"date\"\nreverse = true\n```\n\n### Series Settings (`[markata-go.series]`)\n\nSeries automatically generate ordered feed pages and navigation from `series` frontmatter.\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `slug_prefix` | string | `\"series\"` | URL prefix for series feeds (e.g., `/series/\u003cname\u003e/`) |\n| `auto_sidebar` | bool | `true` | Auto-enable the series sidebar on series posts |\n| `defaults` | object | see below | Default settings for all series feeds |\n| `overrides` | map[string]object | `{}` | Per-series overrides (keyed by series slug or name) |\n\n```toml\n[markata-go.series]\nslug_prefix = \"series\"\nauto_sidebar = true\n\n[markata-go.series.defaults]\nitems_per_page = 0\nsidebar = true\n\n[markata-go.series.defaults.formats]\nhtml = true\nsimple_html = true\nrss = true\natom = true\njson = true\nsitemap = true\n\n[markata-go.series.overrides.\"building-a-rest-api\"]\ntitle = \"Building a REST API with Go\"\ndescription = \"A complete guide from zero to production\"\n\n[markata-go.series.overrides.\"building-a-rest-api\".formats]\nmarkdown = true\n```\n\n## Environment Variable Overrides\n\nAll configuration options can be overridden via environment variables using the `MARKATA_GO_` prefix.\n\n### Variable Naming Convention\n\nEnvironment variables follow the pattern: `MARKATA_GO_{SECTION}_{KEY}`\n\n- Keys are UPPERCASE\n- Underscores separate nested keys\n- Section names use underscores\n\n### Examples\n\n```bash\n# Core settings\nexport MARKATA_GO_OUTPUT_DIR=dist\nexport MARKATA_GO_URL=https://example.com\nexport MARKATA_GO_TITLE=\"My Site\"\nexport MARKATA_GO_CONCURRENCY=4\n\n# Glob settings\nexport MARKATA_GO_GLOB_PATTERNS=\"posts/**/*.md,pages/*.md\"\nexport MARKATA_GO_GLOB_USE_GITIGNORE=true\n\n# Markdown settings\nexport MARKATA_GO_MARKDOWN_EXTENSIONS=\"tables,strikethrough\"\n\n# Feed defaults\nexport MARKATA_GO_FEED_DEFAULTS_ITEMS_PER_PAGE=20\nexport MARKATA_GO_FEEDS_DEFAULTS_ORPHAN_THRESHOLD=5\nexport MARKATA_GO_FEED_DEFAULTS_FORMATS_HTML=true\nexport MARKATA_GO_FEED_DEFAULTS_FORMATS_RSS=true\nexport MARKATA_GO_FEED_DEFAULTS_SYNDICATION_MAX_ITEMS=50\nexport MARKATA_GO_FEED_DEFAULTS_SYNDICATION_INCLUDE_CONTENT=false\n\n# Blogroll settings\nexport MARKATA_GO_BLOGROLL_ENABLED=false\n```\n\n### Value Formats\n\n| Type | Format | Examples |\n|------|--------|----------|\n| String | Plain text | `MARKATA_GO_TITLE=\"My Site\"` |\n| Integer | Numeric | `MARKATA_GO_CONCURRENCY=4` |\n| Boolean | `true`/`false`/`1`/`0`/`yes`/`no` | `MARKATA_GO_GLOB_USE_GITIGNORE=true` |\n| List | Comma-separated | `MARKATA_GO_HOOKS=\"glob,load,render\"` |\n\n### Build with Environment Overrides\n\n```bash\n# Override output directory for a single build\nMARKATA_GO_OUTPUT_DIR=dist markata-go build\n\n# Build for staging environment\nMARKATA_GO_URL=https://staging.example.com markata-go build\n\n# Increase concurrency\nMARKATA_GO_CONCURRENCY=8 markata-go build\n```\n\n## Multiple Config Files (Config Merging)\n\nYou can merge multiple configuration files together using the `--merge-config` (or `-m`) flag. This is useful for:\n\n- **Environment-specific overrides** (e.g., `markata-go.local.toml`)\n- **Fast build configurations** (e.g., `fast-markata-go.toml`)\n- **Temporary overrides** without modifying your main config\n\n### How Config Merging Works\n\nConfigs are merged in order, with later configs taking precedence:\n\n1. **Defaults** - Built-in default values\n2. **Base config** - Your main config file (`markata-go.toml`)\n3. **Merge configs** - Each `--merge-config` file, in order\n4. **Environment variables** - `MARKATA_GO_*` vars (highest precedence)\n\n### Example: Fast Build Config\n\nCreate a `fast-markata-go.toml` for quick development builds:\n\n```toml\n[markata-go]\n# Only process specific files for fast builds\nglob_patterns = [\"posts/draft-*.md\"]\n\n[markata-go.blogroll]\n# Disable blogroll for faster builds\nenabled = false\n```\n\nUse it with:\n\n```bash\n# Merge fast config with base config\nmarkata-go build --merge-config fast-markata-go.toml\n\n# Or use the short flag\nmarkata-go build -m fast-markata-go.toml\n```\n\n### Example: Multiple Merge Configs\n\nYou can specify multiple merge configs. They are applied in order:\n\n```bash\n# Base config + local overrides + debug settings\nmarkata-go build -m markata-go.local.toml -m debug.toml\n```\n\n### Example: No Base Config\n\nYou can use merge configs without a base config (uses defaults as base):\n\n```bash\n# Just use defaults + your override file\nmarkata-go build -c \"\" -m fast-markata-go.toml\n```\n\n### Common Merge Config Patterns\n\n**Local Development** (`markata-go.local.toml` - add to `.gitignore`):\n\n```toml\n[markata-go]\nurl = \"http://localhost:8080\"\nconcurrency = 2\n\n[markata-go.blogroll]\nenabled = false\n```\n\n**Fast Build** (`fast.toml`):\n\n```toml\n[markata-go]\n# Limit to specific files\nglob_patterns = [\"posts/current/**/*.md\"]\n\n[markata-go.blogroll]\nenabled = false\n```\n\n**Note on Boolean Fields**: Merging `enabled = false` into a base config with `enabled = true` requires environment variables. Use `MARKATA_GO_BLOGROLL_ENABLED=false` instead.\n\n## Configuration CLI Commands\n\n### `config show`\n\nDisplay the resolved configuration:\n\n```bash\n# Same as `markata-go config show`\nmarkata-go config\n\n# Show as YAML (default)\nmarkata-go config show\n\n# Show as JSON\nmarkata-go config show --json\n\n# Show as TOML\nmarkata-go config show --toml\n\n# Include merged override files\nmarkata-go config show -m fast-markata-go.toml\n```\n\n`config show` uses the same config resolution path as `build` and `serve`, including any `--merge-config` overrides.\n\nYAML output includes source comments by default. Comments identify whether an\neffective value came from a config file (with its path and line), an environment\nvariable, a CLI override, or a default. Use `--no-annotate` for plain YAML;\nJSON and TOML output remain unannotated and parseable. In an interactive\nterminal, YAML is syntax highlighted using the configured palette.\n\nDefault and file-backed comments include a copyable `markata-go config set\n\u003ckey\u003e \u003cvalue\u003e` command so you can override a setting without locating its\nconfiguration file manually.\n\nConflicting format requests such as `markata-go config show --json --toml` fail with usage exit code `2`.\n\n### `config get`\n\nGet a specific configuration value:\n\n```bash\n# Get top-level value\nmarkata-go config get output_dir\n\n# Get nested value with dot notation\nmarkata-go config get glob.patterns\nmarkata-go config get feed_defaults.items_per_page\nmarkata-go config get feed_defaults.formats.html\n```\n\n### `config set`\n\nUpdate a specific configuration value in-place:\n\n```bash\n# Set top-level value\nmarkata-go config set url \"https://example.com\"\n\n# Set nested value\nmarkata-go config set glob.patterns '[\"posts/**/*.md\", \"pages/**/*.md\"]'\n```\n\n`config set` preserves file permissions for TOML, YAML, and JSON files. In CGO-enabled builds, TOML/YAML edits use tree-sitter byte ranges so existing comments, ordering, and formatting stay intact.\n\n### `config validate`\n\nValidate the configuration file:\n\n```bash\n# Validate default config file\nmarkata-go config validate\n\n# Validate specific config file\nmarkata-go config validate -c custom.toml\n\n# Validate with merged overrides\nmarkata-go config validate -m fast-markata-go.toml\n```\n\n`config validate` uses the same merged configuration resolution as `build` and `serve`.\n\nExample output:\n\n```\n✓ Configuration is valid\n```\n\nOr with errors:\n\n```\n✗ Configuration errors:\n  - url: URL must include a scheme (e.g., https://)\n  - concurrency: must be \u003e= 0 (0 means auto-detect)\n  - glob.patterns: no glob patterns specified, no files will be processed (warning)\n```\n\n### `config init`\n\nGenerate a starter configuration file:\n\n```bash\n# Create markata-go.toml with defaults\nmarkata-go config init\n\n# Create YAML config\nmarkata-go config init site.yaml\n\n# Overwrite existing file\nmarkata-go config init --force\n```\n\n## Configuration Merging\n\nmarkata-go merges configuration from multiple sources in order of increasing precedence:\n\n```\n┌─────────────────────────────────────────────────────────────────────┐\n│                    CONFIGURATION RESOLUTION                          │\n├─────────────────────────────────────────────────────────────────────┤\n│  1. Built-in defaults                                                │\n│  2. User config file (~/.config/markata-go/config.toml)             │\n│  3. Local config file (./markata-go.toml)                           │\n│  4. Environment variables (MARKATA_GO_*)                            │\n│  5. CLI arguments (--output-dir, --config, etc.)                    │\n│                                                                      │\n│  Later sources OVERRIDE earlier sources                              │\n│  Nested objects are DEEP MERGED                                     │\n│  Arrays REPLACE (not append)                                        │\n└─────────────────────────────────────────────────────────────────────┘\n```\n\n### Merge Behavior\n\n**Scalar values:** Later wins\n\n```toml\n# User config: output_dir = \"dist\"\n# Local config: output_dir = \"public\"\n# Result: output_dir = \"public\"\n```\n\n**Objects:** Deep merge\n\n```toml\n# User config:\n[markata-go.feed_defaults.formats]\nhtml = true\nrss = true\n\n# Local config:\n[markata-go.feed_defaults.formats]\natom = true\n\n# Result:\n# html = true   (from user)\n# rss = true    (from user)\n# atom = true   (from local)\n```\n\n**Arrays:** Replace (not append)\n\n```toml\n# User config: patterns = [\"**/*.md\"]\n# Local config: patterns = [\"posts/*.md\", \"pages/*.md\"]\n# Result: patterns = [\"posts/*.md\", \"pages/*.md\"]\n```\n\n## Default Values\n\nWhen no configuration is provided, markata-go uses these defaults:\n\n```toml\n[markata-go]\noutput_dir = \"output\"\ntemplates_dir = \"templates\"\nassets_dir = \"static\"\nhooks = [\"default\"]\nconcurrency = 0  # Auto-detect based on CPU cores\n\n[markata-go.glob]\npatterns = [\"pages/**/*.md\", \"posts/**/*.md\"]\nuse_gitignore = true\n\n[markata-go.feed_defaults]\nitems_per_page = 10\norphan_threshold = 3\n\n[markata-go.feed_defaults.formats]\nhtml = true\nrss = true\natom = false\njson = false\nmarkdown = false\ntext = false\n```\n\n## Authors Configuration\n\nThe authors system lets you define author profiles in your configuration and reference them from post frontmatter. This enables multi-author support where each post can have one or more authors with rich metadata.\n\n### Basic Setup\n\n```toml\n[markata-go.authors]\ngenerate_pages = false    # Generate individual author profile pages\nfeeds_enabled = false     # Generate per-author feeds\n\n[markata-go.authors.authors.jane]\nname = \"Jane Doe\"\nrole = \"author\"\nurl = \"https://janedoe.com\"\nactive = true\ndefault = true            # Assigned to posts with no explicit author\n\n[markata-go.authors.authors.bob]\nname = \"Bob Smith\"\nrole = \"editor\"\nactive = true\n```\n\n### Author Fields\n\nEach author entry supports these fields:\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `name` | string | **required** | Display name |\n| `bio` | string | - | Short biography |\n| `email` | string | - | Contact email (must contain `@` if set) |\n| `avatar` | string | - | Avatar image URL or path |\n| `url` | string | - | Personal website URL |\n| `role` | string | - | Role label (e.g., \"author\", \"editor\") |\n| `guest` | bool | `false` | Whether this is a guest author |\n| `active` | bool | `false` | Whether the author is currently active |\n| `default` | bool | `false` | Default author for posts without explicit authors |\n| `contribution` | string | - | Free-text contribution description |\n| `contributions` | []string | `[]` | CReDiT taxonomy roles |\n\n### Referencing Authors in Posts\n\nUse author IDs in post frontmatter:\n\n```yaml\n---\ntitle: \"Our Collaborative Post\"\nauthors:\n  - jane\n  - bob\n---\n```\n\nThe legacy single-author field is also supported:\n\n```yaml\n---\ntitle: \"Solo Post\"\nauthor: \"Jane Doe\"\n---\n```\n\n**Priority:** `authors` array takes precedence over `author` string. If neither is specified, the default author (the one with `default = true`) is assigned automatically.\n\n### Author Configuration Options\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `generate_pages` | bool | `false` | Generate individual author profile pages |\n| `url_pattern` | string | `\"\"` | URL pattern for author pages (e.g., `/authors/{id}/`) |\n| `feeds_enabled` | bool | `false` | Generate per-author feeds |\n\n### Full Author Example\n\n```toml\n[markata-go.authors]\ngenerate_pages = false\nfeeds_enabled = false\n\n[markata-go.authors.authors.waylon]\nname = \"Waylon Walker\"\nbio = \"Python and Go developer, blogger\"\nemail = \"waylon@example.com\"\navatar = \"/images/waylon.jpg\"\nurl = \"https://waylonwalker.com\"\nrole = \"author\"\nactive = true\ndefault = true\ncontributions = [\"Writing\", \"Original Draft\"]\n\n[markata-go.authors.authors.guest]\nname = \"Guest Writer\"\nrole = \"editor\"\nguest = true\nactive = true\ncontribution = \"Technical review\"\n```\n\n**Related:** See the [Frontmatter Guide](frontmatter.md) for details on the `authors` and `author` fields.\n\n## Encryption Settings\n\nEncryption protects private post content with AES-256-GCM client-side encryption. It is **enabled by default**.\n\n```toml\n[encryption]\nenabled = true                             # default: true\ndefault_key = \"default\"                    # default: \"default\"\ndecryption_hint = \"DM me for access\"       # optional hint shown to visitors\n\n[encryption.private_tags]\ndiary = \"personal\"                         # tag \"diary\" auto-encrypts with key \"personal\"\ndraft-ideas = \"default\"                    # tag \"draft-ideas\" encrypts with default key\n```\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `enabled` | bool | `true` | Enable/disable encryption processing |\n| `default_key` | string | `\"default\"` | Key name when post doesn't specify one |\n| `decryption_hint` | string | `\"\"` | Help text shown next to password prompt |\n| `private_tags` | map | `{}` | Maps tag names to encryption key names |\n| `enforce_strength` | bool | `true` | Require key passwords to meet the strength policy |\n| `min_estimated_crack_time` | string | `\"10y\"` | Minimum estimated crack time per key (supports `y`, `d`, `h`, `m`, `s` units) |\n| `min_password_length` | int | `14` | Minimum password length enforced for every encryption key |\n\nEncryption keys are loaded from environment variables:\n\n```bash\nMARKATA_GO_ENCRYPTION_KEY_DEFAULT=my-password\nMARKATA_GO_ENCRYPTION_KEY_PERSONAL=another-password\n```\n\nYou can also override the enforcement policy:\n\n```bash\nMARKATA_GO_ENCRYPTION_ENFORCE_STRENGTH=false\nMARKATA_GO_ENCRYPTION_MIN_ESTIMATED_CRACK_TIME=5d\nMARKATA_GO_ENCRYPTION_MIN_PASSWORD_LENGTH=20\n```\n\n**Related:** See the [Encryption Guide](encryption.md) for complete documentation on making posts private.\n\n---\n\n## Complete Configuration Example\n\nHere's a comprehensive example showing all available options:\n\n```toml\n[markata-go]\n# Site metadata\ntitle = \"My Awesome Blog\"\ndescription = \"A blog about technology and life\"\nurl = \"https://example.com\"\nauthor = \"Jane Doe\"\nlanguage = \"en\"\nauthor_url = \"https://example.com/about/\"\nmanaging_editor = \"editor@example.com (Jane Doe)\"\nwebmaster = \"webmaster@example.com (Jane Doe)\"\ncopyright = \"Copyright 2026 Jane Doe\"\n\n# Directory configuration\noutput_dir = \"public\"\ntemplates_dir = \"templates\"\nassets_dir = \"static\"\n\n# Plugin configuration\nhooks = [\"default\"]\ndisabled_hooks = []\n\n# Performance\nconcurrency = 0  # Auto-detect\n\n# Content discovery\n[markata-go.glob]\npatterns = [\n    \"posts/**/*.md\",\n    \"pages/*.md\",\n    \"docs/**/*.md\"\n]\nuse_gitignore = true\n\n# Markdown processing\n[markata-go.markdown]\nextensions = [\"tables\", \"strikethrough\", \"autolinks\", \"tasklist\"]\n\n# Feed defaults (inherited by all feeds)\n[markata-go.feed_defaults]\nitems_per_page = 10\norphan_threshold = 3\n\n[markata-go.feed_defaults.formats]\nhtml = true\nrss = true\natom = false\njson = false\n\n[markata-go.feed_defaults.templates]\nhtml = \"feed.html\"\nrss = \"rss.xml\"\natom = \"atom.xml\"\njson = \"feed.json\"\ncard = \"partials/card.html\"\n\n[markata-go.feed_defaults.syndication]\nmax_items = 20\ninclude_content = true\n\n# Home page feed\n[[markata-go.feeds]]\nslug = \"\"\ntitle = \"Latest Posts\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 5\n\n[markata-go.feeds.formats]\nhtml = true\n\n# Blog archive\n[[markata-go.feeds]]\nslug = \"blog\"\ntitle = \"Blog\"\ndescription = \"All blog posts\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\n\n[markata-go.feeds.formats]\nhtml = true\nrss = true\natom = true\njson = true\n\n# Featured posts\n[[markata-go.feeds]]\nslug = \"featured\"\ntitle = \"Featured Posts\"\ndescription = \"Hand-picked featured content\"\nfilter = \"published == True and featured == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 6\n\n[markata-go.feeds.formats]\nhtml = true\nrss = true\n\n# Authors\n[markata-go.authors]\ngenerate_pages = false\nfeeds_enabled = false\n\n[markata-go.authors.authors.jane]\nname = \"Jane Doe\"\nrole = \"author\"\nurl = \"https://janedoe.com\"\nactive = true\ndefault = true\n\n# CSS minification\n[markata-go.css_minify]\nenabled = true\nexclude = []\npreserve_comments = [\"Copyright\"]\n\n# JS minification\n[markata-go.js_minify]\nenabled = true\nexclude = []\n```\n\n## Common Configuration Patterns\n\n### Minimal Blog\n\n```toml\n[markata-go]\ntitle = \"My Blog\"\nurl = \"https://myblog.com\"\noutput_dir = \"public\"\n\n[markata-go.glob]\npatterns = [\"posts/**/*.md\"]\n\n[[markata-go.feeds]]\nslug = \"blog\"\ntitle = \"Blog\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\n\n[markata-go.feeds.formats]\nhtml = true\nrss = true\n```\n\n### Documentation Site\n\n```toml\n[markata-go]\ntitle = \"Project Docs\"\nurl = \"https://docs.example.com\"\noutput_dir = \"site\"\n\n[markata-go.glob]\npatterns = [\"docs/**/*.md\"]\n\n[markata-go.markdown]\nextensions = [\"tables\", \"tasklist\"]\n\n[[markata-go.feeds]]\nslug = \"\"\ntitle = \"Documentation\"\nfilter = \"true\"\nsort = \"title\"\n\n[markata-go.feeds.formats]\nhtml = true\n```\n\n### Multi-Section Site\n\n```toml\n[markata-go]\ntitle = \"My Site\"\nurl = \"https://example.com\"\noutput_dir = \"public\"\n\n[markata-go.glob]\npatterns = [\"content/**/*.md\"]\n\n# Blog section\n[[markata-go.feeds]]\nslug = \"blog\"\ntitle = \"Blog\"\nfilter = \"'blog' in tags\"\nsort = \"date\"\nreverse = true\n\n[markata-go.feeds.formats]\nhtml = true\nrss = true\n\n# Tutorials section\n[[markata-go.feeds]]\nslug = \"tutorials\"\ntitle = \"Tutorials\"\nfilter = \"'tutorial' in tags\"\nsort = \"date\"\nreverse = true\n\n[markata-go.feeds.formats]\nhtml = true\nrss = true\n\n# Projects section\n[[markata-go.feeds]]\nslug = \"projects\"\ntitle = \"Projects\"\nfilter = \"'project' in tags\"\nsort = \"title\"\n\n[markata-go.feeds.formats]\nhtml = true\n```\n\n### CI/CD Deployment\n\n```toml\n[markata-go]\ntitle = \"My Site\"\n# URL set via environment variable in CI\noutput_dir = \"dist\"\n\n[markata-go.glob]\npatterns = [\"content/**/*.md\"]\n```\n\nThen in CI:\n\n```bash\nMARKATA_GO_URL=https://example.com markata-go build\n```\n\n## CSS and JS Minification\n\nmarkata-go automatically minifies CSS and JS files in the output directory to reduce file sizes.\n\n### CSS Minification\n\n```toml\n[markata-go.css_minify]\nenabled = true                      # Enable CSS minification (default: true)\nexclude = [\"variables.css\"]         # Files to skip\npreserve_comments = [\"Copyright\"]   # Comment substrings to preserve\n```\n\n| Option | Default | Description |\n|--------|---------|-------------|\n| `enabled` | `true` | Enable/disable CSS minification |\n| `exclude` | `[]` | File names or glob patterns to skip (e.g., `\"vendor-*.css\"`) |\n| `preserve_comments` | `[]` | Substrings that identify comments to keep |\n\n### JS Minification\n\n```toml\n[markata-go.js_minify]\nenabled = true                      # Enable JS minification (default: true)\nexclude = [\"pagefind-ui.js\"]        # Files to skip\n```\n\n| Option | Default | Description |\n|--------|---------|-------------|\n| `enabled` | `true` | Enable/disable JS minification |\n| `exclude` | `[]` | File names or glob patterns to skip (e.g., `\"vendor-*.js\"`) |\n\nFiles with `.min.js` extension are automatically skipped (already minified).\n\nBoth plugins run at the very end of the Write stage (`PriorityLast`), after all CSS/JS-generating plugins have finished.\n\nBoth plugins memoize exact current-input minification results in the private\n`\u003ccontent_dir\u003e/.markata/asset-minify/v1/` cache. A nonempty top-level\n`[markata-go] cache_dir` override is used as supplied, independently of whether\nthe build cache is enabled. Keep the cache outside published output; unsafe\nlocations warn and disable reuse. CSS `preserve_comments` changes invalidate\nthe transform recipe; changed recipes always minify current stage-input bytes.\nComments already removed require regeneration from authoritative source, not\nrecovery from a historical cache snapshot.\nReuse requires the exact transform input and matching recipe, never a prior\noutput or retry digest. Hits still publish atomically with normal `0644`\npermissions (except empty JavaScript); repeated retained CSS output may need\nfresh transformations because comment handling can be non-idempotent.\nFast mode, exclusions, disabled plugins, and `_pagefind` remain skipped.\nSee [Persistent CSS and JavaScript Minification](performance.md#persistent-css-and-javascript-minification)\nfor recovery, upgrade, privacy, and measurement guidance.\n\n---\n\n## Validation\n\nmarkata-go validates configuration on load and can report both errors and warnings:\n\n**Errors** (prevent build):\n- Invalid URL format (missing scheme or host)\n- Negative `items_per_page` or `orphan_threshold`\n- Negative `concurrency`\n\n**Warnings** (build continues):\n- Empty glob patterns (no files will be processed)\n- Feed with no output formats enabled\n\nRun validation explicitly:\n\n```bash\nmarkata-go config validate\n```\n\n## See Also\n\n- [Getting Started](/docs/getting-started/) - Quick start guide\n- [Themes Guide](/docs/guides/themes/) - Theme and palette customization\n- [Feeds Guide](/docs/guides/feeds/) - Detailed feed configuration\n- [Blogroll Guide](/docs/guides/blogroll/) - RSS reader and blogroll setup\n- [Templates Guide](/docs/guides/templates/) - Template configuration and usage\n- [Sidebars Guide](/docs/guides/sidebars/) - Sidebar navigation setup\n- [Frontmatter Guide](/docs/guides/frontmatter/) - Post metadata reference\n- [CLI Reference](/docs/reference/cli/) - Command-line interface reference\n- [Plugin Reference](/docs/reference/plugins/) - Plugin configuration and development\n\n\n## Video loading preferences\n\n```toml\n[markata-go.md_video]\nautoplay = false\npreload = \"none\"\ncontrols = true\n```\n\nThese defaults show native controls without automatic video downloads. Setting\n`autoplay = true` preserves author intent in generated markup. Full Quality or\nalready measured fast Auto at page entry can start unrequested authored videos; Save Data and\nconstrained Auto suppress expensive automatic playback. Raw HTML follows its\nown autoplay attribute rather than the Markdown setting. See\n[Adaptive loading](../adaptive-loading/) for user modes and no-JS behavior, and\n[md_video](../plugins/#md_video) for the full plugin configuration.\n",
      "summary": "Complete reference for all markata-go configuration options",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "configuration",
        "reference"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/ci-cd/",
      "url": "https://markata.dev/docs/guides/ci-cd/",
      "title": "CI/CD Deployment Guide",
      "content_html": "\u003cp\u003eAutomate your markata-go site builds and deployments using continuous integration (CI) and continuous deployment (CD) pipelines. This guide covers the most popular platforms and deployment patterns.\u003c/p\u003e\n\u003ch2 id=\"why-ci-cd\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhy CI/CD?\u003c/span\u003e \u003ca href=\"#why-ci-cd\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSetting up automated deployments provides several benefits:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eConsistency\u003c/strong\u003e - Every deployment uses the same build process\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSpeed\u003c/strong\u003e - Sites deploy automatically on every push\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSafety\u003c/strong\u003e - Preview deployments let you review changes before production\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCollaboration\u003c/strong\u003e - Team members can contribute without manual deployment steps\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"platform-guides\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlatform Guides\u003c/span\u003e \u003ca href=\"#platform-guides\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eChoose your CI/CD platform:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePlatform\u003c/th\u003e\n\u003cth\u003eGuide\u003c/th\u003e\n\u003cth\u003eBest For\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eGitHub Actions\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e[[github-actions\u003c/td\u003e\n\u003ctd\u003eGitHub Actions Guide]]\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eGitLab CI\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e[[gitlab-ci\u003c/td\u003e\n\u003ctd\u003eGitLab CI Guide]]\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe basic CI/CD workflow for markata-go is:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eInstall markata-go\u003c/strong\u003e - Download the binary from GitHub releases\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBuild the site\u003c/strong\u003e - Run \u003ccode\u003emarkata-go build --clean\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDeploy\u003c/strong\u003e - Upload the \u003ccode\u003epublic/\u003c/code\u003e directory to your hosting platform\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"installing-markata-go-in-ci\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInstalling markata-go in CI\u003c/span\u003e \u003ca href=\"#installing-markata-go-in-ci\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor container-based CI pipelines, the easiest option is the builder image:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker run --rm \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -v \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$PWD\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e:/site \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -w /site \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ghcr.io/waylonwalker/markata-go-builder:latest \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  sh -c \u003cspan class=\"s1\"\u003e\u0026#39;markata-go build --clean\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf you prefer installing a binary directly, download the pre-built release:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Download latest release (Linux x86_64)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_VERSION\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;v0.1.0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewget -qO- \u003cspan class=\"s2\"\u003e\u0026#34;https://github.com/WaylonWalker/markata-go/releases/download/\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eMARKATA_VERSION\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e/markata-go_\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eMARKATA_VERSION\u003c/span\u003e\u003cspan class=\"p\"\u003e#v\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e_linux_x86_64.tar.gz\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e tar xz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run the build\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./markata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAlternatively, if Go is available in your CI environment:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"setting-the-site-url\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSetting the Site URL\u003c/span\u003e \u003ca href=\"#setting-the-site-url\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor production deployments, always set the site URL via environment variable:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com markata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis ensures all absolute URLs in feeds, sitemaps, and canonical tags are correct.\u003c/p\u003e\n\u003ch2 id=\"deployment-targets\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeployment Targets\u003c/span\u003e \u003ca href=\"#deployment-targets\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go generates static files that can be deployed anywhere. Common targets include:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTarget\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eGuide Section\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eGitHub Pages\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eFree hosting from GitHub\u003c/td\u003e\n\u003ctd\u003e[[github-actions#github-pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eGitLab Pages\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eFree hosting from GitLab\u003c/td\u003e\n\u003ctd\u003e[[gitlab-ci#gitlab-pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eNetlify\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eCDN with deploy previews\u003c/td\u003e\n\u003ctd\u003e[[github-actions#netlify\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eCloudflare Pages\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eFast global CDN\u003c/td\u003e\n\u003ctd\u003e[[github-actions#cloudflare-pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eAWS S3\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eScalable object storage\u003c/td\u003e\n\u003ctd\u003e[[github-actions#aws-s3\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eSelf-hosted\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eYour own server\u003c/td\u003e\n\u003ctd\u003e[[deployment-guide\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"key-concepts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKey Concepts\u003c/span\u003e \u003ca href=\"#key-concepts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"build-artifacts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Artifacts\u003c/span\u003e \u003ca href=\"#build-artifacts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAfter running \u003ccode\u003emarkata-go build\u003c/code\u003e, the \u003ccode\u003epublic/\u003c/code\u003e directory contains your complete static site. This directory should be:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eUploaded as an artifact\u003c/strong\u003e between CI jobs (if using separate build/deploy jobs)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDeployed to your hosting platform\u003c/strong\u003e (GitHub Pages, Netlify, etc.)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"environment-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment Variables\u003c/span\u003e \u003ca href=\"#environment-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go supports environment variable configuration with the \u003ccode\u003eMARKATA_GO_\u003c/code\u003e prefix:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003ePurpose\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_URL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBase URL for the site\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehttps://example.com\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_OUTPUT_DIR\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOutput directory\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edist\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_TITLE\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite title\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eMy Blog\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"caching\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCaching\u003c/span\u003e \u003ca href=\"#caching\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTo speed up CI builds, cache the markata-go binary and any Go modules:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# GitHub Actions example\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/cache@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      ~/go/bin/markata-go\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      ~/go/pkg/mod\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go-${{ runner.os }}-${{ hashFiles(\u0026#39;go.sum\u0026#39;) }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSee the platform-specific guides for detailed caching configurations.\u003c/p\u003e\n\u003ch2 id=\"multi-environment-deployments\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMulti-Environment Deployments\u003c/span\u003e \u003ca href=\"#multi-environment-deployments\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor projects with staging and production environments:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Simplified example\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# Build once, deploy to multiple environments\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edeploy-staging\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub.ref == \u0026#39;refs/heads/develop\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003estaging\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edeploy-production\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub.ref == \u0026#39;refs/heads/main\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eproduction\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSee [[github-actions#multi-environment|Multi-Environment Deployments]] for complete examples.\u003c/p\u003e\n\u003ch2 id=\"preview-deployments\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePreview Deployments\u003c/span\u003e \u003ca href=\"#preview-deployments\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePreview deployments create temporary sites for pull requests, allowing reviewers to see changes before merging:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eNetlify\u003c/strong\u003e - Automatic deploy previews for PRs\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVercel\u003c/strong\u003e - Automatic preview deployments\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGitHub Pages\u003c/strong\u003e - Custom workflow with PR-specific paths\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSee [[github-actions#preview-deployments|Preview Deployments]] for implementation details.\u003c/p\u003e\n\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"common-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Issues\u003c/span\u003e \u003ca href=\"#common-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eBuild fails with \u0026ldquo;command not found\u0026rdquo;\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eEnsure markata-go is installed and in your PATH:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check if installed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewhich markata-go \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Not found\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# If using wget install, run from current directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eAssets have wrong URLs\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eSet \u003ccode\u003eMARKATA_GO_URL\u003c/code\u003e to match your deployment URL:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://username.github.io/repo-name markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBuild succeeds but site is empty\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCheck that your content directory contains Markdown files:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List markdown files\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efind . -name \u003cspan class=\"s2\"\u003e\u0026#34;*.md\u0026#34;\u003c/span\u003e -type f\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eRSS feeds show localhost URLs\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eThe base URL must be set for feeds to work correctly:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"debug-mode\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDebug Mode\u003c/span\u003e \u003ca href=\"#debug-mode\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnable verbose output to diagnose build issues:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"validating-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eValidating Configuration\u003c/span\u003e \u003ca href=\"#validating-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBefore deploying, validate your configuration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config validate\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config show --sources\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext Steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[[github-actions|GitHub Actions Guide]] - Complete GitHub Actions workflows\u003c/li\u003e\n\u003cli\u003e[[gitlab-ci|GitLab CI Guide]] - GitLab CI/CD pipelines\u003c/li\u003e\n\u003cli\u003e[[deployment-guide|Deployment Guide]] - Manual deployment options\u003c/li\u003e\n\u003cli\u003e[[troubleshooting|Troubleshooting]] - Common issues and solutions\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nAutomate your markata-go site builds and deployments using continuous integration (CI) and continuous deployment (CD) pipelines. This guide covers the most popular platforms and deployment patterns.\n\n## Why CI/CD?\n\nSetting up automated deployments provides several benefits:\n\n- **Consistency** - Every deployment uses the same build process\n- **Speed** - Sites deploy automatically on every push\n- **Safety** - Preview deployments let you review changes before production\n- **Collaboration** - Team members can contribute without manual deployment steps\n\n## Platform Guides\n\nChoose your CI/CD platform:\n\n| Platform | Guide | Best For |\n|----------|-------|----------|\n| **GitHub Actions** | [[github-actions|GitHub Actions Guide]] | GitHub repositories, GitHub Pages |\n| **GitLab CI** | [[gitlab-ci|GitLab CI Guide]] | GitLab repositories, GitLab Pages |\n\n## Quick Start\n\nThe basic CI/CD workflow for markata-go is:\n\n1. **Install markata-go** - Download the binary from GitHub releases\n2. **Build the site** - Run `markata-go build --clean`\n3. **Deploy** - Upload the `public/` directory to your hosting platform\n\n### Installing markata-go in CI\n\nFor container-based CI pipelines, the easiest option is the builder image:\n\n```bash\ndocker run --rm \\\n  -v \"$PWD\":/site \\\n  -w /site \\\n  ghcr.io/waylonwalker/markata-go-builder:latest \\\n  sh -c 'markata-go build --clean'\n```\n\nIf you prefer installing a binary directly, download the pre-built release:\n\n```bash\n# Download latest release (Linux x86_64)\nMARKATA_VERSION=\"v0.1.0\"\nwget -qO- \"https://github.com/WaylonWalker/markata-go/releases/download/${MARKATA_VERSION}/markata-go_${MARKATA_VERSION#v}_linux_x86_64.tar.gz\" | tar xz\n\n# Run the build\n./markata-go build --clean\n```\n\nAlternatively, if Go is available in your CI environment:\n\n```bash\ngo install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\nmarkata-go build --clean\n```\n\n### Setting the Site URL\n\nFor production deployments, always set the site URL via environment variable:\n\n```bash\nMARKATA_GO_URL=https://example.com markata-go build --clean\n```\n\nThis ensures all absolute URLs in feeds, sitemaps, and canonical tags are correct.\n\n## Deployment Targets\n\nmarkata-go generates static files that can be deployed anywhere. Common targets include:\n\n| Target | Description | Guide Section |\n|--------|-------------|---------------|\n| **GitHub Pages** | Free hosting from GitHub | [[github-actions#github-pages|GitHub Actions]] |\n| **GitLab Pages** | Free hosting from GitLab | [[gitlab-ci#gitlab-pages|GitLab CI]] |\n| **Netlify** | CDN with deploy previews | [[github-actions#netlify|GitHub Actions]] |\n| **Cloudflare Pages** | Fast global CDN | [[github-actions#cloudflare-pages|GitHub Actions]] |\n| **AWS S3** | Scalable object storage | [[github-actions#aws-s3|GitHub Actions]] |\n| **Self-hosted** | Your own server | [[deployment-guide|Deployment Guide]] |\n\n## Key Concepts\n\n### Build Artifacts\n\nAfter running `markata-go build`, the `public/` directory contains your complete static site. This directory should be:\n\n- **Uploaded as an artifact** between CI jobs (if using separate build/deploy jobs)\n- **Deployed to your hosting platform** (GitHub Pages, Netlify, etc.)\n\n### Environment Variables\n\nmarkata-go supports environment variable configuration with the `MARKATA_GO_` prefix:\n\n| Variable | Purpose | Example |\n|----------|---------|---------|\n| `MARKATA_GO_URL` | Base URL for the site | `https://example.com` |\n| `MARKATA_GO_OUTPUT_DIR` | Output directory | `dist` |\n| `MARKATA_GO_TITLE` | Site title | `My Blog` |\n\n### Caching\n\nTo speed up CI builds, cache the markata-go binary and any Go modules:\n\n```yaml\n# GitHub Actions example\n- uses: actions/cache@v4\n  with:\n    path: |\n      ~/go/bin/markata-go\n      ~/go/pkg/mod\n    key: markata-go-${{ runner.os }}-${{ hashFiles('go.sum') }}\n```\n\nSee the platform-specific guides for detailed caching configurations.\n\n## Multi-Environment Deployments\n\nFor projects with staging and production environments:\n\n```yaml\n# Simplified example\njobs:\n  build:\n    # Build once, deploy to multiple environments\n\n  deploy-staging:\n    needs: build\n    if: github.ref == 'refs/heads/develop'\n    environment: staging\n\n  deploy-production:\n    needs: build\n    if: github.ref == 'refs/heads/main'\n    environment: production\n```\n\nSee [[github-actions#multi-environment|Multi-Environment Deployments]] for complete examples.\n\n## Preview Deployments\n\nPreview deployments create temporary sites for pull requests, allowing reviewers to see changes before merging:\n\n- **Netlify** - Automatic deploy previews for PRs\n- **Vercel** - Automatic preview deployments\n- **GitHub Pages** - Custom workflow with PR-specific paths\n\nSee [[github-actions#preview-deployments|Preview Deployments]] for implementation details.\n\n## Troubleshooting\n\n### Common Issues\n\n**Build fails with \"command not found\"**\n\nEnsure markata-go is installed and in your PATH:\n\n```bash\n# Check if installed\nwhich markata-go || echo \"Not found\"\n\n# If using wget install, run from current directory\n./markata-go build\n```\n\n**Assets have wrong URLs**\n\nSet `MARKATA_GO_URL` to match your deployment URL:\n\n```bash\nMARKATA_GO_URL=https://username.github.io/repo-name markata-go build\n```\n\n**Build succeeds but site is empty**\n\nCheck that your content directory contains Markdown files:\n\n```bash\n# List markdown files\nfind . -name \"*.md\" -type f\n```\n\n**RSS feeds show localhost URLs**\n\nThe base URL must be set for feeds to work correctly:\n\n```bash\nMARKATA_GO_URL=https://example.com markata-go build\n```\n\n### Debug Mode\n\nEnable verbose output to diagnose build issues:\n\n```bash\nmarkata-go build --clean -v\n```\n\n### Validating Configuration\n\nBefore deploying, validate your configuration:\n\n```bash\nmarkata-go config validate\nmarkata-go config show --sources\n```\n\n## Next Steps\n\n- [[github-actions|GitHub Actions Guide]] - Complete GitHub Actions workflows\n- [[gitlab-ci|GitLab CI Guide]] - GitLab CI/CD pipelines\n- [[deployment-guide|Deployment Guide]] - Manual deployment options\n- [[troubleshooting|Troubleshooting]] - Common issues and solutions\n",
      "summary": "Automate building and deploying markata-go sites with continuous integration pipelines",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "documentation",
        "ci-cd",
        "deployment"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/ci-cd/gitlab-ci/",
      "url": "https://markata.dev/docs/guides/ci-cd/gitlab-ci/",
      "title": "GitLab CI/CD",
      "content_html": "\u003cp\u003eGitLab CI/CD provides integrated continuous integration and deployment directly within GitLab. This guide covers deploying markata-go sites to GitLab Pages and other platforms.\u003c/p\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCreate \u003ccode\u003e.gitlab-ci.yml\u003c/code\u003e in your repository root:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ealpine:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003estages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_VERSION\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;0.1.0\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebefore_script\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eapk add --no-cache wget tar\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ewget -qO- \u0026#34;https://github.com/WaylonWalker/markata-go/releases/download/v${MARKATA_VERSION}/markata-go_${MARKATA_VERSION}_linux_x86_64.tar.gz\u0026#34; | tar xz\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emv markata-go /usr/local/bin/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eexpire_in\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehour\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Deploying to GitLab Pages...\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eonly\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eproduction\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://$CI_PROJECT_NAMESPACE.gitlab.io/$CI_PROJECT_NAME\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePush to your repository, and GitLab will automatically build and deploy your site.\u003c/p\u003e\n\u003ch2 id=\"gitlab-pages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGitLab Pages\u003c/span\u003e \u003ca href=\"#gitlab-pages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"basic-deployment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Deployment\u003c/span\u003e \u003ca href=\"#basic-deployment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGitLab Pages requires a job named \u003ccode\u003epages\u003c/code\u003e that produces artifacts in the \u003ccode\u003epublic/\u003c/code\u003e directory:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Deploying to GitLab Pages\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eonly\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe key requirements:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eJob must be named \u003ccode\u003epages\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eArtifacts must include \u003ccode\u003epublic/\u003c/code\u003e directory\u003c/li\u003e\n\u003cli\u003eOnly runs on your default branch\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"with-site-url-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWith Site URL Configuration\u003c/span\u003e \u003ca href=\"#with-site-url-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_VERSION\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;0.1.0\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eSITE_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://mygroup.gitlab.io/myproject\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ealpine:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebefore_script\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eapk add --no-cache wget tar\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ewget -qO- \u0026#34;https://github.com/WaylonWalker/markata-go/releases/download/v${MARKATA_VERSION}/markata-go_${MARKATA_VERSION}_linux_x86_64.tar.gz\u0026#34; | tar xz\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emv markata-go /usr/local/bin/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eMARKATA_GO_URL=$SITE_URL markata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eexpire_in\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehour\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edependencies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Deploying to GitLab Pages\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eonly\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"custom-domain\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Domain\u003c/span\u003e \u003ca href=\"#custom-domain\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eGo to \u003cstrong\u003eSettings\u003c/strong\u003e \u0026gt; \u003cstrong\u003ePages\u003c/strong\u003e \u0026gt; \u003cstrong\u003eNew Domain\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eAdd your domain and verify ownership\u003c/li\u003e\n\u003cli\u003eUpdate your configuration:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eSITE_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003col start=\"4\"\u003e\n\u003cli\u003eConfigure DNS:\n\u003cul\u003e\n\u003cli\u003eAdd a \u003ccode\u003eCNAME\u003c/code\u003e record pointing to \u003ccode\u003e\u0026lt;namespace\u0026gt;.gitlab.io\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eOr use \u003ccode\u003eA\u003c/code\u003e records for apex domains\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"access-control\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAccess Control\u003c/span\u003e \u003ca href=\"#access-control\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eControl who can view your GitLab Pages site:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eSettings\u003c/strong\u003e \u0026gt; \u003cstrong\u003eGeneral\u003c/strong\u003e \u0026gt; \u003cstrong\u003eVisibility\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eChoose visibility level for Pages\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eFor private Pages with authentication:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Deploying private site\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eonly\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen enable \u003cstrong\u003ePages Access Control\u003c/strong\u003e in project settings.\u003c/p\u003e\n\u003ch2 id=\"complete-pipeline\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComplete Pipeline\u003c/span\u003e \u003ca href=\"#complete-pipeline\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA full-featured pipeline with testing and multiple environments:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ealpine:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003estages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003evalidate\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003etest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_VERSION\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;0.1.0\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Cache configuration\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eGOPATH\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${CI_PROJECT_DIR}/.go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Global cache for all jobs\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${CI_COMMIT_REF_SLUG}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003e.go/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Reusable template for markata-go setup\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e.markata-setup\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e\u0026amp;markata-setup\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebefore_script\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eapk add --no-cache wget tar\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      if [ ! -f /usr/local/bin/markata-go ]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        wget -qO- \u0026#34;https://github.com/WaylonWalker/markata-go/releases/download/v${MARKATA_VERSION}/markata-go_${MARKATA_VERSION}_linux_x86_64.tar.gz\u0026#34; | tar xz\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        mv markata-go /usr/local/bin/\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      fi\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Validate configuration\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evalidate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003evalidate\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e*markata-setup\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkata-go config validate\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Build the site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e*markata-setup\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      if [ \u0026#34;$CI_COMMIT_BRANCH\u0026#34; == \u0026#34;$CI_DEFAULT_BRANCH\u0026#34; ]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        export MARKATA_GO_URL=\u0026#34;https://${CI_PROJECT_NAMESPACE}.gitlab.io/${CI_PROJECT_NAME}\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      else\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        export MARKATA_GO_URL=\u0026#34;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      fi\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkata-go build --clean -v\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eexpire_in\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eday\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Test HTML output\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etest:html\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enode:20-alpine\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edependencies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003enpm install -g html-validate\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ehtml-validate \u0026#34;public/**/*.html\u0026#34; || true\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eallow_failure\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Test for broken links\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etest:links\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enode:20-alpine\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edependencies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003enpm install -g linkinator\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003elinkinator public --recurse --skip \u0026#34;^(?!https?://)\u0026#34; || true\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eallow_failure\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Deploy to GitLab Pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edependencies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Deploying to GitLab Pages\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eproduction\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://${CI_PROJECT_NAMESPACE}.gitlab.io/${CI_PROJECT_NAME}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"multi-environment-deployments\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMulti-Environment Deployments\u003c/span\u003e \u003ca href=\"#multi-environment-deployments\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDeploy to staging and production environments:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003estages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_VERSION\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;0.1.0\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e.build-template\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e\u0026amp;build-template\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ealpine:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebefore_script\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eapk add --no-cache wget tar\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ewget -qO- \u0026#34;https://github.com/WaylonWalker/markata-go/releases/download/v${MARKATA_VERSION}/markata-go_${MARKATA_VERSION}_linux_x86_64.tar.gz\u0026#34; | tar xz\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emv markata-go /usr/local/bin/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Build for staging\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuild:staging\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e*build-template\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://staging.example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eexpire_in\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eday\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == \u0026#34;develop\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Build for production\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuild:production\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e*build-template\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eexpire_in\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eday\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Deploy to staging environment\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edeploy:staging\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edependencies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ebuild:staging\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Deploying to staging...\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# Add your staging deployment commands here\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003estaging\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://staging.example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == \u0026#34;develop\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Deploy to production (manual approval)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edeploy:production\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edependencies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ebuild:production\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Deploying to production...\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# For GitLab Pages, this happens automatically\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eproduction\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ewhen\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emanual \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Require manual approval\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"review-apps-preview-deployments\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReview Apps (Preview Deployments)\u003c/span\u003e \u003ca href=\"#review-apps-preview-deployments\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCreate dynamic preview environments for merge requests:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003estages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ereview\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ecleanup\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_VERSION\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;0.1.0\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Build for merge request review\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuild:review\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ealpine:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebefore_script\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eapk add --no-cache wget tar\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ewget -qO- \u0026#34;https://github.com/WaylonWalker/markata-go/releases/download/v${MARKATA_VERSION}/markata-go_${MARKATA_VERSION}_linux_x86_64.tar.gz\u0026#34; | tar xz\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emv markata-go /usr/local/bin/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eMARKATA_GO_URL=\u0026#34;https://${CI_PROJECT_NAMESPACE}.gitlab.io/-/${CI_PROJECT_NAME}/-/jobs/${CI_JOB_ID}/artifacts/public\u0026#34; markata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eexpire_in\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eweek\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Deploy review app\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ereview\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ereview\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edependencies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ebuild:review\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Review app deployed\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ereview/$CI_COMMIT_REF_SLUG\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://${CI_PROJECT_NAMESPACE}.gitlab.io/-/${CI_PROJECT_NAME}/-/jobs/${CI_JOB_ID}/artifacts/public/index.html\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eon_stop\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003estop:review\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eauto_stop_in\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eweek\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Stop review app\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003estop:review\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecleanup\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Stopping review app\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ereview/$CI_COMMIT_REF_SLUG\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003estop\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;merge_request_event\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ewhen\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emanual\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eallow_failure\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor more robust review apps, consider deploying to external services like Netlify or Vercel.\u003c/p\u003e\n\u003ch2 id=\"caching-strategies\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCaching Strategies\u003c/span\u003e \u003ca href=\"#caching-strategies\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"cache-markata-go-binary\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCache markata-go Binary\u003c/span\u003e \u003ca href=\"#cache-markata-go-binary\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_VERSION\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;0.1.0\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go-${MARKATA_VERSION}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003e.cache/markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ealpine:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebefore_script\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emkdir -p .cache\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      if [ -f .cache/markata-go ]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        cp .cache/markata-go /usr/local/bin/\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      else\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        apk add --no-cache wget tar\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        wget -qO- \u0026#34;https://github.com/WaylonWalker/markata-go/releases/download/v${MARKATA_VERSION}/markata-go_${MARKATA_VERSION}_linux_x86_64.tar.gz\u0026#34; | tar xz\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        cp markata-go .cache/\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        mv markata-go /usr/local/bin/\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      fi\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"cache-with-go-install\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCache with Go Install\u003c/span\u003e \u003ca href=\"#cache-with-go-install\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf you prefer building from source:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eGOPATH\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${CI_PROJECT_DIR}/.go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${CI_COMMIT_REF_SLUG}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003e.go/pkg/mod/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003e.go/bin/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egolang:1.22\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      if [ ! -f ${GOPATH}/bin/markata-go ]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      fi\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003e${GOPATH}/bin/markata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"per-branch-cache\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePer-Branch Cache\u003c/span\u003e \u003ca href=\"#per-branch-cache\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${CI_COMMIT_REF_SLUG}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003e.cache/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Fallback to default branch cache if branch cache doesn\u0026#39;t exist\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003ego.sum\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eprefix\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${CI_COMMIT_REF_SLUG}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003e.go/pkg/mod/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epolicy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epull-push\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"scheduled-pipelines\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eScheduled Pipelines\u003c/span\u003e \u003ca href=\"#scheduled-pipelines\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRebuild your site on a schedule:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eGo to \u003cstrong\u003eCI/CD\u003c/strong\u003e \u0026gt; \u003cstrong\u003eSchedules\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eCreate a new schedule\u003c/li\u003e\n\u003cli\u003eSet the interval (e.g., daily at midnight)\u003c/li\u003e\n\u003cli\u003eTarget the main branch\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eOr configure in \u003ccode\u003e.gitlab-ci.yml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eecho \u0026#34;Deploying to GitLab Pages\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epublic/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PIPELINE_SOURCE == \u0026#34;schedule\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"deploying-to-external-services\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeploying to External Services\u003c/span\u003e \u003ca href=\"#deploying-to-external-services\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"netlify\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNetlify\u003c/span\u003e \u003ca href=\"#netlify\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edeploy:netlify\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enode:20-alpine\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edependencies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebefore_script\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003enpm install -g netlify-cli\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003enetlify deploy --dir=public --prod\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eproduction\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://example.netlify.app\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eNETLIFY_AUTH_TOKEN\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${NETLIFY_AUTH_TOKEN}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eNETLIFY_SITE_ID\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${NETLIFY_SITE_ID}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAdd \u003ccode\u003eNETLIFY_AUTH_TOKEN\u003c/code\u003e and \u003ccode\u003eNETLIFY_SITE_ID\u003c/code\u003e as CI/CD variables in \u003cstrong\u003eSettings\u003c/strong\u003e \u0026gt; \u003cstrong\u003eCI/CD\u003c/strong\u003e \u0026gt; \u003cstrong\u003eVariables\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"aws-s3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAWS S3\u003c/span\u003e \u003ca href=\"#aws-s3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edeploy:s3\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eamazon/aws-cli:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edependencies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003eaws s3 sync ./public s3://${S3_BUCKET} --delete\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      if [ -n \u0026#34;${CLOUDFRONT_DISTRIBUTION_ID}\u0026#34; ]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e        aws cloudfront create-invalidation --distribution-id ${CLOUDFRONT_DISTRIBUTION_ID} --paths \u0026#34;/*\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      fi\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eproduction\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eAWS_ACCESS_KEY_ID\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${AWS_ACCESS_KEY_ID}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eAWS_SECRET_ACCESS_KEY\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${AWS_SECRET_ACCESS_KEY}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eAWS_DEFAULT_REGION\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eus-east-1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"using-docker-images\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing Docker Images\u003c/span\u003e \u003ca href=\"#using-docker-images\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"pre-built-image-with-markata-go\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePre-built Image with markata-go\u003c/span\u003e \u003ca href=\"#pre-built-image-with-markata-go\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate a custom Docker image for faster builds:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Dockerfile\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003ealpine:latest\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eARG\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_VERSION\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e.1.0\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e apk add --no-cache wget tar ca-certificates \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e wget -qO- \u003cspan class=\"s2\"\u003e\u0026#34;https://github.com/WaylonWalker/markata-go/releases/download/v\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eMARKATA_VERSION\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e/markata-go_\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eMARKATA_VERSION\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e_linux_x86_64.tar.gz\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e tar xz \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e mv markata-go /usr/local/bin/ \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e apk del wget tar\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eENTRYPOINT\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;markata-go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse in your pipeline:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eregistry.gitlab.com/mygroup/myproject/markata-go:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"go-image\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGo Image\u003c/span\u003e \u003ca href=\"#go-image\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003estage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egolang:1.22-alpine\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebefore_script\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ego install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"pipeline-not-running\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePipeline Not Running\u003c/span\u003e \u003ca href=\"#pipeline-not-running\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eCheck \u003ccode\u003e.gitlab-ci.yml\u003c/code\u003e syntax: \u003cstrong\u003eCI/CD\u003c/strong\u003e \u0026gt; \u003cstrong\u003eEditor\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eVerify the file is in the repository root\u003c/li\u003e\n\u003cli\u003eCheck branch rules match your branch\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"pages-not-updating\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePages Not Updating\u003c/span\u003e \u003ca href=\"#pages-not-updating\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eVerify the \u003ccode\u003epages\u003c/code\u003e job completed successfully\u003c/li\u003e\n\u003cli\u003eCheck artifacts include \u003ccode\u003epublic/\u003c/code\u003e directory\u003c/li\u003e\n\u003cli\u003eWait a few minutes for propagation\u003c/li\u003e\n\u003cli\u003eCheck \u003cstrong\u003eSettings\u003c/strong\u003e \u0026gt; \u003cstrong\u003ePages\u003c/strong\u003e for status\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"404-error-on-pages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e404 Error on Pages\u003c/span\u003e \u003ca href=\"#404-error-on-pages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eEnsure \u003ccode\u003epublic/index.html\u003c/code\u003e exists\u003c/li\u003e\n\u003cli\u003eCheck the URL matches your project path\u003c/li\u003e\n\u003cli\u003eVerify GitLab Pages is enabled\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"build-fails-with-memory-error\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Fails with Memory Error\u003c/span\u003e \u003ca href=\"#build-fails-with-memory-error\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIncrease job resources using tags:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ehigh-memory\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr contact your GitLab administrator to configure runner resources.\u003c/p\u003e\n\u003ch3 id=\"permission-denied\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePermission Denied\u003c/span\u003e \u003ca href=\"#permission-denied\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCheck that protected variables are available:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eSettings\u003c/strong\u003e \u0026gt; \u003cstrong\u003eCI/CD\u003c/strong\u003e \u0026gt; \u003cstrong\u003eVariables\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eUncheck \u0026ldquo;Protected\u0026rdquo; or run on protected branches\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"environment-variables-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment Variables Reference\u003c/span\u003e \u003ca href=\"#environment-variables-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003ePurpose\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_URL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite base URL\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehttps://example.com\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_OUTPUT_DIR\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOutput directory\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edist\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_TITLE\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite title override\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eMy Blog\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCI_PROJECT_NAMESPACE\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGitLab group/user\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emygroup\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCI_PROJECT_NAME\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRepository name\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emyproject\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCI_COMMIT_BRANCH\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCurrent branch\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emain\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCI_DEFAULT_BRANCH\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault branch\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emain\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCI_PIPELINE_SOURCE\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePipeline trigger\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epush\u003c/code\u003e, \u003ccode\u003emerge_request_event\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext Steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[[github-actions|GitHub Actions Guide]] - GitHub Actions workflows\u003c/li\u003e\n\u003cli\u003e[[../deployment|Deployment Guide]] - Manual deployment options\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.gitlab.com/ee/ci/\"\u003eGitLab CI/CD Documentation\u003c/a\u003e - Official docs\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nGitLab CI/CD provides integrated continuous integration and deployment directly within GitLab. This guide covers deploying markata-go sites to GitLab Pages and other platforms.\n\n## Quick Start\n\nCreate `.gitlab-ci.yml` in your repository root:\n\n```yaml\nimage: alpine:latest\n\nstages:\n  - build\n  - deploy\n\nvariables:\n  MARKATA_VERSION: \"0.1.0\"\n\nbuild:\n  stage: build\n  before_script:\n    - apk add --no-cache wget tar\n    - wget -qO- \"https://github.com/WaylonWalker/markata-go/releases/download/v${MARKATA_VERSION}/markata-go_${MARKATA_VERSION}_linux_x86_64.tar.gz\" | tar xz\n    - mv markata-go /usr/local/bin/\n  script:\n    - markata-go build --clean\n  artifacts:\n    paths:\n      - public/\n    expire_in: 1 hour\n\npages:\n  stage: deploy\n  script:\n    - echo \"Deploying to GitLab Pages...\"\n  artifacts:\n    paths:\n      - public/\n  only:\n    - main\n  environment:\n    name: production\n    url: https://$CI_PROJECT_NAMESPACE.gitlab.io/$CI_PROJECT_NAME\n```\n\nPush to your repository, and GitLab will automatically build and deploy your site.\n\n## GitLab Pages\n\n### Basic Deployment\n\nGitLab Pages requires a job named `pages` that produces artifacts in the `public/` directory:\n\n```yaml\npages:\n  stage: deploy\n  script:\n    - echo \"Deploying to GitLab Pages\"\n  artifacts:\n    paths:\n      - public/\n  only:\n    - main\n```\n\nThe key requirements:\n- Job must be named `pages`\n- Artifacts must include `public/` directory\n- Only runs on your default branch\n\n### With Site URL Configuration\n\n```yaml\nvariables:\n  MARKATA_VERSION: \"0.1.0\"\n  SITE_URL: \"https://mygroup.gitlab.io/myproject\"\n\nbuild:\n  stage: build\n  image: alpine:latest\n  before_script:\n    - apk add --no-cache wget tar\n    - wget -qO- \"https://github.com/WaylonWalker/markata-go/releases/download/v${MARKATA_VERSION}/markata-go_${MARKATA_VERSION}_linux_x86_64.tar.gz\" | tar xz\n    - mv markata-go /usr/local/bin/\n  script:\n    - MARKATA_GO_URL=$SITE_URL markata-go build --clean\n  artifacts:\n    paths:\n      - public/\n    expire_in: 1 hour\n\npages:\n  stage: deploy\n  dependencies:\n    - build\n  script:\n    - echo \"Deploying to GitLab Pages\"\n  artifacts:\n    paths:\n      - public/\n  only:\n    - main\n```\n\n### Custom Domain\n\n1. Go to **Settings** \u003e **Pages** \u003e **New Domain**\n2. Add your domain and verify ownership\n3. Update your configuration:\n\n```yaml\nvariables:\n  SITE_URL: \"https://example.com\"\n```\n\n4. Configure DNS:\n   - Add a `CNAME` record pointing to `\u003cnamespace\u003e.gitlab.io`\n   - Or use `A` records for apex domains\n\n### Access Control\n\nControl who can view your GitLab Pages site:\n\n1. **Settings** \u003e **General** \u003e **Visibility**\n2. Choose visibility level for Pages\n\nFor private Pages with authentication:\n\n```yaml\npages:\n  stage: deploy\n  script:\n    - echo \"Deploying private site\"\n  artifacts:\n    paths:\n      - public/\n  only:\n    - main\n```\n\nThen enable **Pages Access Control** in project settings.\n\n## Complete Pipeline\n\nA full-featured pipeline with testing and multiple environments:\n\n```yaml\nimage: alpine:latest\n\nstages:\n  - validate\n  - build\n  - test\n  - deploy\n\nvariables:\n  MARKATA_VERSION: \"0.1.0\"\n  # Cache configuration\n  GOPATH: ${CI_PROJECT_DIR}/.go\n\n# Global cache for all jobs\ncache:\n  key: ${CI_COMMIT_REF_SLUG}\n  paths:\n    - .go/\n\n# Reusable template for markata-go setup\n.markata-setup: \u0026markata-setup\n  before_script:\n    - apk add --no-cache wget tar\n    - |\n      if [ ! -f /usr/local/bin/markata-go ]; then\n        wget -qO- \"https://github.com/WaylonWalker/markata-go/releases/download/v${MARKATA_VERSION}/markata-go_${MARKATA_VERSION}_linux_x86_64.tar.gz\" | tar xz\n        mv markata-go /usr/local/bin/\n      fi\n\n# Validate configuration\nvalidate:\n  stage: validate\n  \u003c\u003c: *markata-setup\n  script:\n    - markata-go config validate\n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n\n# Build the site\nbuild:\n  stage: build\n  \u003c\u003c: *markata-setup\n  script:\n    - |\n      if [ \"$CI_COMMIT_BRANCH\" == \"$CI_DEFAULT_BRANCH\" ]; then\n        export MARKATA_GO_URL=\"https://${CI_PROJECT_NAMESPACE}.gitlab.io/${CI_PROJECT_NAME}\"\n      else\n        export MARKATA_GO_URL=\"\"\n      fi\n    - markata-go build --clean -v\n  artifacts:\n    paths:\n      - public/\n    expire_in: 1 day\n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n    - if: $CI_COMMIT_BRANCH\n\n# Test HTML output\ntest:html:\n  stage: test\n  image: node:20-alpine\n  dependencies:\n    - build\n  script:\n    - npm install -g html-validate\n    - html-validate \"public/**/*.html\" || true\n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n  allow_failure: true\n\n# Test for broken links\ntest:links:\n  stage: test\n  image: node:20-alpine\n  dependencies:\n    - build\n  script:\n    - npm install -g linkinator\n    - linkinator public --recurse --skip \"^(?!https?://)\" || true\n  rules:\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n  allow_failure: true\n\n# Deploy to GitLab Pages\npages:\n  stage: deploy\n  dependencies:\n    - build\n  script:\n    - echo \"Deploying to GitLab Pages\"\n  artifacts:\n    paths:\n      - public/\n  environment:\n    name: production\n    url: https://${CI_PROJECT_NAMESPACE}.gitlab.io/${CI_PROJECT_NAME}\n  rules:\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n```\n\n## Multi-Environment Deployments\n\nDeploy to staging and production environments:\n\n```yaml\nstages:\n  - build\n  - deploy\n\nvariables:\n  MARKATA_VERSION: \"0.1.0\"\n\n.build-template: \u0026build-template\n  stage: build\n  image: alpine:latest\n  before_script:\n    - apk add --no-cache wget tar\n    - wget -qO- \"https://github.com/WaylonWalker/markata-go/releases/download/v${MARKATA_VERSION}/markata-go_${MARKATA_VERSION}_linux_x86_64.tar.gz\" | tar xz\n    - mv markata-go /usr/local/bin/\n  script:\n    - markata-go build --clean\n\n# Build for staging\nbuild:staging:\n  \u003c\u003c: *build-template\n  variables:\n    MARKATA_GO_URL: \"https://staging.example.com\"\n  artifacts:\n    paths:\n      - public/\n    expire_in: 1 day\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"develop\"\n\n# Build for production\nbuild:production:\n  \u003c\u003c: *build-template\n  variables:\n    MARKATA_GO_URL: \"https://example.com\"\n  artifacts:\n    paths:\n      - public/\n    expire_in: 1 day\n  rules:\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n\n# Deploy to staging environment\ndeploy:staging:\n  stage: deploy\n  dependencies:\n    - build:staging\n  script:\n    - echo \"Deploying to staging...\"\n    # Add your staging deployment commands here\n  environment:\n    name: staging\n    url: https://staging.example.com\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"develop\"\n\n# Deploy to production (manual approval)\ndeploy:production:\n  stage: deploy\n  dependencies:\n    - build:production\n  script:\n    - echo \"Deploying to production...\"\n    # For GitLab Pages, this happens automatically\n  environment:\n    name: production\n    url: https://example.com\n  rules:\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n  when: manual  # Require manual approval\n```\n\n## Review Apps (Preview Deployments)\n\nCreate dynamic preview environments for merge requests:\n\n```yaml\nstages:\n  - build\n  - review\n  - deploy\n  - cleanup\n\nvariables:\n  MARKATA_VERSION: \"0.1.0\"\n\n# Build for merge request review\nbuild:review:\n  stage: build\n  image: alpine:latest\n  before_script:\n    - apk add --no-cache wget tar\n    - wget -qO- \"https://github.com/WaylonWalker/markata-go/releases/download/v${MARKATA_VERSION}/markata-go_${MARKATA_VERSION}_linux_x86_64.tar.gz\" | tar xz\n    - mv markata-go /usr/local/bin/\n  script:\n    - MARKATA_GO_URL=\"https://${CI_PROJECT_NAMESPACE}.gitlab.io/-/${CI_PROJECT_NAME}/-/jobs/${CI_JOB_ID}/artifacts/public\" markata-go build --clean\n  artifacts:\n    paths:\n      - public/\n    expire_in: 1 week\n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n\n# Deploy review app\nreview:\n  stage: review\n  dependencies:\n    - build:review\n  script:\n    - echo \"Review app deployed\"\n  artifacts:\n    paths:\n      - public/\n  environment:\n    name: review/$CI_COMMIT_REF_SLUG\n    url: https://${CI_PROJECT_NAMESPACE}.gitlab.io/-/${CI_PROJECT_NAME}/-/jobs/${CI_JOB_ID}/artifacts/public/index.html\n    on_stop: stop:review\n    auto_stop_in: 1 week\n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n\n# Stop review app\nstop:review:\n  stage: cleanup\n  script:\n    - echo \"Stopping review app\"\n  environment:\n    name: review/$CI_COMMIT_REF_SLUG\n    action: stop\n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n      when: manual\n  allow_failure: true\n```\n\nFor more robust review apps, consider deploying to external services like Netlify or Vercel.\n\n## Caching Strategies\n\n### Cache markata-go Binary\n\n```yaml\nvariables:\n  MARKATA_VERSION: \"0.1.0\"\n\ncache:\n  key: markata-go-${MARKATA_VERSION}\n  paths:\n    - .cache/markata-go\n\nbuild:\n  stage: build\n  image: alpine:latest\n  before_script:\n    - mkdir -p .cache\n    - |\n      if [ -f .cache/markata-go ]; then\n        cp .cache/markata-go /usr/local/bin/\n      else\n        apk add --no-cache wget tar\n        wget -qO- \"https://github.com/WaylonWalker/markata-go/releases/download/v${MARKATA_VERSION}/markata-go_${MARKATA_VERSION}_linux_x86_64.tar.gz\" | tar xz\n        cp markata-go .cache/\n        mv markata-go /usr/local/bin/\n      fi\n  script:\n    - markata-go build --clean\n```\n\n### Cache with Go Install\n\nIf you prefer building from source:\n\n```yaml\nvariables:\n  GOPATH: ${CI_PROJECT_DIR}/.go\n\ncache:\n  key: ${CI_COMMIT_REF_SLUG}\n  paths:\n    - .go/pkg/mod/\n    - .go/bin/\n\nbuild:\n  stage: build\n  image: golang:1.22\n  script:\n    - |\n      if [ ! -f ${GOPATH}/bin/markata-go ]; then\n        go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n      fi\n    - ${GOPATH}/bin/markata-go build --clean\n```\n\n### Per-Branch Cache\n\n```yaml\ncache:\n  key: ${CI_COMMIT_REF_SLUG}\n  paths:\n    - .cache/\n\n# Fallback to default branch cache if branch cache doesn't exist\ncache:\n  key:\n    files:\n      - go.sum\n    prefix: ${CI_COMMIT_REF_SLUG}\n  paths:\n    - .go/pkg/mod/\n  policy: pull-push\n```\n\n## Scheduled Pipelines\n\nRebuild your site on a schedule:\n\n1. Go to **CI/CD** \u003e **Schedules**\n2. Create a new schedule\n3. Set the interval (e.g., daily at midnight)\n4. Target the main branch\n\nOr configure in `.gitlab-ci.yml`:\n\n```yaml\npages:\n  stage: deploy\n  script:\n    - echo \"Deploying to GitLab Pages\"\n  artifacts:\n    paths:\n      - public/\n  rules:\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n    - if: $CI_PIPELINE_SOURCE == \"schedule\"\n```\n\n## Deploying to External Services\n\n### Netlify\n\n```yaml\ndeploy:netlify:\n  stage: deploy\n  image: node:20-alpine\n  dependencies:\n    - build\n  before_script:\n    - npm install -g netlify-cli\n  script:\n    - netlify deploy --dir=public --prod\n  environment:\n    name: production\n    url: https://example.netlify.app\n  rules:\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n  variables:\n    NETLIFY_AUTH_TOKEN: ${NETLIFY_AUTH_TOKEN}\n    NETLIFY_SITE_ID: ${NETLIFY_SITE_ID}\n```\n\nAdd `NETLIFY_AUTH_TOKEN` and `NETLIFY_SITE_ID` as CI/CD variables in **Settings** \u003e **CI/CD** \u003e **Variables**.\n\n### AWS S3\n\n```yaml\ndeploy:s3:\n  stage: deploy\n  image: amazon/aws-cli:latest\n  dependencies:\n    - build\n  script:\n    - aws s3 sync ./public s3://${S3_BUCKET} --delete\n    - |\n      if [ -n \"${CLOUDFRONT_DISTRIBUTION_ID}\" ]; then\n        aws cloudfront create-invalidation --distribution-id ${CLOUDFRONT_DISTRIBUTION_ID} --paths \"/*\"\n      fi\n  environment:\n    name: production\n    url: https://example.com\n  rules:\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n  variables:\n    AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}\n    AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}\n    AWS_DEFAULT_REGION: us-east-1\n```\n\n## Using Docker Images\n\n### Pre-built Image with markata-go\n\nCreate a custom Docker image for faster builds:\n\n```dockerfile\n# Dockerfile\nFROM alpine:latest\n\nARG MARKATA_VERSION=0.1.0\n\nRUN apk add --no-cache wget tar ca-certificates \\\n    \u0026\u0026 wget -qO- \"https://github.com/WaylonWalker/markata-go/releases/download/v${MARKATA_VERSION}/markata-go_${MARKATA_VERSION}_linux_x86_64.tar.gz\" | tar xz \\\n    \u0026\u0026 mv markata-go /usr/local/bin/ \\\n    \u0026\u0026 apk del wget tar\n\nENTRYPOINT [\"markata-go\"]\n```\n\nUse in your pipeline:\n\n```yaml\nbuild:\n  stage: build\n  image: registry.gitlab.com/mygroup/myproject/markata-go:latest\n  script:\n    - markata-go build --clean\n```\n\n### Go Image\n\n```yaml\nbuild:\n  stage: build\n  image: golang:1.22-alpine\n  before_script:\n    - go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n  script:\n    - markata-go build --clean\n```\n\n## Troubleshooting\n\n### Pipeline Not Running\n\n- Check `.gitlab-ci.yml` syntax: **CI/CD** \u003e **Editor**\n- Verify the file is in the repository root\n- Check branch rules match your branch\n\n### Pages Not Updating\n\n1. Verify the `pages` job completed successfully\n2. Check artifacts include `public/` directory\n3. Wait a few minutes for propagation\n4. Check **Settings** \u003e **Pages** for status\n\n### 404 Error on Pages\n\n- Ensure `public/index.html` exists\n- Check the URL matches your project path\n- Verify GitLab Pages is enabled\n\n### Build Fails with Memory Error\n\nIncrease job resources using tags:\n\n```yaml\nbuild:\n  tags:\n    - high-memory\n  script:\n    - markata-go build --clean\n```\n\nOr contact your GitLab administrator to configure runner resources.\n\n### Permission Denied\n\nCheck that protected variables are available:\n\n1. **Settings** \u003e **CI/CD** \u003e **Variables**\n2. Uncheck \"Protected\" or run on protected branches\n\n## Environment Variables Reference\n\n| Variable | Purpose | Example |\n|----------|---------|---------|\n| `MARKATA_GO_URL` | Site base URL | `https://example.com` |\n| `MARKATA_GO_OUTPUT_DIR` | Output directory | `dist` |\n| `MARKATA_GO_TITLE` | Site title override | `My Blog` |\n| `CI_PROJECT_NAMESPACE` | GitLab group/user | `mygroup` |\n| `CI_PROJECT_NAME` | Repository name | `myproject` |\n| `CI_COMMIT_BRANCH` | Current branch | `main` |\n| `CI_DEFAULT_BRANCH` | Default branch | `main` |\n| `CI_PIPELINE_SOURCE` | Pipeline trigger | `push`, `merge_request_event` |\n\n## Next Steps\n\n- [[github-actions|GitHub Actions Guide]] - GitHub Actions workflows\n- [[../deployment|Deployment Guide]] - Manual deployment options\n- [GitLab CI/CD Documentation](https://docs.gitlab.com/ee/ci/) - Official docs\n",
      "summary": "Complete guide to building and deploying markata-go sites with GitLab CI",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "documentation",
        "ci-cd",
        "deployment",
        "gitlab"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/ci-cd/github-actions/",
      "url": "https://markata.dev/docs/guides/ci-cd/github-actions/",
      "title": "GitHub Actions CI/CD",
      "content_html": "\u003cp\u003eGitHub Actions provides powerful CI/CD capabilities directly integrated with your GitHub repository. This guide covers everything from basic deployments to advanced multi-environment setups.\u003c/p\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCreate \u003ccode\u003e.github/workflows/deploy.yml\u003c/code\u003e in your repository:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy Site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eworkflow_dispatch\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epermissions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eread\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eid-token\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild-and-deploy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub-pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ steps.deployment.outputs.page_url }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          wget -qO- \u0026#34;https://github.com/WaylonWalker/markata-go/releases/latest/download/markata-go_linux_x86_64.tar.gz\u0026#34; | tar xz\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          sudo mv markata-go /usr/local/bin/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/configure-pages@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eUpload artifact\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/upload-pages-artifact@v3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e./public\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy to GitHub Pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeployment\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/deploy-pages@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEnable GitHub Pages in your repository settings:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eGo to \u003cstrong\u003eSettings\u003c/strong\u003e \u0026gt; \u003cstrong\u003ePages\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eUnder \u003cstrong\u003eSource\u003c/strong\u003e, select \u003cstrong\u003eGitHub Actions\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003ePush to \u003ccode\u003emain\u003c/code\u003e to trigger the workflow\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"github-pages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGitHub Pages\u003c/span\u003e \u003ca href=\"#github-pages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"basic-deployment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Deployment\u003c/span\u003e \u003ca href=\"#basic-deployment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe workflow above deploys to GitHub Pages using the modern Actions-based approach. Key components:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePermissions\u003c/strong\u003e - Required for the \u003ccode\u003edeploy-pages\u003c/code\u003e action:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epermissions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eread   \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Read repository\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite     \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Deploy to Pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eid-token\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite  \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# OIDC token for deployment\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eEnvironment\u003c/strong\u003e - Links the job to the GitHub Pages environment:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub-pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ steps.deployment.outputs.page_url }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"custom-domain\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Domain\u003c/span\u003e \u003ca href=\"#custom-domain\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTo use a custom domain:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCreate \u003ccode\u003estatic/CNAME\u003c/code\u003e with your domain:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre\u003e\u003ccode\u003eexample.com\n\u003c/code\u003e\u003c/pre\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003eUpdate your workflow:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003col start=\"3\"\u003e\n\u003cli\u003eConfigure DNS at your registrar:\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eApex domain\u003c/strong\u003e: Add \u003ccode\u003eA\u003c/code\u003e records pointing to GitHub\u0026rsquo;s IPs\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSubdomain\u003c/strong\u003e: Add a \u003ccode\u003eCNAME\u003c/code\u003e record to \u003ccode\u003e\u0026lt;username\u0026gt;.github.io\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"project-sites-vs-user-sites\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProject Sites vs User Sites\u003c/span\u003e \u003ca href=\"#project-sites-vs-user-sites\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eRepository Name\u003c/th\u003e\n\u003cth\u003eURL\u003c/th\u003e\n\u003cth\u003eBranch\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eUser/Org\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eusername.github.io\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehttps://username.github.io\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emain\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eProject\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eAny name\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehttps://username.github.io/repo-name\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emain\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eFor project sites, ensure your base URL includes the repository name:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://username.github.io/repo-name\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"netlify\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNetlify\u003c/span\u003e \u003ca href=\"#netlify\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDeploy to Netlify using GitHub Actions for more control over the build process.\u003c/p\u003e\n\u003ch3 id=\"basic-netlify-deployment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Netlify Deployment\u003c/span\u003e \u003ca href=\"#basic-netlify-deployment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy to Netlify\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild-and-deploy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          wget -qO- \u0026#34;https://github.com/WaylonWalker/markata-go/releases/latest/download/markata-go_linux_x86_64.tar.gz\u0026#34; | tar xz\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          sudo mv markata-go /usr/local/bin/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ github.event_name == \u0026#39;push\u0026#39; \u0026amp;\u0026amp; \u0026#39;https://example.netlify.app\u0026#39; || \u0026#39;\u0026#39; }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy to Netlify\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enwtgck/actions-netlify@v3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epublish-dir\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e./public\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eproduction-branch\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eproduction-deploy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ github.event_name == \u0026#39;push\u0026#39; }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003edeploy-message\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Deploy from GitHub Actions\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003egithub-token\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eNETLIFY_AUTH_TOKEN\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.NETLIFY_AUTH_TOKEN }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eNETLIFY_SITE_ID\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.NETLIFY_SITE_ID }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eSetup:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCreate a Netlify site and note the Site ID\u003c/li\u003e\n\u003cli\u003eGenerate a Personal Access Token in Netlify (User Settings \u0026gt; Applications)\u003c/li\u003e\n\u003cli\u003eAdd secrets to your repository:\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eNETLIFY_AUTH_TOKEN\u003c/code\u003e - Your personal access token\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eNETLIFY_SITE_ID\u003c/code\u003e - Your site\u0026rsquo;s API ID\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"netlify-with-deploy-previews\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNetlify with Deploy Previews\u003c/span\u003e \u003ca href=\"#netlify-with-deploy-previews\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe workflow above automatically creates deploy previews for pull requests. The preview URL is posted as a comment on the PR.\u003c/p\u003e\n\u003ch2 id=\"cloudflare-pages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCloudflare Pages\u003c/span\u003e \u003ca href=\"#cloudflare-pages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDeploy to Cloudflare Pages for fast global CDN delivery.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy to Cloudflare Pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild-and-deploy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epermissions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eread\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003edeployments\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003epull-requests\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          wget -qO- \u0026#34;https://github.com/WaylonWalker/markata-go/releases/latest/download/markata-go_linux_x86_64.tar.gz\u0026#34; | tar xz\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          sudo mv markata-go /usr/local/bin/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ github.event_name == \u0026#39;push\u0026#39; \u0026amp;\u0026amp; \u0026#39;https://example.pages.dev\u0026#39; || \u0026#39;\u0026#39; }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy to Cloudflare Pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecloudflare/pages-action@v1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eapiToken\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.CLOUDFLARE_API_TOKEN }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eaccountId\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.CLOUDFLARE_ACCOUNT_ID }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eprojectName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emy-site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003edirectory\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003egitHubToken\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eSetup:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCreate a Cloudflare Pages project\u003c/li\u003e\n\u003cli\u003eGenerate an API token with \u0026ldquo;Cloudflare Pages:Edit\u0026rdquo; permission\u003c/li\u003e\n\u003cli\u003eAdd secrets:\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eCLOUDFLARE_API_TOKEN\u003c/code\u003e - Your API token\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eCLOUDFLARE_ACCOUNT_ID\u003c/code\u003e - Your account ID\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"aws-s3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAWS S3\u003c/span\u003e \u003ca href=\"#aws-s3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDeploy to Amazon S3 for scalable static hosting.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy to S3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild-and-deploy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          wget -qO- \u0026#34;https://github.com/WaylonWalker/markata-go/releases/latest/download/markata-go_linux_x86_64.tar.gz\u0026#34; | tar xz\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          sudo mv markata-go /usr/local/bin/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eConfigure AWS credentials\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eaws-actions/configure-aws-credentials@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eaws-access-key-id\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.AWS_ACCESS_KEY_ID }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eaws-secret-access-key\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.AWS_SECRET_ACCESS_KEY }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eaws-region\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eus-east-1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSync to S3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          aws s3 sync ./public s3://${{ vars.S3_BUCKET }} \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --delete \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --cache-control \u0026#34;max-age=31536000\u0026#34; \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --exclude \u0026#34;*.html\u0026#34; \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --exclude \u0026#34;*.xml\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          # HTML and XML with shorter cache\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          aws s3 sync ./public s3://${{ vars.S3_BUCKET }} \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --cache-control \u0026#34;max-age=0, must-revalidate\u0026#34; \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --include \u0026#34;*.html\u0026#34; \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --include \u0026#34;*.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInvalidate CloudFront\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003evars.CLOUDFRONT_DISTRIBUTION_ID != \u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          aws cloudfront create-invalidation \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --distribution-id ${{ vars.CLOUDFRONT_DISTRIBUTION_ID }} \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            --paths \u0026#34;/*\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eSetup:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCreate an S3 bucket configured for static website hosting\u003c/li\u003e\n\u003cli\u003eCreate an IAM user with S3 and CloudFront permissions\u003c/li\u003e\n\u003cli\u003eAdd secrets and variables:\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eAWS_ACCESS_KEY_ID\u003c/code\u003e - IAM access key\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eAWS_SECRET_ACCESS_KEY\u003c/code\u003e - IAM secret key\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eS3_BUCKET\u003c/code\u003e - Bucket name (variable)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eCLOUDFRONT_DISTRIBUTION_ID\u003c/code\u003e - Optional CloudFront distribution\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"preview-deployments\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePreview Deployments\u003c/span\u003e \u003ca href=\"#preview-deployments\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCreate preview deployments for pull requests to review changes before merging.\u003c/p\u003e\n\u003ch3 id=\"github-pages-preview-custom-approach\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGitHub Pages Preview (Custom Approach)\u003c/span\u003e \u003ca href=\"#github-pages-preview-custom-approach\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDeploy PR previews to subdirectories on GitHub Pages:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ePR Preview\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003etypes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003eopened, synchronize, reopened]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epermissions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull-requests\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epreview\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          wget -qO- \u0026#34;https://github.com/WaylonWalker/markata-go/releases/latest/download/markata-go_linux_x86_64.tar.gz\u0026#34; | tar xz\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          sudo mv markata-go /usr/local/bin/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/pr-${{ github.event.number }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy Preview\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epeaceiris/actions-gh-pages@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003egithub_token\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epublish_dir\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e./public\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003edestination_dir\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epr-${{ github.event.number }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eComment on PR\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/github-script@v7\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            const url = `https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/pr-${{ github.event.number }}/`;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            const body = `## Preview Deployment\\n\\nYour preview is ready!\\n\\n${url}`;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            // Find existing comment\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            const { data: comments } = await github.rest.issues.listComments({\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              owner: context.repo.owner,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              repo: context.repo.repo,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              issue_number: context.issue.number,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            });\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            const botComment = comments.find(c =\u0026gt; \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              c.user.type === \u0026#39;Bot\u0026#39; \u0026amp;\u0026amp; c.body.includes(\u0026#39;Preview Deployment\u0026#39;)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            );\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            if (botComment) {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              await github.rest.issues.updateComment({\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e                owner: context.repo.owner,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e                repo: context.repo.repo,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e                comment_id: botComment.id,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e                body: body,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              });\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            } else {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              await github.rest.issues.createComment({\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e                owner: context.repo.owner,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e                repo: context.repo.repo,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e                issue_number: context.issue.number,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e                body: body,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              });\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            }\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"cleanup-preview-on-pr-close\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCleanup Preview on PR Close\u003c/span\u003e \u003ca href=\"#cleanup-preview-on-pr-close\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCleanup PR Preview\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003etypes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003eclosed]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epermissions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecleanup\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eref\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egh-pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eRemove preview directory\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          rm -rf pr-${{ github.event.number }}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git config user.name \u0026#34;github-actions[bot]\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git config user.email \u0026#34;github-actions[bot]@users.noreply.github.com\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git add -A\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git commit -m \u0026#34;Remove preview for PR #${{ github.event.number }}\u0026#34; || exit 0\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          git push\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"multi-environment-deployments\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMulti-Environment Deployments\u003c/span\u003e \u003ca href=\"#multi-environment-deployments\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDeploy to staging and production environments with different configurations.\u003c/p\u003e\n\u003ch3 id=\"staging-and-production\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStaging and Production\u003c/span\u003e \u003ca href=\"#staging-and-production\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003edevelop\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eoutputs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifact-id\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ steps.upload.outputs.artifact-id }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          wget -qO- \u0026#34;https://github.com/WaylonWalker/markata-go/releases/latest/download/markata-go_linux_x86_64.tar.gz\u0026#34; | tar xz\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          sudo mv markata-go /usr/local/bin/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDetermine environment\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eenv\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          if [[ \u0026#34;${{ github.ref }}\u0026#34; == \u0026#34;refs/heads/main\u0026#34; ]]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            echo \u0026#34;name=production\u0026#34; \u0026gt;\u0026gt; $GITHUB_OUTPUT\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            echo \u0026#34;url=https://example.com\u0026#34; \u0026gt;\u0026gt; $GITHUB_OUTPUT\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          else\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            echo \u0026#34;name=staging\u0026#34; \u0026gt;\u0026gt; $GITHUB_OUTPUT\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            echo \u0026#34;url=https://staging.example.com\u0026#34; \u0026gt;\u0026gt; $GITHUB_OUTPUT\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          fi\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ steps.env.outputs.url }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eUpload artifact\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eupload\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/upload-artifact@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esite-${{ steps.env.outputs.name }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e./public\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eretention-days\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edeploy-staging\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub.ref == \u0026#39;refs/heads/develop\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003estaging\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://staging.example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDownload artifact\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/download-artifact@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esite-staging\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e./public\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy to staging\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          # Your staging deployment command\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          echo \u0026#34;Deploying to staging...\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edeploy-production\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub.ref == \u0026#39;refs/heads/main\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eproduction\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDownload artifact\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/download-artifact@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esite-production\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e./public\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy to production\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          # Your production deployment command\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          echo \u0026#34;Deploying to production...\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"manual-production-deployment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eManual Production Deployment\u003c/span\u003e \u003ca href=\"#manual-production-deployment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eRequire manual approval for production deployments:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eGo to \u003cstrong\u003eSettings\u003c/strong\u003e \u0026gt; \u003cstrong\u003eEnvironments\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eCreate a \u003ccode\u003eproduction\u003c/code\u003e environment\u003c/li\u003e\n\u003cli\u003eEnable \u003cstrong\u003eRequired reviewers\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eAdd team members who can approve\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThe workflow will pause at the \u003ccode\u003edeploy-production\u003c/code\u003e job until approved.\u003c/p\u003e\n\u003ch2 id=\"caching-strategies\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCaching Strategies\u003c/span\u003e \u003ca href=\"#caching-strategies\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSpeed up builds by caching dependencies and build artifacts.\u003c/p\u003e\n\u003ch3 id=\"cache-markata-go-binary\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCache markata-go Binary\u003c/span\u003e \u003ca href=\"#cache-markata-go-binary\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCache markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecache-markata\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/cache@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/usr/local/bin/markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go-${{ runner.os }}-v0.1.0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esteps.cache-markata.outputs.cache-hit != \u0026#39;true\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    wget -qO- \u0026#34;https://github.com/WaylonWalker/markata-go/releases/download/v0.1.0/markata-go_0.1.0_linux_x86_64.tar.gz\u0026#34; | tar xz\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    sudo mv markata-go /usr/local/bin/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"cache-go-modules-if-building-from-source\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCache Go Modules (if building from source)\u003c/span\u003e \u003ca href=\"#cache-go-modules-if-building-from-source\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-go@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ego-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1.22\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ego install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"full-workflow-with-caching\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFull Workflow with Caching\u003c/span\u003e \u003ca href=\"#full-workflow-with-caching\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy with Caching\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epermissions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eread\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eid-token\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003econcurrency\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003egroup\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecancel-in-progress\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003efetch-depth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Full history for git dates\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCache markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecache-markata\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/cache@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/usr/local/bin/markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go-${{ runner.os }}-v0.1.0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esteps.cache-markata.outputs.cache-hit != \u0026#39;true\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          wget -qO- \u0026#34;https://github.com/WaylonWalker/markata-go/releases/download/v0.1.0/markata-go_0.1.0_linux_x86_64.tar.gz\u0026#34; | tar xz\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          sudo mv markata-go /usr/local/bin/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eUpload artifact\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/upload-pages-artifact@v3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e./public\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edeploy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub-pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ steps.deployment.outputs.page_url }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy to GitHub Pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeployment\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/deploy-pages@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"scheduled-builds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eScheduled Builds\u003c/span\u003e \u003ca href=\"#scheduled-builds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRebuild your site on a schedule (useful for dynamic content or expired dates):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eScheduled Build\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eschedule\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# Run daily at midnight UTC\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003ecron\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;0 0 * * *\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eworkflow_dispatch\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Allow manual trigger\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epermissions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eread\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eid-token\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild-and-deploy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# ... same as basic deployment\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"workflow-not-running\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWorkflow Not Running\u003c/span\u003e \u003ca href=\"#workflow-not-running\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eCheck that the workflow file is in \u003ccode\u003e.github/workflows/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eVerify the branch name matches your trigger\u003c/li\u003e\n\u003cli\u003eCheck \u003cstrong\u003eActions\u003c/strong\u003e tab for any errors\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"permission-denied\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePermission Denied\u003c/span\u003e \u003ca href=\"#permission-denied\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnsure your workflow has the required permissions:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epermissions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eread\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eid-token\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"deployment-shows-old-content\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeployment Shows Old Content\u003c/span\u003e \u003ca href=\"#deployment-shows-old-content\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eCheck that \u003ccode\u003e--clean\u003c/code\u003e flag is used\u003c/li\u003e\n\u003cli\u003eVerify the build completed successfully\u003c/li\u003e\n\u003cli\u003eCheck for caching issues - try clearing the cache\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"404-on-github-pages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e404 on GitHub Pages\u003c/span\u003e \u003ca href=\"#404-on-github-pages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eVerify GitHub Pages is enabled in repository settings\u003c/li\u003e\n\u003cli\u003eCheck that \u003ccode\u003eindex.html\u003c/code\u003e exists in the output\u003c/li\u003e\n\u003cli\u003eFor project sites, ensure base URL includes repository name\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"build-fails-with-memory-error\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Fails with Memory Error\u003c/span\u003e \u003ca href=\"#build-fails-with-memory-error\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor large sites, increase available memory:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eGOMEMLIMIT\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e4GiB\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext Steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[[gitlab-ci|GitLab CI Guide]] - GitLab CI/CD pipelines\u003c/li\u003e\n\u003cli\u003e[[../deployment|Deployment Guide]] - Manual deployment options\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.github.com/en/actions\"\u003eGitHub Actions Documentation\u003c/a\u003e - Official docs\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nGitHub Actions provides powerful CI/CD capabilities directly integrated with your GitHub repository. This guide covers everything from basic deployments to advanced multi-environment setups.\n\n## Quick Start\n\nCreate `.github/workflows/deploy.yml` in your repository:\n\n```yaml\nname: Deploy Site\n\non:\n  push:\n    branches: [main]\n  workflow_dispatch:\n\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\njobs:\n  build-and-deploy:\n    runs-on: ubuntu-latest\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Install markata-go\n        run: |\n          wget -qO- \"https://github.com/WaylonWalker/markata-go/releases/latest/download/markata-go_linux_x86_64.tar.gz\" | tar xz\n          sudo mv markata-go /usr/local/bin/\n\n      - name: Build site\n        run: markata-go build --clean\n        env:\n          MARKATA_GO_URL: https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}\n\n      - name: Setup Pages\n        uses: actions/configure-pages@v4\n\n      - name: Upload artifact\n        uses: actions/upload-pages-artifact@v3\n        with:\n          path: ./public\n\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v4\n```\n\nEnable GitHub Pages in your repository settings:\n\n1. Go to **Settings** \u003e **Pages**\n2. Under **Source**, select **GitHub Actions**\n3. Push to `main` to trigger the workflow\n\n## GitHub Pages\n\n### Basic Deployment\n\nThe workflow above deploys to GitHub Pages using the modern Actions-based approach. Key components:\n\n**Permissions** - Required for the `deploy-pages` action:\n\n```yaml\npermissions:\n  contents: read    # Read repository\n  pages: write      # Deploy to Pages\n  id-token: write   # OIDC token for deployment\n```\n\n**Environment** - Links the job to the GitHub Pages environment:\n\n```yaml\nenvironment:\n  name: github-pages\n  url: ${{ steps.deployment.outputs.page_url }}\n```\n\n### Custom Domain\n\nTo use a custom domain:\n\n1. Create `static/CNAME` with your domain:\n\n```\nexample.com\n```\n\n2. Update your workflow:\n\n```yaml\n- name: Build site\n  run: markata-go build --clean\n  env:\n    MARKATA_GO_URL: https://example.com\n```\n\n3. Configure DNS at your registrar:\n   - **Apex domain**: Add `A` records pointing to GitHub's IPs\n   - **Subdomain**: Add a `CNAME` record to `\u003cusername\u003e.github.io`\n\n### Project Sites vs User Sites\n\n| Type | Repository Name | URL | Branch |\n|------|----------------|-----|--------|\n| **User/Org** | `username.github.io` | `https://username.github.io` | `main` |\n| **Project** | Any name | `https://username.github.io/repo-name` | `main` |\n\nFor project sites, ensure your base URL includes the repository name:\n\n```yaml\nenv:\n  MARKATA_GO_URL: https://username.github.io/repo-name\n```\n\n## Netlify\n\nDeploy to Netlify using GitHub Actions for more control over the build process.\n\n### Basic Netlify Deployment\n\n```yaml\nname: Deploy to Netlify\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n\njobs:\n  build-and-deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Install markata-go\n        run: |\n          wget -qO- \"https://github.com/WaylonWalker/markata-go/releases/latest/download/markata-go_linux_x86_64.tar.gz\" | tar xz\n          sudo mv markata-go /usr/local/bin/\n\n      - name: Build site\n        run: markata-go build --clean\n        env:\n          MARKATA_GO_URL: ${{ github.event_name == 'push' \u0026\u0026 'https://example.netlify.app' || '' }}\n\n      - name: Deploy to Netlify\n        uses: nwtgck/actions-netlify@v3\n        with:\n          publish-dir: ./public\n          production-branch: main\n          production-deploy: ${{ github.event_name == 'push' }}\n          deploy-message: \"Deploy from GitHub Actions\"\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n        env:\n          NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}\n          NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}\n```\n\n**Setup:**\n\n1. Create a Netlify site and note the Site ID\n2. Generate a Personal Access Token in Netlify (User Settings \u003e Applications)\n3. Add secrets to your repository:\n   - `NETLIFY_AUTH_TOKEN` - Your personal access token\n   - `NETLIFY_SITE_ID` - Your site's API ID\n\n### Netlify with Deploy Previews\n\nThe workflow above automatically creates deploy previews for pull requests. The preview URL is posted as a comment on the PR.\n\n## Cloudflare Pages\n\nDeploy to Cloudflare Pages for fast global CDN delivery.\n\n```yaml\nname: Deploy to Cloudflare Pages\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n\njobs:\n  build-and-deploy:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      deployments: write\n      pull-requests: write\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Install markata-go\n        run: |\n          wget -qO- \"https://github.com/WaylonWalker/markata-go/releases/latest/download/markata-go_linux_x86_64.tar.gz\" | tar xz\n          sudo mv markata-go /usr/local/bin/\n\n      - name: Build site\n        run: markata-go build --clean\n        env:\n          MARKATA_GO_URL: ${{ github.event_name == 'push' \u0026\u0026 'https://example.pages.dev' || '' }}\n\n      - name: Deploy to Cloudflare Pages\n        uses: cloudflare/pages-action@v1\n        with:\n          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}\n          accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}\n          projectName: my-site\n          directory: public\n          gitHubToken: ${{ secrets.GITHUB_TOKEN }}\n```\n\n**Setup:**\n\n1. Create a Cloudflare Pages project\n2. Generate an API token with \"Cloudflare Pages:Edit\" permission\n3. Add secrets:\n   - `CLOUDFLARE_API_TOKEN` - Your API token\n   - `CLOUDFLARE_ACCOUNT_ID` - Your account ID\n\n## AWS S3\n\nDeploy to Amazon S3 for scalable static hosting.\n\n```yaml\nname: Deploy to S3\n\non:\n  push:\n    branches: [main]\n\njobs:\n  build-and-deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Install markata-go\n        run: |\n          wget -qO- \"https://github.com/WaylonWalker/markata-go/releases/latest/download/markata-go_linux_x86_64.tar.gz\" | tar xz\n          sudo mv markata-go /usr/local/bin/\n\n      - name: Build site\n        run: markata-go build --clean\n        env:\n          MARKATA_GO_URL: https://example.com\n\n      - name: Configure AWS credentials\n        uses: aws-actions/configure-aws-credentials@v4\n        with:\n          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n          aws-region: us-east-1\n\n      - name: Sync to S3\n        run: |\n          aws s3 sync ./public s3://${{ vars.S3_BUCKET }} \\\n            --delete \\\n            --cache-control \"max-age=31536000\" \\\n            --exclude \"*.html\" \\\n            --exclude \"*.xml\"\n          \n          # HTML and XML with shorter cache\n          aws s3 sync ./public s3://${{ vars.S3_BUCKET }} \\\n            --cache-control \"max-age=0, must-revalidate\" \\\n            --include \"*.html\" \\\n            --include \"*.xml\"\n\n      - name: Invalidate CloudFront\n        if: vars.CLOUDFRONT_DISTRIBUTION_ID != ''\n        run: |\n          aws cloudfront create-invalidation \\\n            --distribution-id ${{ vars.CLOUDFRONT_DISTRIBUTION_ID }} \\\n            --paths \"/*\"\n```\n\n**Setup:**\n\n1. Create an S3 bucket configured for static website hosting\n2. Create an IAM user with S3 and CloudFront permissions\n3. Add secrets and variables:\n   - `AWS_ACCESS_KEY_ID` - IAM access key\n   - `AWS_SECRET_ACCESS_KEY` - IAM secret key\n   - `S3_BUCKET` - Bucket name (variable)\n   - `CLOUDFRONT_DISTRIBUTION_ID` - Optional CloudFront distribution\n\n## Preview Deployments\n\nCreate preview deployments for pull requests to review changes before merging.\n\n### GitHub Pages Preview (Custom Approach)\n\nDeploy PR previews to subdirectories on GitHub Pages:\n\n```yaml\nname: PR Preview\n\non:\n  pull_request:\n    types: [opened, synchronize, reopened]\n\npermissions:\n  contents: write\n  pull-requests: write\n\njobs:\n  preview:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Install markata-go\n        run: |\n          wget -qO- \"https://github.com/WaylonWalker/markata-go/releases/latest/download/markata-go_linux_x86_64.tar.gz\" | tar xz\n          sudo mv markata-go /usr/local/bin/\n\n      - name: Build site\n        run: markata-go build --clean\n        env:\n          MARKATA_GO_URL: https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/pr-${{ github.event.number }}\n\n      - name: Deploy Preview\n        uses: peaceiris/actions-gh-pages@v4\n        with:\n          github_token: ${{ secrets.GITHUB_TOKEN }}\n          publish_dir: ./public\n          destination_dir: pr-${{ github.event.number }}\n\n      - name: Comment on PR\n        uses: actions/github-script@v7\n        with:\n          script: |\n            const url = `https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/pr-${{ github.event.number }}/`;\n            const body = `## Preview Deployment\\n\\nYour preview is ready!\\n\\n${url}`;\n            \n            // Find existing comment\n            const { data: comments } = await github.rest.issues.listComments({\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              issue_number: context.issue.number,\n            });\n            \n            const botComment = comments.find(c =\u003e \n              c.user.type === 'Bot' \u0026\u0026 c.body.includes('Preview Deployment')\n            );\n            \n            if (botComment) {\n              await github.rest.issues.updateComment({\n                owner: context.repo.owner,\n                repo: context.repo.repo,\n                comment_id: botComment.id,\n                body: body,\n              });\n            } else {\n              await github.rest.issues.createComment({\n                owner: context.repo.owner,\n                repo: context.repo.repo,\n                issue_number: context.issue.number,\n                body: body,\n              });\n            }\n```\n\n### Cleanup Preview on PR Close\n\n```yaml\nname: Cleanup PR Preview\n\non:\n  pull_request:\n    types: [closed]\n\npermissions:\n  contents: write\n\njobs:\n  cleanup:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          ref: gh-pages\n\n      - name: Remove preview directory\n        run: |\n          rm -rf pr-${{ github.event.number }}\n          git config user.name \"github-actions[bot]\"\n          git config user.email \"github-actions[bot]@users.noreply.github.com\"\n          git add -A\n          git commit -m \"Remove preview for PR #${{ github.event.number }}\" || exit 0\n          git push\n```\n\n## Multi-Environment Deployments\n\nDeploy to staging and production environments with different configurations.\n\n### Staging and Production\n\n```yaml\nname: Deploy\n\non:\n  push:\n    branches:\n      - main\n      - develop\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    outputs:\n      artifact-id: ${{ steps.upload.outputs.artifact-id }}\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Install markata-go\n        run: |\n          wget -qO- \"https://github.com/WaylonWalker/markata-go/releases/latest/download/markata-go_linux_x86_64.tar.gz\" | tar xz\n          sudo mv markata-go /usr/local/bin/\n\n      - name: Determine environment\n        id: env\n        run: |\n          if [[ \"${{ github.ref }}\" == \"refs/heads/main\" ]]; then\n            echo \"name=production\" \u003e\u003e $GITHUB_OUTPUT\n            echo \"url=https://example.com\" \u003e\u003e $GITHUB_OUTPUT\n          else\n            echo \"name=staging\" \u003e\u003e $GITHUB_OUTPUT\n            echo \"url=https://staging.example.com\" \u003e\u003e $GITHUB_OUTPUT\n          fi\n\n      - name: Build site\n        run: markata-go build --clean\n        env:\n          MARKATA_GO_URL: ${{ steps.env.outputs.url }}\n\n      - name: Upload artifact\n        id: upload\n        uses: actions/upload-artifact@v4\n        with:\n          name: site-${{ steps.env.outputs.name }}\n          path: ./public\n          retention-days: 1\n\n  deploy-staging:\n    needs: build\n    if: github.ref == 'refs/heads/develop'\n    runs-on: ubuntu-latest\n    environment:\n      name: staging\n      url: https://staging.example.com\n    steps:\n      - name: Download artifact\n        uses: actions/download-artifact@v4\n        with:\n          name: site-staging\n          path: ./public\n\n      - name: Deploy to staging\n        run: |\n          # Your staging deployment command\n          echo \"Deploying to staging...\"\n\n  deploy-production:\n    needs: build\n    if: github.ref == 'refs/heads/main'\n    runs-on: ubuntu-latest\n    environment:\n      name: production\n      url: https://example.com\n    steps:\n      - name: Download artifact\n        uses: actions/download-artifact@v4\n        with:\n          name: site-production\n          path: ./public\n\n      - name: Deploy to production\n        run: |\n          # Your production deployment command\n          echo \"Deploying to production...\"\n```\n\n### Manual Production Deployment\n\nRequire manual approval for production deployments:\n\n1. Go to **Settings** \u003e **Environments**\n2. Create a `production` environment\n3. Enable **Required reviewers**\n4. Add team members who can approve\n\nThe workflow will pause at the `deploy-production` job until approved.\n\n## Caching Strategies\n\nSpeed up builds by caching dependencies and build artifacts.\n\n### Cache markata-go Binary\n\n```yaml\n- name: Cache markata-go\n  id: cache-markata\n  uses: actions/cache@v4\n  with:\n    path: /usr/local/bin/markata-go\n    key: markata-go-${{ runner.os }}-v0.1.0\n\n- name: Install markata-go\n  if: steps.cache-markata.outputs.cache-hit != 'true'\n  run: |\n    wget -qO- \"https://github.com/WaylonWalker/markata-go/releases/download/v0.1.0/markata-go_0.1.0_linux_x86_64.tar.gz\" | tar xz\n    sudo mv markata-go /usr/local/bin/\n```\n\n### Cache Go Modules (if building from source)\n\n```yaml\n- name: Setup Go\n  uses: actions/setup-go@v5\n  with:\n    go-version: '1.22'\n    cache: true\n\n- name: Install markata-go\n  run: go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n```\n\n### Full Workflow with Caching\n\n```yaml\nname: Deploy with Caching\n\non:\n  push:\n    branches: [main]\n\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\nconcurrency:\n  group: pages\n  cancel-in-progress: true\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          fetch-depth: 0  # Full history for git dates\n\n      - name: Cache markata-go\n        id: cache-markata\n        uses: actions/cache@v4\n        with:\n          path: /usr/local/bin/markata-go\n          key: markata-go-${{ runner.os }}-v0.1.0\n\n      - name: Install markata-go\n        if: steps.cache-markata.outputs.cache-hit != 'true'\n        run: |\n          wget -qO- \"https://github.com/WaylonWalker/markata-go/releases/download/v0.1.0/markata-go_0.1.0_linux_x86_64.tar.gz\" | tar xz\n          sudo mv markata-go /usr/local/bin/\n\n      - name: Build site\n        run: markata-go build --clean\n        env:\n          MARKATA_GO_URL: https://example.com\n\n      - name: Upload artifact\n        uses: actions/upload-pages-artifact@v3\n        with:\n          path: ./public\n\n  deploy:\n    needs: build\n    runs-on: ubuntu-latest\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    steps:\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v4\n```\n\n## Scheduled Builds\n\nRebuild your site on a schedule (useful for dynamic content or expired dates):\n\n```yaml\nname: Scheduled Build\n\non:\n  schedule:\n    # Run daily at midnight UTC\n    - cron: '0 0 * * *'\n  workflow_dispatch:  # Allow manual trigger\n\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\njobs:\n  build-and-deploy:\n    runs-on: ubuntu-latest\n    steps:\n      # ... same as basic deployment\n```\n\n## Troubleshooting\n\n### Workflow Not Running\n\n- Check that the workflow file is in `.github/workflows/`\n- Verify the branch name matches your trigger\n- Check **Actions** tab for any errors\n\n### Permission Denied\n\nEnsure your workflow has the required permissions:\n\n```yaml\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n```\n\n### Deployment Shows Old Content\n\n1. Check that `--clean` flag is used\n2. Verify the build completed successfully\n3. Check for caching issues - try clearing the cache\n\n### 404 on GitHub Pages\n\n- Verify GitHub Pages is enabled in repository settings\n- Check that `index.html` exists in the output\n- For project sites, ensure base URL includes repository name\n\n### Build Fails with Memory Error\n\nFor large sites, increase available memory:\n\n```yaml\njobs:\n  build:\n    runs-on: ubuntu-latest\n    env:\n      GOMEMLIMIT: 4GiB\n```\n\n## Next Steps\n\n- [[gitlab-ci|GitLab CI Guide]] - GitLab CI/CD pipelines\n- [[../deployment|Deployment Guide]] - Manual deployment options\n- [GitHub Actions Documentation](https://docs.github.com/en/actions) - Official docs\n",
      "summary": "Complete guide to building and deploying markata-go sites with GitHub Actions",
      "date_published": "2026-01-24T00:00:00Z",
      "date_modified": "2026-01-24T00:00:00Z",
      "tags": [
        "documentation",
        "ci-cd",
        "deployment",
        "github-actions"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/post-formats/",
      "url": "https://markata.dev/docs/guides/post-formats/",
      "title": "Post Output Formats",
      "content_html": "\u003cp\u003emarkata-go can generate multiple output formats for each post beyond the standard HTML. This enables use cases like providing raw markdown for API consumers, plain text for accessibility, ANSI terminal output for \u003ccode\u003ecurl\u003c/code\u003e, or generating social media preview cards.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eConfigure output formats in your \u003ccode\u003emarkata-go.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epost_formats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e       \u003cspan class=\"c\"\u003e# Standard HTML (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e   \u003cspan class=\"c\"\u003e# Raw markdown source (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e       \u003cspan class=\"c\"\u003e# Plain text output (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eansi\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e       \u003cspan class=\"c\"\u003e# ANSI terminal output (default: false)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eog\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e         \u003cspan class=\"c\"\u003e# OpenGraph card HTML (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBy default, HTML, Markdown, plain text, and OG formats are enabled. ANSI output is opt-in so you can add rich terminal rendering without introducing escape sequences into existing \u003ccode\u003e.txt\u003c/code\u003e endpoints.\u003c/p\u003e\n\u003ch2 id=\"per-post-overrides\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePer-Post Overrides\u003c/span\u003e \u003ca href=\"#per-post-overrides\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSite config sets the defaults, and individual posts can override them in frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Release Notes\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epost_formats\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eansi\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eog\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eMerge rules:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eomitted keys inherit the site-wide \u003ccode\u003e[markata-go.post_formats]\u003c/code\u003e setting\u003c/li\u003e\n\u003cli\u003especified keys override only that post\u003c/li\u003e\n\u003cli\u003etemplate-visible \u003ccode\u003econfig.post_formats\u003c/code\u003e follows the resolved per-post values, so alternate links and format switchers stay in sync with generated files\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"available-formats\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAvailable Formats\u003c/span\u003e \u003ca href=\"#available-formats\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"html-default\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHTML (default)\u003c/span\u003e \u003ca href=\"#html-default\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe standard HTML output, generated by default.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e \u003ccode\u003e/your-post/index.html\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epost_formats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e  \u003cspan class=\"c\"\u003e# This is the default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"markdown\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMarkdown\u003c/span\u003e \u003ca href=\"#markdown\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOutputs the raw markdown source with reconstructed frontmatter. Useful for:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u0026ldquo;View Source\u0026rdquo; links on your site\u003c/li\u003e\n\u003cli\u003eAPI consumers who want raw content\u003c/li\u003e\n\u003cli\u003eCopy-paste workflows\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e \u003ccode\u003e/your-post.md\u003c/code\u003e (canonical) with redirect from \u003ccode\u003e/your-post/index.md\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epost_formats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Enabled by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe markdown output includes the original frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Your Post Title\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Post description\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2026-01-22\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003eexample\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eYour original markdown content...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"plain-text\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlain Text\u003c/span\u003e \u003ca href=\"#plain-text\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOutputs a plain terminal-friendly version of the rendered page, perfect for:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eStandard web txt files (robots.txt, llms.txt, humans.txt)\u003c/li\u003e\n\u003cli\u003eScreen readers and accessibility tools\u003c/li\u003e\n\u003cli\u003eCommand-line readers (curl, wget)\u003c/li\u003e\n\u003cli\u003eLow-bandwidth situations\u003c/li\u003e\n\u003cli\u003eText-based browsers\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e \u003ccode\u003e/your-post.txt\u003c/code\u003e (canonical) with redirect from \u003ccode\u003e/your-post/index.txt\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epost_formats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Enabled by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe text output includes terminal-safe structure derived from the rendered page:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTitle, description, and date\u003c/li\u003e\n\u003cli\u003eHeadings, links, emphasis, and separators\u003c/li\u003e\n\u003cli\u003eImage and video references as readable URLs\u003c/li\u003e\n\u003cli\u003eBlockquotes, admonitions, lists, and tables\u003c/li\u003e\n\u003cli\u003eReadable code blocks without ANSI escapes\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eExample output:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eMy Post Title\n=============\n\nA description of the post.\n\nDate: January 22, 2026\n\nThe actual content of the post in plain text form...\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"ansi-terminal\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eANSI Terminal\u003c/span\u003e \u003ca href=\"#ansi-terminal\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOutputs a richer terminal-first version of the rendered page with ANSI color and emphasis.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e \u003ccode\u003e/your-post.ansi\u003c/code\u003e (canonical) with redirect from \u003ccode\u003e/your-post/index.ansi\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epost_formats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eansi\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Disabled by default; opt in when you want terminal styling\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eANSI output uses the active site palette when possible and preserves terminal-friendly formatting for:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eheadings and emphasis\u003c/li\u003e\n\u003cli\u003elinks and metadata\u003c/li\u003e\n\u003cli\u003eimage and video references\u003c/li\u003e\n\u003cli\u003eblockquotes and admonitions\u003c/li\u003e\n\u003cli\u003elists, rules, and tables\u003c/li\u003e\n\u003cli\u003esyntax-highlighted code fences\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUse it with \u003ccode\u003ecurl\u003c/code\u003e, \u003ccode\u003eless -R\u003c/code\u003e, or any ANSI-capable pager:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl https://example.com/your-post.ansi\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl https://example.com/your-post.ansi \u003cspan class=\"p\"\u003e|\u003c/span\u003e less -R\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl https://example.com/your-post.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003e/your-post.txt\u003c/code\u003e stays free of ANSI escape codes. \u003ccode\u003e/your-post.ansi\u003c/code\u003e is the explicit opt-in rich terminal variant.\u003c/p\u003e\n\u003ch3 id=\"opengraph-card-og\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOpenGraph Card (OG)\u003c/span\u003e \u003ca href=\"#opengraph-card-og\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGenerates a special HTML page optimized for screenshot tools to create social media preview images. The page is sized at 1200x630 pixels (standard OG image dimensions).\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e \u003ccode\u003e/your-post/og/index.html\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epost_formats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eog\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"using-og-cards-for-social-images\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing OG Cards for Social Images\u003c/span\u003e \u003ca href=\"#using-og-cards-for-social-images\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eThe OG card HTML is designed to be captured by screenshot tools like Puppeteer or Playwright:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Example with Puppeteer\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003ebrowser\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kr\"\u003eawait\u003c/span\u003e \u003cspan class=\"nx\"\u003epuppeteer\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elaunch\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003epage\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kr\"\u003eawait\u003c/span\u003e \u003cspan class=\"nx\"\u003ebrowser\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enewPage\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eawait\u003c/span\u003e \u003cspan class=\"nx\"\u003epage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esetViewport\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e \u003cspan class=\"nx\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1200\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e630\u003c/span\u003e \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eawait\u003c/span\u003e \u003cspan class=\"nx\"\u003epage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"kr\"\u003egoto\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;https://yoursite.com/your-post/og/\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eawait\u003c/span\u003e \u003cspan class=\"nx\"\u003epage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003escreenshot\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e \u003cspan class=\"nx\"\u003epath\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;og-image.png\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe default OG card template includes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePost title (large, prominent)\u003c/li\u003e\n\u003cli\u003eFrontmatter media when present (\u003ccode\u003eimage\u003c/code\u003e → \u003ccode\u003ecover_image\u003c/code\u003e → \u003ccode\u003eog_image\u003c/code\u003e → \u003ccode\u003evideo\u003c/code\u003e, videos render as video tags)\u003c/li\u003e\n\u003cli\u003eAuthor name and site URL\u003c/li\u003e\n\u003cli\u003ePublication date\u003c/li\u003e\n\u003cli\u003eTheme palette and background styling\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eYou can customize the OG card appearance by providing your own \u003ccode\u003epost-og.html\u003c/code\u003e template.\nIf no post-specific OG template exists, \u003ccode\u003eog-card.html\u003c/code\u003e is used as a fallback.\u003c/p\u003e\n\u003ch3 id=\"shared-og-feed-embed-media-helpers\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eShared OG/Feed/Embed Media Helpers\u003c/span\u003e \u003ca href=\"#shared-og-feed-embed-media-helpers\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOG cards, feed cards, and embed cards now share a media pipeline so the same image/video looks identical in every context. All three templates should:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCall \u003ccode\u003ewith_size(width, height)\u003c/code\u003e on photo/video URLs so the generated media query string carries precise \u003ccode\u003ew\u003c/code\u003e and \u003ccode\u003eh\u003c/code\u003e values that align with the pixel dimensions the template renders. Accurate sizing prevents visual drift when downstream screenshot tools or clients ingest the card. Trusted media URLs are normalized to \u003ccode\u003ehttps\u003c/code\u003e first to avoid mixed-content warnings.\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003emedia_url\u003c/code\u003e for raw image metadata fields such as search thumbnails when you need the URL without sizing query parameters.\u003c/li\u003e\n\u003cli\u003eUse the query/fragment-safe \u003ccode\u003eis_video\u003c/code\u003e filter when deciding whether to render a \u003ccode\u003e\u0026lt;video\u0026gt;\u003c/code\u003e tag, and let the \u003ccode\u003eposter_url\u003c/code\u003e helper resolve the poster image.\u003c/li\u003e\n\u003cli\u003eRespect the poster alias precedence: \u003ccode\u003eposter_image\u003c/code\u003e, \u003ccode\u003eposter\u003c/code\u003e, \u003ccode\u003evideo_poster\u003c/code\u003e, \u003ccode\u003evideo_thumbnail\u003c/code\u003e, \u003ccode\u003ethumbnail\u003c/code\u003e, \u003ccode\u003ethumb\u003c/code\u003e. \u003ccode\u003eposter_url\u003c/code\u003e checks those values first, and only when none are defined does it fall back to deriving a \u003ccode\u003e.webp\u003c/code\u003e thumbnail from the video URL on allowlisted hosts.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eOnly relative URLs and media hosted on the safe domain allowlist receive the sizing/presenter treatment. The default allowlist includes \u003ccode\u003edropper.wayl.one\u003c/code\u003e, \u003ccode\u003edropper.waylonwalker.com\u003c/code\u003e, and \u003ccode\u003edropper-dev.wayl.one\u003c/code\u003e, but you can add or override entries via \u003ccode\u003e[markata-go.templates.media]\u003c/code\u003e in your \u003ccode\u003emarkata-go.toml\u003c/code\u003e. Untrusted hosts skip the extra query params and auto-generated posters so you stay in control of which domains get the richer metadata. Custom templates can still opt out entirely by using their own helpers instead of \u003ccode\u003ewith_size\u003c/code\u003e/\u003ccode\u003eposter_url\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"standard-web-txt-files\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStandard Web Txt Files\u003c/span\u003e \u003ca href=\"#standard-web-txt-files\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go supports generating standard web txt files at their expected canonical URLs:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFile\u003c/th\u003e\n\u003cth\u003ePurpose\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/robots.txt\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRobot exclusion standard for web crawlers\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/llms.txt\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAI/LLM guidance file for language models\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/humans.txt\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHuman-readable site credits\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eTo create these, simply add markdown files with the appropriate slugs:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!-- robots.md --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etitle: \u0026#34;Robots\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eslug: robots\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublished: true\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUser-agent: *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAllow: /\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDisallow: /private/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!-- llms.md --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etitle: \u0026#34;LLMs\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eslug: llms\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublished: true\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# LLMs.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis site welcomes AI training on its content.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Guidelines\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e Attribution appreciated\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e Commercial use allowed\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWith text format enabled (default), these generate:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/robots.txt\u003c/code\u003e - The canonical robots.txt file\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/robots/index.txt\u003c/code\u003e - Redirect for backwards compatibility\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/robots/index.txt/index.html\u003c/code\u003e - HTML redirect for static hosts\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/llms.txt\u003c/code\u003e - The canonical llms.txt file\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/llms/index.txt\u003c/code\u003e - Redirect for backwards compatibility\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/llms/index.txt/index.html\u003c/code\u003e - HTML redirect for static hosts\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"reversed-redirects\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReversed Redirects\u003c/span\u003e \u003ca href=\"#reversed-redirects\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor \u003ccode\u003e.txt\u003c/code\u003e, \u003ccode\u003e.ansi\u003c/code\u003e, and \u003ccode\u003e.md\u003c/code\u003e formats, markata-go uses \u003cstrong\u003ereversed redirects\u003c/strong\u003e to ensure content is at the canonical URL:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCanonical Location\u003c/th\u003e\n\u003cth\u003eRedirect From\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/my-post.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/my-post/index.md\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/my-post.txt\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/my-post/index.txt\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/my-post.ansi\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/my-post/index.ansi\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThis is the opposite of HTML, which uses directory-based URLs:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCanonical Location\u003c/th\u003e\n\u003cth\u003eRedirect From\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/my-post/index.html\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/my-post.html\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe reversed approach ensures standard web files like \u003ccode\u003erobots.txt\u003c/code\u003e work correctly while maintaining backwards compatibility with directory-based URLs.\u003c/p\u003e\n\u003ch2 id=\"clean-urls\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eClean URLs\u003c/span\u003e \u003ca href=\"#clean-urls\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go generates both canonical files and redirects for maximum compatibility:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eUser requests\u003c/th\u003e\n\u003cth\u003eCanonical file\u003c/th\u003e\n\u003cth\u003eNotes\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/my-post.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/my-post.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDirect access to canonical\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/my-post/index.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRedirects to \u003ccode\u003e/my-post.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBackwards compatibility\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/my-post.txt\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/my-post.txt\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDirect access to canonical\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/my-post/index.txt\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRedirects to \u003ccode\u003e/my-post.txt\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBackwards compatibility\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThis means users can use either URL style:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# All of these work:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl https://example.com/my-post.md         \u003cspan class=\"c1\"\u003e# Canonical\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl https://example.com/my-post/index.md   \u003cspan class=\"c1\"\u003e# Redirects to canonical\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Standard web txt files work at expected URLs:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl https://example.com/robots.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl https://example.com/llms.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe redirects use HTML meta refresh for maximum compatibility across browsers and HTTP clients.\u003c/p\u003e\n\u003ch2 id=\"visible-format-links\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVisible Format Links\u003c/span\u003e \u003ca href=\"#visible-format-links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen you enable alternate formats, markata-go automatically displays format links on your posts and feeds. These appear in the post footer (for posts) or feed header (for feeds).\u003c/p\u003e\n\u003cp\u003eFor posts with \u003ccode\u003emarkdown\u003c/code\u003e, \u003ccode\u003etext\u003c/code\u003e, or \u003ccode\u003eog\u003c/code\u003e enabled, visitors see:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eView as:\u003c/strong\u003e Markdown | Text | Card\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFor feeds, visitors see subscription options:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eSubscribe:\u003c/strong\u003e RSS | Atom | JSON | Markdown | Text\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"copying-posts-for-chat-and-notes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCopying Posts for Chat and Notes\u003c/span\u003e \u003ca href=\"#copying-posts-for-chat-and-notes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePost pages also expose a \u003ccode\u003eCopy this post\u003c/code\u003e control near the top of the article. It is designed for the common workflow of dropping a post into Slack, Teams, notes apps, or a code editor without manually selecting the page. Set \u003ccode\u003ecomponents.post_copy.enabled = false\u003c/code\u003e to hide the menu without disabling the post-format files (see \u003ca href=\"/docs/guides/configuration/#share-component-markata-gocomponentsshare\"\u003eConfiguration\u003c/a\u003e).\u003c/p\u003e\n\u003cp\u003eAvailable copy modes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eURL\u003c/code\u003e - copies the canonical post URL.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eRich\u003c/code\u003e - copies HTML plus plain text so chat clients can preserve headings, links, and formatting when they support rich paste.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eMarkdown\u003c/code\u003e - copies the post title, URL, and raw markdown body.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eText\u003c/code\u003e - copies the post title, URL, and a plain-text rendering of the article.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe rich option uses the browser clipboard API to write both \u003ccode\u003etext/html\u003c/code\u003e and \u003ccode\u003etext/plain\u003c/code\u003e payloads. When that API is unavailable, markata-go falls back to plain-text clipboard writes so copying still works in older browsers.\u003c/p\u003e\n\u003ch2 id=\"content-negotiation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContent Negotiation\u003c/span\u003e \u003ca href=\"#content-negotiation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go\u0026rsquo;s canonical short URLs (\u003ccode\u003e/slug.md\u003c/code\u003e, \u003ccode\u003e/slug.txt\u003c/code\u003e) plus HTML directory pages (\u003ccode\u003e/slug/index.html\u003c/code\u003e) enable server-side content negotiation. This allows clients to request their preferred format using HTTP \u003ccode\u003eAccept\u003c/code\u003e headers.\u003c/p\u003e\n\u003ch3 id=\"how-it-works\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow It Works\u003c/span\u003e \u003ca href=\"#how-it-works\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eInstead of requesting a specific file, clients request the directory URL:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eGET /my-post/\nAccept: text/plain\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe server returns the appropriate format based on the \u003ccode\u003eAccept\u003c/code\u003e header.\u003c/p\u003e\n\u003ch3 id=\"nginx-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNginx Configuration\u003c/span\u003e \u003ca href=\"#nginx-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eserver\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elisten\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eserver_name\u003c/span\u003e \u003cspan class=\"s\"\u003eexample.com\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eroot\u003c/span\u003e \u003cspan class=\"s\"\u003e/var/www/html\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# MIME types for txt/md files\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"p\"\u003e~\u003c/span\u003e \u003cspan class=\"sr\"\u003e\\.(txt|md)$\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003edefault_type\u003c/span\u003e \u003cspan class=\"s\"\u003etext/plain\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003echarset\u003c/span\u003e \u003cspan class=\"s\"\u003eutf-8\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"s\"\u003e/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e# Try exact file first (for /robots.txt), then negotiate by Accept header\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003etry_files\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri/index.html\u003c/span\u003e \u003cspan class=\"s\"\u003e@negotiate\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"s\"\u003e@negotiate\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e# Map Accept header to file extension\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eset\u003c/span\u003e \u003cspan class=\"nv\"\u003e$ext\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;html\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eif\u003c/span\u003e \u003cspan class=\"s\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$http_accept\u003c/span\u003e \u003cspan class=\"p\"\u003e~\u003c/span\u003e\u003cspan class=\"sr\"\u003e*\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;text/plain\u0026#34;)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kn\"\u003eset\u003c/span\u003e \u003cspan class=\"nv\"\u003e$ext\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;txt\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eif\u003c/span\u003e \u003cspan class=\"s\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$http_accept\u003c/span\u003e \u003cspan class=\"p\"\u003e~\u003c/span\u003e\u003cspan class=\"sr\"\u003e*\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;text/markdown\u0026#34;)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kn\"\u003eset\u003c/span\u003e \u003cspan class=\"nv\"\u003e$ext\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e# Strip trailing slash for canonical format files\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eset\u003c/span\u003e \u003cspan class=\"nv\"\u003e$base\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eif\u003c/span\u003e \u003cspan class=\"s\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$base\u003c/span\u003e \u003cspan class=\"p\"\u003e~\u003c/span\u003e \u003cspan class=\"sr\"\u003e\u0026#34;^(.+)/$\u0026#34;)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kn\"\u003eset\u003c/span\u003e \u003cspan class=\"nv\"\u003e$base\u003c/span\u003e \u003cspan class=\"nv\"\u003e$1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e# Try the negotiated format, falling back to index.html\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003etry_files\u003c/span\u003e \u003cspan class=\"nv\"\u003e$base.$ext\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri/index.html\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e404\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eNote:\u003c/strong\u003e The \u003ccode\u003etry_files\u003c/code\u003e order is important. Files like \u003ccode\u003e/robots.txt\u003c/code\u003e are served directly because \u003ccode\u003e$uri\u003c/code\u003e matches the exact file before falling back to content negotiation.\u003c/p\u003e\n\u003ch3 id=\"caddy-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCaddy Configuration\u003c/span\u003e \u003ca href=\"#caddy-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003eexample.com\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eroot\u003c/span\u003e \u003cspan class=\"nd\"\u003e*\u003c/span\u003e \u003cspan class=\"s\"\u003e/var/www/html\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efile_server\u003c/span\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e    # MIME types for txt/md files\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@txtmd\u003c/span\u003e \u003cspan class=\"k\"\u003epath\u003c/span\u003e \u003cspan class=\"s\"\u003e*.txt\u003c/span\u003e \u003cspan class=\"s\"\u003e*.md\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eheader\u003c/span\u003e \u003cspan class=\"nd\"\u003e@txtmd\u003c/span\u003e \u003cspan class=\"s\"\u003eContent-Type\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;text/plain; charset=utf-8\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@wantsText\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eheader\u003c/span\u003e \u003cspan class=\"s\"\u003eAccept\u003c/span\u003e \u003cspan class=\"s\"\u003e*text/plain*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@wantsMarkdown\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eheader\u003c/span\u003e \u003cspan class=\"s\"\u003eAccept\u003c/span\u003e \u003cspan class=\"s\"\u003e*text/markdown*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e    # Rewrite to plain text when requested\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ehandle\u003c/span\u003e \u003cspan class=\"nd\"\u003e@wantsText\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003euri\u003c/span\u003e \u003cspan class=\"no\"\u003estrip_suffix\u003c/span\u003e \u003cspan class=\"s\"\u003e/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003erewrite\u003c/span\u003e \u003cspan class=\"nd\"\u003e*\u003c/span\u003e \u003cspan class=\"se\"\u003e{path}\u003c/span\u003e\u003cspan class=\"s\"\u003e.txt\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e    # Rewrite to markdown when requested\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ehandle\u003c/span\u003e \u003cspan class=\"nd\"\u003e@wantsMarkdown\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003euri\u003c/span\u003e \u003cspan class=\"no\"\u003estrip_suffix\u003c/span\u003e \u003cspan class=\"s\"\u003e/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003erewrite\u003c/span\u003e \u003cspan class=\"nd\"\u003e*\u003c/span\u003e \u003cspan class=\"se\"\u003e{path}\u003c/span\u003e\u003cspan class=\"s\"\u003e.md\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e    # Try exact file first (for /robots.txt), then index.html\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003etry_files\u003c/span\u003e \u003cspan class=\"se\"\u003e{path}\u003c/span\u003e \u003cspan class=\"se\"\u003e{path}\u003c/span\u003e\u003cspan class=\"s\"\u003e/index.html\u003c/span\u003e \u003cspan class=\"se\"\u003e{path}\u003c/span\u003e\u003cspan class=\"s\"\u003e.html\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eNote:\u003c/strong\u003e Caddy\u0026rsquo;s \u003ccode\u003efile_server\u003c/code\u003e naturally serves exact files first, so \u003ccode\u003e/robots.txt\u003c/code\u003e works correctly without additional configuration.\u003c/p\u003e\n\u003ch3 id=\"apache-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eApache Configuration\u003c/span\u003e \u003ca href=\"#apache-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;VirtualHost\u003c/span\u003e \u003cspan class=\"s\"\u003e*:80\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eServerName\u003c/span\u003e example.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eDocumentRoot\u003c/span\u003e \u003cspan class=\"sx\"\u003e/var/www/html\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c\"\u003e# Enable content negotiation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eOptions\u003c/span\u003e +MultiViews\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c\"\u003e# Define type mappings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eAddType\u003c/span\u003e text/html .html\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eAddType\u003c/span\u003e text/markdown .md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eAddType\u003c/span\u003e text/plain .txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c\"\u003e# Set charset for text files\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eAddDefaultCharset\u003c/span\u003e UTF-8\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c\"\u003e# Prefer HTML by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eDirectoryIndex\u003c/span\u003e index.html index.md index.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c\"\u003e# Ensure exact files are served first (for /robots.txt)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;Directory\u003c/span\u003e \u003cspan class=\"s\"\u003e/var/www/html\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eRewriteEngine\u003c/span\u003e \u003cspan class=\"k\"\u003eOn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c\"\u003e# If the exact file exists, serve it directly\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eRewriteCond\u003c/span\u003e %{REQUEST_FILENAME} -f\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eRewriteRule\u003c/span\u003e ^ - [L]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c\"\u003e# Otherwise fall through to MultiViews negotiation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;/Directory\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;/VirtualHost\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eNote:\u003c/strong\u003e The \u003ccode\u003eRewriteCond %{REQUEST_FILENAME} -f\u003c/code\u003e rule ensures that canonical files like \u003ccode\u003e/robots.txt\u003c/code\u003e are served directly before MultiViews content negotiation kicks in.\u003c/p\u003e\n\u003ch3 id=\"testing-content-negotiation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTesting Content Negotiation\u003c/span\u003e \u003ca href=\"#testing-content-negotiation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse \u003ccode\u003ecurl\u003c/code\u003e to test different formats:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Request HTML (default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl https://example.com/my-post/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Request plain text\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -H \u003cspan class=\"s2\"\u003e\u0026#34;Accept: text/plain\u0026#34;\u003c/span\u003e https://example.com/my-post/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Request markdown\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -H \u003cspan class=\"s2\"\u003e\u0026#34;Accept: text/markdown\u0026#34;\u003c/span\u003e https://example.com/my-post/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Request with quality values\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -H \u003cspan class=\"s2\"\u003e\u0026#34;Accept: text/plain;q=0.9, text/html;q=0.8\u0026#34;\u003c/span\u003e https://example.com/my-post/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"homepage-with-index-md\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHomepage with index.md\u003c/span\u003e \u003ca href=\"#homepage-with-index-md\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go provides special handling for \u003ccode\u003eindex.md\u003c/code\u003e files to create homepages and directory-based URLs:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFile Path\u003c/th\u003e\n\u003cth\u003eGenerated URL\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e./index.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/\u003c/code\u003e (homepage)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edocs/index.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/docs/\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eblog/guides/index.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/blog/guides/\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"creating-a-homepage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCreating a Homepage\u003c/span\u003e \u003ca href=\"#creating-a-homepage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSimply create an \u003ccode\u003eindex.md\u003c/code\u003e file in your content root:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Welcome to My Site\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;A personal blog about programming\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehome.html\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Welcome\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis is my homepage content...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis generates \u003ccode\u003e/index.html\u003c/code\u003e as your site\u0026rsquo;s homepage, allowing custom content instead of requiring a feed with empty slug.\u003c/p\u003e\n\u003ch3 id=\"directory-index-pages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDirectory Index Pages\u003c/span\u003e \u003ca href=\"#directory-index-pages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003eindex.md\u003c/code\u003e files in subdirectories for section landing pages:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003edocs/\n  index.md          -\u0026gt; /docs/\n  getting-started.md -\u0026gt; /docs/getting-started/\n  guides/\n    index.md        -\u0026gt; /docs/guides/\n    advanced.md     -\u0026gt; /docs/guides/advanced/\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"example-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample Configuration\u003c/span\u003e \u003ca href=\"#example-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA typical configuration enabling all formats:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epost_formats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Standard pages\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e  \u003cspan class=\"c\"\u003e# View source support\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Plain text for accessibility\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eog\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Social card generation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"automation-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAutomation Example\u003c/span\u003e \u003ca href=\"#automation-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere\u0026rsquo;s a complete workflow for generating social images:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eEnable OG format\u003c/strong\u003e in your config:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epost_formats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eog\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eBuild your site\u003c/strong\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eGenerate screenshots\u003c/strong\u003e with a script:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e og_page in output/*/og/index.html\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003epost_dir\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003edirname \u003cspan class=\"k\"\u003e$(\u003c/span\u003edirname \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$og_page\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003eslug\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003ebasename \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$post_dir\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  npx puppeteer screenshot \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --viewport 1200x630 \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;file://\u003c/span\u003e\u003cspan class=\"nv\"\u003e$og_page\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$post_dir\u003c/span\u003e\u003cspan class=\"s2\"\u003e/og-image.png\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eReference in templates\u003c/strong\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:image\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ config.url }}{{ post.href }}og-image.png\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"upgrading-homepage-format-outputs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUpgrading homepage format outputs\u003c/span\u003e \u003ca href=\"#upgrading-homepage-format-outputs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eHomepage Markdown and text are served from \u003ccode\u003e/index.md\u003c/code\u003e and \u003ccode\u003e/index.txt\u003c/code\u003e. Older builds could create redirect directories at these paths. Incremental builds automatically replace those generated directories with files. If a conflicting directory contains other content, the build stops and preserves it; inspect the reported path before moving that content or rebuilding into an empty output directory.\u003c/p\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"./configuration.md\"\u003eConfiguration Guide\u003c/a\u003e - Full configuration reference\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"./templates.md\"\u003eTemplates Guide\u003c/a\u003e - Customizing templates including og.html\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"./deployment.md\"\u003eDeployment Guide\u003c/a\u003e - Deploying your generated site\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nmarkata-go can generate multiple output formats for each post beyond the standard HTML. This enables use cases like providing raw markdown for API consumers, plain text for accessibility, ANSI terminal output for `curl`, or generating social media preview cards.\n\n## Configuration\n\nConfigure output formats in your `markata-go.toml`:\n\n```toml\n[markata-go.post_formats]\nhtml = true       # Standard HTML (default: true)\nmarkdown = true   # Raw markdown source (default: true)\ntext = true       # Plain text output (default: true)\nansi = true       # ANSI terminal output (default: false)\nog = true         # OpenGraph card HTML (default: true)\n```\n\nBy default, HTML, Markdown, plain text, and OG formats are enabled. ANSI output is opt-in so you can add rich terminal rendering without introducing escape sequences into existing `.txt` endpoints.\n\n## Per-Post Overrides\n\nSite config sets the defaults, and individual posts can override them in frontmatter:\n\n```yaml\n---\ntitle: \"Release Notes\"\npost_formats:\n  markdown: false\n  ansi: true\n  og: false\n---\n```\n\nMerge rules:\n\n- omitted keys inherit the site-wide `[markata-go.post_formats]` setting\n- specified keys override only that post\n- template-visible `config.post_formats` follows the resolved per-post values, so alternate links and format switchers stay in sync with generated files\n\n## Available Formats\n\n### HTML (default)\n\nThe standard HTML output, generated by default.\n\n**Output:** `/your-post/index.html`\n\n```toml\n[markata-go.post_formats]\nhtml = true  # This is the default\n```\n\n### Markdown\n\nOutputs the raw markdown source with reconstructed frontmatter. Useful for:\n- \"View Source\" links on your site\n- API consumers who want raw content\n- Copy-paste workflows\n\n**Output:** `/your-post.md` (canonical) with redirect from `/your-post/index.md`\n\n```toml\n[markata-go.post_formats]\nmarkdown = true  # Enabled by default\n```\n\nThe markdown output includes the original frontmatter:\n\n```markdown\n---\ntitle: \"Your Post Title\"\ndescription: \"Post description\"\ndate: 2026-01-22\npublished: true\ntags:\n  - example\n---\n\nYour original markdown content...\n```\n\n### Plain Text\n\nOutputs a plain terminal-friendly version of the rendered page, perfect for:\n- Standard web txt files (robots.txt, llms.txt, humans.txt)\n- Screen readers and accessibility tools\n- Command-line readers (curl, wget)\n- Low-bandwidth situations\n- Text-based browsers\n\n**Output:** `/your-post.txt` (canonical) with redirect from `/your-post/index.txt`\n\n```toml\n[markata-go.post_formats]\ntext = true  # Enabled by default\n```\n\nThe text output includes terminal-safe structure derived from the rendered page:\n- Title, description, and date\n- Headings, links, emphasis, and separators\n- Image and video references as readable URLs\n- Blockquotes, admonitions, lists, and tables\n- Readable code blocks without ANSI escapes\n\nExample output:\n```\nMy Post Title\n=============\n\nA description of the post.\n\nDate: January 22, 2026\n\nThe actual content of the post in plain text form...\n```\n\n### ANSI Terminal\n\nOutputs a richer terminal-first version of the rendered page with ANSI color and emphasis.\n\n**Output:** `/your-post.ansi` (canonical) with redirect from `/your-post/index.ansi`\n\n```toml\n[markata-go.post_formats]\nansi = true  # Disabled by default; opt in when you want terminal styling\n```\n\nANSI output uses the active site palette when possible and preserves terminal-friendly formatting for:\n- headings and emphasis\n- links and metadata\n- image and video references\n- blockquotes and admonitions\n- lists, rules, and tables\n- syntax-highlighted code fences\n\nUse it with `curl`, `less -R`, or any ANSI-capable pager:\n\n```bash\ncurl https://example.com/your-post.ansi\ncurl https://example.com/your-post.ansi | less -R\ncurl https://example.com/your-post.txt\n```\n\n`/your-post.txt` stays free of ANSI escape codes. `/your-post.ansi` is the explicit opt-in rich terminal variant.\n\n### OpenGraph Card (OG)\n\nGenerates a special HTML page optimized for screenshot tools to create social media preview images. The page is sized at 1200x630 pixels (standard OG image dimensions).\n\n**Output:** `/your-post/og/index.html`\n\n```toml\n[markata-go.post_formats]\nog = true\n```\n\n#### Using OG Cards for Social Images\n\nThe OG card HTML is designed to be captured by screenshot tools like Puppeteer or Playwright:\n\n```javascript\n// Example with Puppeteer\nconst browser = await puppeteer.launch();\nconst page = await browser.newPage();\nawait page.setViewport({ width: 1200, height: 630 });\nawait page.goto('https://yoursite.com/your-post/og/');\nawait page.screenshot({ path: 'og-image.png' });\n```\n\nThe default OG card template includes:\n- Post title (large, prominent)\n- Frontmatter media when present (`image` → `cover_image` → `og_image` → `video`, videos render as video tags)\n- Author name and site URL\n- Publication date\n- Theme palette and background styling\n\nYou can customize the OG card appearance by providing your own `post-og.html` template.\nIf no post-specific OG template exists, `og-card.html` is used as a fallback.\n\n### Shared OG/Feed/Embed Media Helpers\n\nOG cards, feed cards, and embed cards now share a media pipeline so the same image/video looks identical in every context. All three templates should:\n\n- Call `with_size(width, height)` on photo/video URLs so the generated media query string carries precise `w` and `h` values that align with the pixel dimensions the template renders. Accurate sizing prevents visual drift when downstream screenshot tools or clients ingest the card. Trusted media URLs are normalized to `https` first to avoid mixed-content warnings.\n- Use `media_url` for raw image metadata fields such as search thumbnails when you need the URL without sizing query parameters.\n- Use the query/fragment-safe `is_video` filter when deciding whether to render a `\u003cvideo\u003e` tag, and let the `poster_url` helper resolve the poster image.\n- Respect the poster alias precedence: `poster_image`, `poster`, `video_poster`, `video_thumbnail`, `thumbnail`, `thumb`. `poster_url` checks those values first, and only when none are defined does it fall back to deriving a `.webp` thumbnail from the video URL on allowlisted hosts.\n\nOnly relative URLs and media hosted on the safe domain allowlist receive the sizing/presenter treatment. The default allowlist includes `dropper.wayl.one`, `dropper.waylonwalker.com`, and `dropper-dev.wayl.one`, but you can add or override entries via `[markata-go.templates.media]` in your `markata-go.toml`. Untrusted hosts skip the extra query params and auto-generated posters so you stay in control of which domains get the richer metadata. Custom templates can still opt out entirely by using their own helpers instead of `with_size`/`poster_url`.\n\n## Standard Web Txt Files\n\nmarkata-go supports generating standard web txt files at their expected canonical URLs:\n\n| File | Purpose |\n|------|---------|\n| `/robots.txt` | Robot exclusion standard for web crawlers |\n| `/llms.txt` | AI/LLM guidance file for language models |\n| `/humans.txt` | Human-readable site credits |\n\nTo create these, simply add markdown files with the appropriate slugs:\n\n```markdown\n\u003c!-- robots.md --\u003e\n---\ntitle: \"Robots\"\nslug: robots\npublished: true\n---\n\nUser-agent: *\nAllow: /\nDisallow: /private/\n```\n\n```markdown\n\u003c!-- llms.md --\u003e\n---\ntitle: \"LLMs\"\nslug: llms\npublished: true\n---\n\n# LLMs.txt\n\nThis site welcomes AI training on its content.\n\n## Guidelines\n- Attribution appreciated\n- Commercial use allowed\n```\n\nWith text format enabled (default), these generate:\n- `/robots.txt` - The canonical robots.txt file\n- `/robots/index.txt` - Redirect for backwards compatibility\n- `/robots/index.txt/index.html` - HTML redirect for static hosts\n- `/llms.txt` - The canonical llms.txt file\n- `/llms/index.txt` - Redirect for backwards compatibility\n- `/llms/index.txt/index.html` - HTML redirect for static hosts\n\n## Reversed Redirects\n\nFor `.txt`, `.ansi`, and `.md` formats, markata-go uses **reversed redirects** to ensure content is at the canonical URL:\n\n| Canonical Location | Redirect From |\n|-------------------|---------------|\n| `/my-post.md` | `/my-post/index.md` |\n| `/my-post.txt` | `/my-post/index.txt` |\n| `/my-post.ansi` | `/my-post/index.ansi` |\n\nThis is the opposite of HTML, which uses directory-based URLs:\n\n| Canonical Location | Redirect From |\n|-------------------|---------------|\n| `/my-post/index.html` | `/my-post.html` |\n\nThe reversed approach ensures standard web files like `robots.txt` work correctly while maintaining backwards compatibility with directory-based URLs.\n\n## Clean URLs\n\nmarkata-go generates both canonical files and redirects for maximum compatibility:\n\n| User requests | Canonical file | Notes |\n|---------------|----------------|-------|\n| `/my-post.md` | `/my-post.md` | Direct access to canonical |\n| `/my-post/index.md` | Redirects to `/my-post.md` | Backwards compatibility |\n| `/my-post.txt` | `/my-post.txt` | Direct access to canonical |\n| `/my-post/index.txt` | Redirects to `/my-post.txt` | Backwards compatibility |\n\nThis means users can use either URL style:\n\n```bash\n# All of these work:\ncurl https://example.com/my-post.md         # Canonical\ncurl https://example.com/my-post/index.md   # Redirects to canonical\n\n# Standard web txt files work at expected URLs:\ncurl https://example.com/robots.txt\ncurl https://example.com/llms.txt\n```\n\nThe redirects use HTML meta refresh for maximum compatibility across browsers and HTTP clients.\n\n## Visible Format Links\n\nWhen you enable alternate formats, markata-go automatically displays format links on your posts and feeds. These appear in the post footer (for posts) or feed header (for feeds).\n\nFor posts with `markdown`, `text`, or `og` enabled, visitors see:\n- **View as:** Markdown | Text | Card\n\nFor feeds, visitors see subscription options:\n- **Subscribe:** RSS | Atom | JSON | Markdown | Text\n\n## Copying Posts for Chat and Notes\n\nPost pages also expose a `Copy this post` control near the top of the article. It is designed for the common workflow of dropping a post into Slack, Teams, notes apps, or a code editor without manually selecting the page. Set `components.post_copy.enabled = false` to hide the menu without disabling the post-format files (see [Configuration](/docs/guides/configuration/#share-component-markata-gocomponentsshare)).\n\nAvailable copy modes:\n\n- `URL` - copies the canonical post URL.\n- `Rich` - copies HTML plus plain text so chat clients can preserve headings, links, and formatting when they support rich paste.\n- `Markdown` - copies the post title, URL, and raw markdown body.\n- `Text` - copies the post title, URL, and a plain-text rendering of the article.\n\nThe rich option uses the browser clipboard API to write both `text/html` and `text/plain` payloads. When that API is unavailable, markata-go falls back to plain-text clipboard writes so copying still works in older browsers.\n\n## Content Negotiation\n\nmarkata-go's canonical short URLs (`/slug.md`, `/slug.txt`) plus HTML directory pages (`/slug/index.html`) enable server-side content negotiation. This allows clients to request their preferred format using HTTP `Accept` headers.\n\n### How It Works\n\nInstead of requesting a specific file, clients request the directory URL:\n```\nGET /my-post/\nAccept: text/plain\n```\n\nThe server returns the appropriate format based on the `Accept` header.\n\n### Nginx Configuration\n\n```nginx\nserver {\n    listen 80;\n    server_name example.com;\n    root /var/www/html;\n\n    # MIME types for txt/md files\n    location ~ \\.(txt|md)$ {\n        default_type text/plain;\n        charset utf-8;\n    }\n\n    location / {\n        # Try exact file first (for /robots.txt), then negotiate by Accept header\n        try_files $uri $uri/index.html @negotiate;\n    }\n\n    location @negotiate {\n        # Map Accept header to file extension\n        set $ext \"html\";\n\n        if ($http_accept ~* \"text/plain\") {\n            set $ext \"txt\";\n        }\n        if ($http_accept ~* \"text/markdown\") {\n            set $ext \"md\";\n        }\n\n        # Strip trailing slash for canonical format files\n        set $base $uri;\n        if ($base ~ \"^(.+)/$\") {\n            set $base $1;\n        }\n\n        # Try the negotiated format, falling back to index.html\n        try_files $base.$ext $uri/index.html =404;\n    }\n}\n```\n\n**Note:** The `try_files` order is important. Files like `/robots.txt` are served directly because `$uri` matches the exact file before falling back to content negotiation.\n\n### Caddy Configuration\n\n```caddyfile\nexample.com {\n    root * /var/www/html\n    file_server\n\n    # MIME types for txt/md files\n    @txtmd path *.txt *.md\n    header @txtmd Content-Type \"text/plain; charset=utf-8\"\n\n    @wantsText {\n        header Accept *text/plain*\n    }\n    @wantsMarkdown {\n        header Accept *text/markdown*\n    }\n\n    # Rewrite to plain text when requested\n    handle @wantsText {\n        uri strip_suffix /\n        rewrite * {path}.txt\n    }\n\n    # Rewrite to markdown when requested\n    handle @wantsMarkdown {\n        uri strip_suffix /\n        rewrite * {path}.md\n    }\n\n    # Try exact file first (for /robots.txt), then index.html\n    try_files {path} {path}/index.html {path}.html\n}\n```\n\n**Note:** Caddy's `file_server` naturally serves exact files first, so `/robots.txt` works correctly without additional configuration.\n\n### Apache Configuration\n\n```apache\n\u003cVirtualHost *:80\u003e\n    ServerName example.com\n    DocumentRoot /var/www/html\n\n    # Enable content negotiation\n    Options +MultiViews\n\n    # Define type mappings\n    AddType text/html .html\n    AddType text/markdown .md\n    AddType text/plain .txt\n\n    # Set charset for text files\n    AddDefaultCharset UTF-8\n\n    # Prefer HTML by default\n    DirectoryIndex index.html index.md index.txt\n\n    # Ensure exact files are served first (for /robots.txt)\n    \u003cDirectory /var/www/html\u003e\n        RewriteEngine On\n        # If the exact file exists, serve it directly\n        RewriteCond %{REQUEST_FILENAME} -f\n        RewriteRule ^ - [L]\n        # Otherwise fall through to MultiViews negotiation\n    \u003c/Directory\u003e\n\u003c/VirtualHost\u003e\n```\n\n**Note:** The `RewriteCond %{REQUEST_FILENAME} -f` rule ensures that canonical files like `/robots.txt` are served directly before MultiViews content negotiation kicks in.\n\n### Testing Content Negotiation\n\nUse `curl` to test different formats:\n\n```bash\n# Request HTML (default)\ncurl https://example.com/my-post/\n\n# Request plain text\ncurl -H \"Accept: text/plain\" https://example.com/my-post/\n\n# Request markdown\ncurl -H \"Accept: text/markdown\" https://example.com/my-post/\n\n# Request with quality values\ncurl -H \"Accept: text/plain;q=0.9, text/html;q=0.8\" https://example.com/my-post/\n```\n\n## Homepage with index.md\n\nmarkata-go provides special handling for `index.md` files to create homepages and directory-based URLs:\n\n| File Path | Generated URL |\n|-----------|---------------|\n| `./index.md` | `/` (homepage) |\n| `docs/index.md` | `/docs/` |\n| `blog/guides/index.md` | `/blog/guides/` |\n\n### Creating a Homepage\n\nSimply create an `index.md` file in your content root:\n\n```markdown\n---\ntitle: \"Welcome to My Site\"\ndescription: \"A personal blog about programming\"\npublished: true\ntemplate: home.html\n---\n\n# Welcome\n\nThis is my homepage content...\n```\n\nThis generates `/index.html` as your site's homepage, allowing custom content instead of requiring a feed with empty slug.\n\n### Directory Index Pages\n\nCreate `index.md` files in subdirectories for section landing pages:\n\n```\ndocs/\n  index.md          -\u003e /docs/\n  getting-started.md -\u003e /docs/getting-started/\n  guides/\n    index.md        -\u003e /docs/guides/\n    advanced.md     -\u003e /docs/guides/advanced/\n```\n\n## Example Configuration\n\nA typical configuration enabling all formats:\n\n```toml\n[markata-go]\nurl = \"https://example.com\"\ntitle = \"My Site\"\n\n[markata-go.post_formats]\nhtml = true      # Standard pages\nmarkdown = true  # View source support\ntext = true      # Plain text for accessibility\nog = true        # Social card generation\n```\n\n## Automation Example\n\nHere's a complete workflow for generating social images:\n\n1. **Enable OG format** in your config:\n   ```toml\n   [markata-go.post_formats]\n   og = true\n   ```\n\n2. **Build your site**:\n   ```bash\n   markata-go build\n   ```\n\n3. **Generate screenshots** with a script:\n   ```bash\n   #!/bin/bash\n   for og_page in output/*/og/index.html; do\n     post_dir=$(dirname $(dirname \"$og_page\"))\n     slug=$(basename \"$post_dir\")\n     npx puppeteer screenshot \\\n       --viewport 1200x630 \\\n       \"file://$og_page\" \\\n       \"$post_dir/og-image.png\"\n   done\n   ```\n\n4. **Reference in templates**:\n   ```html\n   \u003cmeta property=\"og:image\" content=\"{{ config.url }}{{ post.href }}og-image.png\"\u003e\n   ```\n\n### Upgrading homepage format outputs\n\nHomepage Markdown and text are served from `/index.md` and `/index.txt`. Older builds could create redirect directories at these paths. Incremental builds automatically replace those generated directories with files. If a conflicting directory contains other content, the build stops and preserves it; inspect the reported path before moving that content or rebuilding into an empty output directory.\n\n## See Also\n\n- [Configuration Guide](./configuration.md) - Full configuration reference\n- [Templates Guide](./templates.md) - Customizing templates including og.html\n- [Deployment Guide](./deployment.md) - Deploying your generated site\n",
      "summary": "Configure multiple output formats for posts including HTML, Markdown source, plain text, ANSI terminal output, and OpenGraph cards",
      "date_published": "2026-01-22T00:00:00Z",
      "date_modified": "2026-01-22T00:00:00Z",
      "tags": [
        "configuration",
        "output",
        "social-media",
        "content-negotiation"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/mentions/",
      "url": "https://markata.dev/docs/guides/mentions/",
      "title": "@Mentions",
      "content_html": "\u003cp\u003eThe mentions plugin transforms \u003ccode\u003e@handle\u003c/code\u003e syntax in your markdown content into HTML links. It resolves handles from three sources:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eBlogroll feeds\u003c/strong\u003e - External RSS/Atom feeds from your blogroll configuration\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAuthors\u003c/strong\u003e - Authors defined in your site configuration (automatically registered)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eInternal posts\u003c/strong\u003e - Posts in your site matching filter expressions (like contact pages)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"basic-usage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Usage\u003c/span\u003e \u003ca href=\"#basic-usage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWrite mentions in your markdown using \u003ccode\u003e@handle\u003c/code\u003e syntax:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eI was reading \u003cspan class=\"ni\"\u003e@alice\u003c/span\u003e\u0026#39;s post about static site generators.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAlso check out \u003cspan class=\"ni\"\u003e@bob\u003c/span\u003e for more great content.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen handles are resolved, they become clickable links:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eI was reading \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/contact/alice/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mention\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e@alice\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u0026#39;s post...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eConfigure mentions in your \u003ccode\u003emarkata-go.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ementions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecss_class\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;mention\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# CSS class for links (default: \u0026#34;mention\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThat\u0026rsquo;s it for most use cases! By default, mentions resolves handles from:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eBlogroll feeds\u003c/strong\u003e (if blogroll is enabled)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAuthors\u003c/strong\u003e from your site configuration (if they have a \u003ccode\u003eurl\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eContact posts\u003c/strong\u003e - any post with \u003ccode\u003etemplate: contact\u003c/code\u003e in frontmatter\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAuthor posts\u003c/strong\u003e - any post with \u003ccode\u003etemplate: author\u003c/code\u003e in frontmatter\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThe default \u003ccode\u003efrom_posts\u003c/code\u003e sources are equivalent to:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ementions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efrom_posts\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;template == \u0026#39;contact\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehandle_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;handle\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ealiases_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;aliases\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ementions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efrom_posts\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;template == \u0026#39;author\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehandle_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;handle\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ealiases_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;aliases\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou can override this by specifying your own \u003ccode\u003efrom_posts\u003c/code\u003e sources:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Custom sources replace the default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ementions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efrom_posts\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;team\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehandle_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;github_handle\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ealiases_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;nicknames\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"resolving-from-internal-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eResolving from Internal Posts\u003c/span\u003e \u003ca href=\"#resolving-from-internal-posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ccode\u003efrom_posts\u003c/code\u003e configuration lets you resolve \u003ccode\u003e@handles\u003c/code\u003e from posts in your site. This is useful for:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eContact pages\u003c/strong\u003e - Team member or author profiles\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eContributor pages\u003c/strong\u003e - Guest authors or collaborators\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePartner pages\u003c/strong\u003e - Companies or organizations you work with\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"example-contact-pages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample: Contact Pages\u003c/span\u003e \u003ca href=\"#example-contact-pages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate contact pages with handle information in frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# pages/contact/alice-smith.md\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Alice Smith\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003econtact\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003econtact\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ehandle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ealice\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ealiases\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ealices\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003easmith\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eavatar\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/images/alice.jpg\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://alicesmith.dev\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Software engineer specializing in Go and web development.\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003eAlice is a software engineer specializing in Go and web development.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eConfigure the mentions plugin to use these posts (or rely on the default which already matches \u003ccode\u003etemplate: contact\u003c/code\u003e):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ementions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efrom_posts\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;template == \u0026#39;contact\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehandle_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;handle\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ealiases_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;aliases\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow \u003ccode\u003e@alice\u003c/code\u003e, \u003ccode\u003e@alices\u003c/code\u003e, and \u003ccode\u003e@asmith\u003c/code\u003e all link to \u003ccode\u003e/contact/alice-smith/\u003c/code\u003e and display \u003ccode\u003e@alice\u003c/code\u003e as the link text.\u003c/p\u003e\n\u003cp\u003eThe mention hovercard will show the avatar (from the \u003ccode\u003eavatar\u003c/code\u003e, \u003ccode\u003eimage\u003c/code\u003e, or \u003ccode\u003eicon\u003c/code\u003e frontmatter field), the post title as the name, and the description as the bio. You can specify which field to use for the avatar with \u003ccode\u003eavatar_field\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ementions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efrom_posts\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;template == \u0026#39;contact\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehandle_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;handle\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ealiases_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;aliases\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eavatar_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;icon\u0026#34;\u003c/span\u003e   \u003cspan class=\"c\"\u003e# Use \u0026#39;icon\u0026#39; field instead of default lookup order\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"multiple-sources\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMultiple Sources\u003c/span\u003e \u003ca href=\"#multiple-sources\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eYou can define multiple \u003ccode\u003efrom_posts\u003c/code\u003e sources for different content types:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Contact pages (this is the default, shown here for clarity)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ementions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efrom_posts\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;template == \u0026#39;contact\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehandle_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;handle\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ealiases_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;aliases\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Team members\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ementions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efrom_posts\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;template == \u0026#39;team-member.html\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehandle_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;github_handle\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Projects (no explicit handle - uses slug)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ementions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efrom_posts\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;project\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"fallback-to-slug\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFallback to Slug\u003c/span\u003e \u003ca href=\"#fallback-to-slug\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf \u003ccode\u003ehandle_field\u003c/code\u003e is not specified or the frontmatter field is empty, the post\u0026rsquo;s slug is used as the handle.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ementions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efrom_posts\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;contributor\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# No handle_field - uses slug\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eA post at \u003ccode\u003econtributors/jane-doe.md\u003c/code\u003e becomes \u003ccode\u003e@jane-doe\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"resolving-from-blogroll\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eResolving from Blogroll\u003c/span\u003e \u003ca href=\"#resolving-from-blogroll\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf you have a \u003ca href=\"/guides/blogroll/\"\u003eblogroll\u003c/a\u003e configured, handles are automatically extracted from your RSS/Atom feeds:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://daverupert.com/feed.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Dave Rupert\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehandle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;daverupert\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esite_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://daverupert.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ealiases\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;dave\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;davatron\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow \u003ccode\u003e@daverupert\u003c/code\u003e, \u003ccode\u003e@dave\u003c/code\u003e, and \u003ccode\u003e@davatron\u003c/code\u003e all link to \u003ccode\u003ehttps://daverupert.com\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"authors-as-contacts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuthors as Contacts\u003c/span\u003e \u003ca href=\"#authors-as-contacts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAuthors defined in your site configuration are automatically registered as mentionable contacts. If an author has a \u003ccode\u003eurl\u003c/code\u003e field, they become a valid \u003ccode\u003e@handle\u003c/code\u003e target.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewaylon\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Waylon Walker\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://waylonwalker.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eavatar\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/images/waylon.jpg\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebio\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Python and Go developer\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWith this configuration, \u003ccode\u003e@waylon\u003c/code\u003e becomes a valid mention that links to \u003ccode\u003ehttps://waylonwalker.com\u003c/code\u003e. The author\u0026rsquo;s avatar, name, and bio are used for hovercards.\u003c/p\u003e\n\u003cp\u003eAuthors are registered after blogroll feeds but before \u003ccode\u003efrom_posts\u003c/code\u003e sources. If a blogroll feed already registered the same handle, the blogroll entry wins (first registration wins).\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eNo extra configuration needed\u003c/strong\u003e \u0026ndash; as long as your authors have a \u003ccode\u003eurl\u003c/code\u003e field, they are automatically available as mentions.\u003c/p\u003e\n\u003ch2 id=\"authors-in-from_posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuthors in from_posts\u003c/span\u003e \u003ca href=\"#authors-in-from_posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBy default, the mentions plugin includes posts with \u003ccode\u003etemplate: author\u003c/code\u003e as a post source, in addition to \u003ccode\u003etemplate: contact\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# These are the defaults (you don\u0026#39;t need to add them):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ementions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efrom_posts\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;template == \u0026#39;contact\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehandle_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;handle\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ementions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efrom_posts\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;template == \u0026#39;author\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehandle_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;handle\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ealiases_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;aliases\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis means if you have author profile pages with \u003ccode\u003etemplate: author\u003c/code\u003e, they are automatically included as mention sources.\u003c/p\u003e\n\u003ch2 id=\"trailing-punctuation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTrailing Punctuation\u003c/span\u003e \u003ca href=\"#trailing-punctuation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMentions handle trailing punctuation gracefully. When you write \u003ccode\u003e@alice.\u003c/code\u003e or \u003ccode\u003e@bob,\u003c/code\u003e at the end of a sentence, the plugin strips the punctuation and resolves the handle correctly:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eI was talking to \u003cspan class=\"ni\"\u003e@alice\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCheck out \u003cspan class=\"ni\"\u003e@bob\u003c/span\u003e, they have great content.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThanks \u003cspan class=\"ni\"\u003e@charlie\u003c/span\u003e!\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eProduces:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eI was talking to \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mention\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;...\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e@alice\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCheck out \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mention\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;...\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e@bob\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e, they have great content.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThanks \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mention\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;...\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e@charlie\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e!\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe following trailing punctuation characters are stripped: \u003ccode\u003e. , ; : ! ?\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDomain-style handles are preserved:\u003c/strong\u003e If the exact handle (including dots) matches a known contact, it is used as-is. For example, \u003ccode\u003e@simonwillison.net\u003c/code\u003e resolves to the domain handle without stripping the \u003ccode\u003e.net\u003c/code\u003e. Only when the exact handle fails to match does the plugin try stripping trailing punctuation.\u003c/p\u003e\n\u003ch2 id=\"chat-admonitions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChat Admonitions\u003c/span\u003e \u003ca href=\"#chat-admonitions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe mentions plugin enriches chat admonition titles with contact information. When you use \u003ccode\u003e!!! chat\u003c/code\u003e or \u003ccode\u003e!!! chat-reply\u003c/code\u003e with an \u003ccode\u003e@handle\u003c/code\u003e, the title is replaced with the contact\u0026rsquo;s avatar and a linked mention.\u003c/p\u003e\n\u003cp\u003eBoth quoted and unquoted forms work:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! chat \u003cspan class=\"ni\"\u003e@alice\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Hey, have you seen the new release?\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! chat-reply \u003cspan class=\"ni\"\u003e@bob\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Yes! It looks great.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! chat \u0026#34;\u003cspan class=\"ni\"\u003e@alice\u003c/span\u003e\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Quoted form works too.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003echat-reply\u003c/code\u003e can also omit a handle to render as the post author:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! chat-reply\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Thanks for the update!\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis renders with avatar images and linked names in the admonition title, creating a conversation-style display.\u003c/p\u003e\n\u003cp\u003eCollapsible chat admonitions work too:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e??? chat \u003cspan class=\"ni\"\u003e@alice\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    This content is collapsible.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf the handle is not found in the contact map, the title is left unchanged.\u003c/p\u003e\n\u003ch3 id=\"admonition-header-protection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdmonition Header Protection\u003c/span\u003e \u003ca href=\"#admonition-header-protection\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe mentions plugin automatically protects \u003ccode\u003e@handles\u003c/code\u003e on admonition header lines from being transformed into links. This applies to all admonition types (\u003ccode\u003e!!!\u003c/code\u003e, \u003ccode\u003e???\u003c/code\u003e, \u003ccode\u003e???+\u003c/code\u003e), not just chat. Mentions in the body text and outside admonitions are still processed normally.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! note \u003cspan class=\"ni\"\u003e@alice\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    This note title is preserved as-is.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBut \u003cspan class=\"ni\"\u003e@alice\u003c/span\u003e in regular text is still linked.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"styling-chat-admonitions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStyling Chat Admonitions\u003c/span\u003e \u003ca href=\"#styling-chat-admonitions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eChat admonitions include CSS classes for styling:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003echat-contact\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003einline-flex\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ealign-items\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ecenter\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003egap\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"kt\"\u003eem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003echat-contact-avatar\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ewidth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e1.5\u003c/span\u003e\u003cspan class=\"kt\"\u003eem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eheight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e1.5\u003c/span\u003e\u003cspan class=\"kt\"\u003eem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eborder-radius\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\u003c/span\u003e\u003cspan class=\"kt\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003evertical-align\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003emiddle\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003echat-contact-name\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003efont-weight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e600\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThese styles are included in the default theme. Customize them to match your site\u0026rsquo;s design.\u003c/p\u003e\n\u003ch2 id=\"handle-resolution-priority\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHandle Resolution Priority\u003c/span\u003e \u003ca href=\"#handle-resolution-priority\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen building the handle map, sources are processed in this order:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eBlogroll feeds\u003c/strong\u003e (if enabled) - First registered wins\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAuthors\u003c/strong\u003e (from site config) - Authors with a \u003ccode\u003eurl\u003c/code\u003e field\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFrom posts\u003c/strong\u003e sources - Processed in order they appear in config\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eIf the same handle is registered multiple times, the first registration wins and subsequent duplicates are logged as warnings.\u003c/p\u003e\n\u003ch2 id=\"styling-mentions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStyling Mentions\u003c/span\u003e \u003ca href=\"#styling-mentions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMention links have the configured CSS class (default: \u003ccode\u003emention\u003c/code\u003e). Add styles to your CSS:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003emention\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eprimary\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003efont-weight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e500\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003emention\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003ebefore\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \u003cspan class=\"c\"\u003e/* Remove @ if you want */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003emention\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003ehover\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003etext-decoration\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eunderline\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"code-block-protection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCode Block Protection\u003c/span\u003e \u003ca href=\"#code-block-protection\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMentions inside fenced code blocks are preserved and not transformed:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCheck out \u003cspan class=\"ni\"\u003e@alice\u003c/span\u003e\u0026#39;s post.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// @alice is not transformed here\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econst handle = \u0026#34;@alice\u0026#34;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"email-protection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEmail Protection\u003c/span\u003e \u003ca href=\"#email-protection\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEmail addresses are not transformed as mentions. The plugin detects the \u003ccode\u003e@\u003c/code\u003e preceded by word characters and ignores them:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContact me at test\u003cspan class=\"ni\"\u003e@example\u003c/span\u003e.com  \u003cspan class=\"cm\"\u003e\u0026lt;!-- Not transformed --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFollow \u003cspan class=\"ni\"\u003e@example\u003c/span\u003e on social       \u003cspan class=\"cm\"\u003e\u0026lt;!-- Transformed --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"configuration-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration Reference\u003c/span\u003e \u003ca href=\"#configuration-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable/disable mentions processing\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecss_class\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;mention\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCSS class for mention links\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecache_dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;cache/mentions\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDirectory for cached external metadata\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecache_duration\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;168h\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHow long external metadata stays fresh\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etimeout\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e30\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHTTP timeout in seconds\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econcurrent_requests\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e3\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMax concurrent external metadata fetches\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efrom_posts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earray\u003c/td\u003e\n\u003ctd\u003esee below\u003c/td\u003e\n\u003ctd\u003eList of internal post sources. Default: two sources with \u003ccode\u003efilter = \u0026quot;template == 'contact'\u0026quot;\u003c/code\u003e and \u003ccode\u003efilter = \u0026quot;template == 'author'\u0026quot;\u003c/code\u003e, both with \u003ccode\u003ehandle_field = \u0026quot;handle\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"from_posts-options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003efrom_posts Options\u003c/span\u003e \u003ca href=\"#from_posts-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efilter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003erequired\u003c/td\u003e\n\u003ctd\u003eFilter expression to select posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehandle_field\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e(slug)\u003c/td\u003e\n\u003ctd\u003eFrontmatter field for handle\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ealiases_field\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003eFrontmatter field for aliases\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eavatar_field\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003eFrontmatter field for avatar URL. If not set, checks \u003ccode\u003eavatar\u003c/code\u003e, \u003ccode\u003eimage\u003c/code\u003e, \u003ccode\u003eicon\u003c/code\u003e in order\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"team-directory\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTeam Directory\u003c/span\u003e \u003ca href=\"#team-directory\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ementions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efrom_posts\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;team\u0026#39; in tags and published == true\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehandle_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;slack_handle\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ealiases_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;nicknames\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"author-profiles\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuthor Profiles\u003c/span\u003e \u003ca href=\"#author-profiles\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ementions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efrom_posts\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;template == \u0026#39;author.html\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehandle_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;username\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"combined-sources\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCombined Sources\u003c/span\u003e \u003ca href=\"#combined-sources\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://external-blog.com/rss\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehandle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;external\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ementions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efrom_posts\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;internal\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehandle_field\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;handle\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow you can use \u003ccode\u003e@external\u003c/code\u003e for external links and \u003ccode\u003e@internal-user\u003c/code\u003e for internal profile links in the same post.\u003c/p\u003e\n\u003ch2 id=\"quote-attributions-with-a-tilde\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuote attributions with a tilde\u003c/span\u003e \u003ca href=\"#quote-attributions-with-a-tilde\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse \u003ccode\u003e\u0026lt;span class=\u0026quot;mention mention--attribution mention--unresolved\u0026quot; data-handle=\u0026quot;~handle\u0026quot;\u0026gt;~handle\u0026lt;/span\u0026gt;\u003c/code\u003e to credit the source of a short quote without turning it\ninto a prominent callout:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eif an agent cant verify its own work\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e==nothing else matters==\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e~poteto\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen \u003ccode\u003epoteto\u003c/code\u003e is in your configured blogroll, Markata links it to the\ncanonical \u003ccode\u003esite_url\u003c/code\u003e and displays it with a quiet, theme-aware\n\u003ccode\u003emention--attribution\u003c/code\u003e style. Ordinary \u003ccode\u003e@poteto\u003c/code\u003e references keep the\nnormal mention appearance. You can override the styling using\n\u003ccode\u003e.mention--attribution\u003c/code\u003e in your site CSS.\u003c/p\u003e\n\u003cp\u003eIf the handle is not yet in the blogroll, \u003ccode\u003e\u0026lt;span class=\u0026quot;mention mention--attribution mention--unresolved\u0026quot; data-handle=\u0026quot;~poteto\u0026quot;\u0026gt;~poteto\u0026lt;/span\u0026gt;\u003c/code\u003e stays visible and\nstyled, but is not made into a link. Markata does \u003cstrong\u003enot\u003c/strong\u003e assume that an\nidentically named GitHub/X/Bluesky account belongs to the person you\nquoted.\u003c/p\u003e\n\u003ch3 id=\"lint-missing-mentions-locally\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLint missing mentions locally\u003c/span\u003e \u003ca href=\"#lint-missing-mentions-locally\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lint pages/ping/ping-84.md\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWith blogroll enabled, both \u003ccode\u003e@handle\u003c/code\u003e and \u003ccode\u003e\u0026lt;span class=\u0026quot;mention mention--attribution mention--unresolved\u0026quot; data-handle=\u0026quot;~handle\u0026quot;\u0026gt;~handle\u0026lt;/span\u0026gt;\u003c/code\u003e produce\n\u003ccode\u003eunknown-mention\u003c/code\u003e warnings when they cannot be resolved to an active\nconfigured feed handle or alias. The warning suggests adding the\nperson\u0026rsquo;s handle or alias to the blogroll; warnings do not fail the\nbuild. This check is deterministic and \u003cstrong\u003edoes not search the network\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eFor new people, first check your blogroll. If absent, manually\ninvestigate X/Twitter, then GitHub, then Bluesky for a verified match,\nand add the verified canonical link plus an actual feed to the\nblogroll. Never automatically insert a social profile based only on a\nusername collision.\u003c/p\u003e\n",
      "content_text": "\n\nThe mentions plugin transforms `@handle` syntax in your markdown content into HTML links. It resolves handles from three sources:\n\n1. **Blogroll feeds** - External RSS/Atom feeds from your blogroll configuration\n2. **Authors** - Authors defined in your site configuration (automatically registered)\n3. **Internal posts** - Posts in your site matching filter expressions (like contact pages)\n\n## Basic Usage\n\nWrite mentions in your markdown using `@handle` syntax:\n\n```markdown\nI was reading @alice's post about static site generators.\nAlso check out @bob for more great content.\n```\n\nWhen handles are resolved, they become clickable links:\n\n```html\nI was reading \u003ca href=\"/contact/alice/\" class=\"mention\"\u003e@alice\u003c/a\u003e's post...\n```\n\n## Configuration\n\nConfigure mentions in your `markata-go.toml`:\n\n```toml\n[markata-go.mentions]\nenabled = true\ncss_class = \"mention\"  # CSS class for links (default: \"mention\")\n```\n\nThat's it for most use cases! By default, mentions resolves handles from:\n\n1. **Blogroll feeds** (if blogroll is enabled)\n2. **Authors** from your site configuration (if they have a `url`)\n3. **Contact posts** - any post with `template: contact` in frontmatter\n4. **Author posts** - any post with `template: author` in frontmatter\n\nThe default `from_posts` sources are equivalent to:\n\n```toml\n[[markata-go.mentions.from_posts]]\nfilter = \"template == 'contact'\"\nhandle_field = \"handle\"\naliases_field = \"aliases\"\n\n[[markata-go.mentions.from_posts]]\nfilter = \"template == 'author'\"\nhandle_field = \"handle\"\naliases_field = \"aliases\"\n```\n\nYou can override this by specifying your own `from_posts` sources:\n\n```toml\n# Custom sources replace the default\n[[markata-go.mentions.from_posts]]\nfilter = \"'team' in tags\"\nhandle_field = \"github_handle\"\naliases_field = \"nicknames\"\n```\n\n## Resolving from Internal Posts\n\nThe `from_posts` configuration lets you resolve `@handles` from posts in your site. This is useful for:\n\n- **Contact pages** - Team member or author profiles\n- **Contributor pages** - Guest authors or collaborators  \n- **Partner pages** - Companies or organizations you work with\n\n### Example: Contact Pages\n\nCreate contact pages with handle information in frontmatter:\n\n```yaml\n# pages/contact/alice-smith.md\n---\ntitle: \"Alice Smith\"\ntemplate: contact\ntags:\n  - contact\nhandle: alice\naliases:\n  - alices\n  - asmith\navatar: /images/alice.jpg\nurl: https://alicesmith.dev\ndescription: \"Software engineer specializing in Go and web development.\"\n---\n\nAlice is a software engineer specializing in Go and web development.\n```\n\nConfigure the mentions plugin to use these posts (or rely on the default which already matches `template: contact`):\n\n```toml\n[[markata-go.mentions.from_posts]]\nfilter = \"template == 'contact'\"\nhandle_field = \"handle\"\naliases_field = \"aliases\"\n```\n\nNow `@alice`, `@alices`, and `@asmith` all link to `/contact/alice-smith/` and display `@alice` as the link text.\n\nThe mention hovercard will show the avatar (from the `avatar`, `image`, or `icon` frontmatter field), the post title as the name, and the description as the bio. You can specify which field to use for the avatar with `avatar_field`:\n\n```toml\n[[markata-go.mentions.from_posts]]\nfilter = \"template == 'contact'\"\nhandle_field = \"handle\"\naliases_field = \"aliases\"\navatar_field = \"icon\"   # Use 'icon' field instead of default lookup order\n```\n\n### Multiple Sources\n\nYou can define multiple `from_posts` sources for different content types:\n\n```toml\n# Contact pages (this is the default, shown here for clarity)\n[[markata-go.mentions.from_posts]]\nfilter = \"template == 'contact'\"\nhandle_field = \"handle\"\naliases_field = \"aliases\"\n\n# Team members\n[[markata-go.mentions.from_posts]]\nfilter = \"template == 'team-member.html'\"\nhandle_field = \"github_handle\"\n\n# Projects (no explicit handle - uses slug)\n[[markata-go.mentions.from_posts]]\nfilter = \"'project' in tags\"\n```\n\n### Fallback to Slug\n\nIf `handle_field` is not specified or the frontmatter field is empty, the post's slug is used as the handle.\n\n```toml\n[[markata-go.mentions.from_posts]]\nfilter = \"'contributor' in tags\"\n# No handle_field - uses slug\n```\n\nA post at `contributors/jane-doe.md` becomes `@jane-doe`.\n\n## Resolving from Blogroll\n\nIf you have a [blogroll](/guides/blogroll/) configured, handles are automatically extracted from your RSS/Atom feeds:\n\n```toml\n[markata-go.blogroll]\nenabled = true\n\n[[markata-go.blogroll.feeds]]\nurl = \"https://daverupert.com/feed.xml\"\ntitle = \"Dave Rupert\"\nhandle = \"daverupert\"\nsite_url = \"https://daverupert.com\"\naliases = [\"dave\", \"davatron\"]\n```\n\nNow `@daverupert`, `@dave`, and `@davatron` all link to `https://daverupert.com`.\n\n## Authors as Contacts\n\nAuthors defined in your site configuration are automatically registered as mentionable contacts. If an author has a `url` field, they become a valid `@handle` target.\n\n```toml\n[markata-go.authors.authors.waylon]\nname = \"Waylon Walker\"\nurl = \"https://waylonwalker.com\"\navatar = \"/images/waylon.jpg\"\nbio = \"Python and Go developer\"\n```\n\nWith this configuration, `@waylon` becomes a valid mention that links to `https://waylonwalker.com`. The author's avatar, name, and bio are used for hovercards.\n\nAuthors are registered after blogroll feeds but before `from_posts` sources. If a blogroll feed already registered the same handle, the blogroll entry wins (first registration wins).\n\n**No extra configuration needed** -- as long as your authors have a `url` field, they are automatically available as mentions.\n\n## Authors in from_posts\n\nBy default, the mentions plugin includes posts with `template: author` as a post source, in addition to `template: contact`:\n\n```toml\n# These are the defaults (you don't need to add them):\n[[markata-go.mentions.from_posts]]\nfilter = \"template == 'contact'\"\nhandle_field = \"handle\"\n\n[[markata-go.mentions.from_posts]]\nfilter = \"template == 'author'\"\nhandle_field = \"handle\"\naliases_field = \"aliases\"\n```\n\nThis means if you have author profile pages with `template: author`, they are automatically included as mention sources.\n\n## Trailing Punctuation\n\nMentions handle trailing punctuation gracefully. When you write `@alice.` or `@bob,` at the end of a sentence, the plugin strips the punctuation and resolves the handle correctly:\n\n```markdown\nI was talking to @alice.\nCheck out @bob, they have great content.\nThanks @charlie!\n```\n\nProduces:\n\n```html\nI was talking to \u003ca class=\"mention\" href=\"...\"\u003e@alice\u003c/a\u003e.\nCheck out \u003ca class=\"mention\" href=\"...\"\u003e@bob\u003c/a\u003e, they have great content.\nThanks \u003ca class=\"mention\" href=\"...\"\u003e@charlie\u003c/a\u003e!\n```\n\nThe following trailing punctuation characters are stripped: `. , ; : ! ?`\n\n**Domain-style handles are preserved:** If the exact handle (including dots) matches a known contact, it is used as-is. For example, `@simonwillison.net` resolves to the domain handle without stripping the `.net`. Only when the exact handle fails to match does the plugin try stripping trailing punctuation.\n\n## Chat Admonitions\n\nThe mentions plugin enriches chat admonition titles with contact information. When you use `!!! chat` or `!!! chat-reply` with an `@handle`, the title is replaced with the contact's avatar and a linked mention.\n\nBoth quoted and unquoted forms work:\n\n```markdown\n!!! chat @alice\n\n    Hey, have you seen the new release?\n\n!!! chat-reply @bob\n\n    Yes! It looks great.\n\n!!! chat \"@alice\"\n\n    Quoted form works too.\n```\n\n`chat-reply` can also omit a handle to render as the post author:\n\n```markdown\n!!! chat-reply\n\n    Thanks for the update!\n```\n\nThis renders with avatar images and linked names in the admonition title, creating a conversation-style display.\n\nCollapsible chat admonitions work too:\n\n```markdown\n??? chat @alice\n\n    This content is collapsible.\n```\n\nIf the handle is not found in the contact map, the title is left unchanged.\n\n### Admonition Header Protection\n\nThe mentions plugin automatically protects `@handles` on admonition header lines from being transformed into links. This applies to all admonition types (`!!!`, `???`, `???+`), not just chat. Mentions in the body text and outside admonitions are still processed normally.\n\n```markdown\n!!! note @alice\n    This note title is preserved as-is.\n\nBut @alice in regular text is still linked.\n```\n\n### Styling Chat Admonitions\n\nChat admonitions include CSS classes for styling:\n\n```css\n.chat-contact {\n  display: inline-flex;\n  align-items: center;\n  gap: 0.5em;\n}\n\n.chat-contact-avatar {\n  width: 1.5em;\n  height: 1.5em;\n  border-radius: 50%;\n  vertical-align: middle;\n}\n\n.chat-contact-name {\n  font-weight: 600;\n}\n```\n\nThese styles are included in the default theme. Customize them to match your site's design.\n\n## Handle Resolution Priority\n\nWhen building the handle map, sources are processed in this order:\n\n1. **Blogroll feeds** (if enabled) - First registered wins\n2. **Authors** (from site config) - Authors with a `url` field\n3. **From posts** sources - Processed in order they appear in config\n\nIf the same handle is registered multiple times, the first registration wins and subsequent duplicates are logged as warnings.\n\n## Styling Mentions\n\nMention links have the configured CSS class (default: `mention`). Add styles to your CSS:\n\n```css\na.mention {\n  color: var(--color-primary);\n  font-weight: 500;\n}\n\na.mention::before {\n  content: \"\";  /* Remove @ if you want */\n}\n\na.mention:hover {\n  text-decoration: underline;\n}\n```\n\n## Code Block Protection\n\nMentions inside fenced code blocks are preserved and not transformed:\n\n````markdown\nCheck out @alice's post.\n\n```\n// @alice is not transformed here\nconst handle = \"@alice\";\n```\n````\n\n## Email Protection\n\nEmail addresses are not transformed as mentions. The plugin detects the `@` preceded by word characters and ignores them:\n\n```markdown\nContact me at test@example.com  \u003c!-- Not transformed --\u003e\nFollow @example on social       \u003c!-- Transformed --\u003e\n```\n\n## Configuration Reference\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `enabled` | bool | `true` | Enable/disable mentions processing |\n| `css_class` | string | `\"mention\"` | CSS class for mention links |\n| `cache_dir` | string | `\"cache/mentions\"` | Directory for cached external metadata |\n| `cache_duration` | string | `\"168h\"` | How long external metadata stays fresh |\n| `timeout` | int | `30` | HTTP timeout in seconds |\n| `concurrent_requests` | int | `3` | Max concurrent external metadata fetches |\n| `from_posts` | array | see below | List of internal post sources. Default: two sources with `filter = \"template == 'contact'\"` and `filter = \"template == 'author'\"`, both with `handle_field = \"handle\"` |\n\n### from_posts Options\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `filter` | string | required | Filter expression to select posts |\n| `handle_field` | string | (slug) | Frontmatter field for handle |\n| `aliases_field` | string | - | Frontmatter field for aliases |\n| `avatar_field` | string | - | Frontmatter field for avatar URL. If not set, checks `avatar`, `image`, `icon` in order |\n\n## Examples\n\n### Team Directory\n\n```toml\n[[markata-go.mentions.from_posts]]\nfilter = \"'team' in tags and published == true\"\nhandle_field = \"slack_handle\"\naliases_field = \"nicknames\"\n```\n\n### Author Profiles\n\n```toml\n[[markata-go.mentions.from_posts]]\nfilter = \"template == 'author.html'\"\nhandle_field = \"username\"\n```\n\n### Combined Sources\n\n```toml\n[markata-go.blogroll]\nenabled = true\n\n[[markata-go.blogroll.feeds]]\nurl = \"https://external-blog.com/rss\"\nhandle = \"external\"\n\n[[markata-go.mentions.from_posts]]\nfilter = \"'internal' in tags\"\nhandle_field = \"handle\"\n```\n\nNow you can use `@external` for external links and `@internal-user` for internal profile links in the same post.\n\n\n## Quote attributions with a tilde\n\nUse `\u003cspan class=\"mention mention--attribution mention--unresolved\" data-handle=\"~handle\"\u003e~handle\u003c/span\u003e` to credit the source of a short quote without turning it\ninto a prominent callout:\n\n```markdown\nif an agent cant verify its own work\n\n==nothing else matters==\n\n~poteto\n```\n\nWhen `poteto` is in your configured blogroll, Markata links it to the\ncanonical `site_url` and displays it with a quiet, theme-aware\n`mention--attribution` style. Ordinary `@poteto` references keep the\nnormal mention appearance. You can override the styling using\n`.mention--attribution` in your site CSS.\n\nIf the handle is not yet in the blogroll, `\u003cspan class=\"mention mention--attribution mention--unresolved\" data-handle=\"~poteto\"\u003e~poteto\u003c/span\u003e` stays visible and\nstyled, but is not made into a link. Markata does **not** assume that an\nidentically named GitHub/X/Bluesky account belongs to the person you\nquoted.\n\n### Lint missing mentions locally\n\n```sh\nmarkata-go lint pages/ping/ping-84.md\n```\n\nWith blogroll enabled, both `@handle` and `\u003cspan class=\"mention mention--attribution mention--unresolved\" data-handle=\"~handle\"\u003e~handle\u003c/span\u003e` produce\n`unknown-mention` warnings when they cannot be resolved to an active\nconfigured feed handle or alias. The warning suggests adding the\nperson's handle or alias to the blogroll; warnings do not fail the\nbuild. This check is deterministic and **does not search the network**.\n\nFor new people, first check your blogroll. If absent, manually\ninvestigate X/Twitter, then GitHub, then Bluesky for a verified match,\nand add the verified canonical link plus an actual feed to the\nblogroll. Never automatically insert a social profile based only on a\nusername collision.\n",
      "summary": "Resolve @handles to links from blogroll feeds and internal posts",
      "date_published": "2025-01-26T00:00:00Z",
      "date_modified": "2025-01-26T00:00:00Z",
      "tags": [
        "documentation",
        "mentions",
        "social"
      ]
    },
    {
      "id": "https://markata.dev/docs/reference/resource-hints-implementation/",
      "url": "https://markata.dev/docs/reference/resource-hints-implementation/",
      "title": "Resource Hints: Page-Specific Implementation",
      "content_html": "\u003cp\u003eThis document explains the technical implementation of page-specific resource hints and the migration from the previous site-wide approach.\u003c/p\u003e\n\u003ch2 id=\"problem-statement\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProblem Statement\u003c/span\u003e \u003ca href=\"#problem-statement\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe archive page (\u003ca href=\"https://go.waylonwalker.com/archive/\"\u003ehttps://go.waylonwalker.com/archive/\u003c/a\u003e) was generating \u003cstrong\u003e400+ dns-prefetch links\u003c/strong\u003e, most of which came from external links in the blogroll/reader feeds.\u003c/p\u003e\n\u003ch3 id=\"root-cause\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRoot Cause\u003c/span\u003e \u003ca href=\"#root-cause\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe resource hints plugin was:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eScanning \u003cstrong\u003eall HTML files\u003c/strong\u003e across the entire site\u003c/li\u003e\n\u003cli\u003eCollecting \u003cstrong\u003eevery unique external domain\u003c/strong\u003e from all pages\u003c/li\u003e\n\u003cli\u003eInjecting the \u003cstrong\u003esame comprehensive list\u003c/strong\u003e of hints into \u003cstrong\u003eevery page\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThis meant:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eArchive page showed links to hundreds of blogs from reader.waylonwalker.com\u003c/li\u003e\n\u003cli\u003eEvery domain from every blogroll link got a dns-prefetch\u003c/li\u003e\n\u003cli\u003eThe same 400+ hints appeared on every single page (homepage, blog posts, etc.)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"why-this-was-bad\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhy This Was Bad\u003c/span\u003e \u003ca href=\"#why-this-was-bad\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e❌ \u003cstrong\u003ePerformance\u003c/strong\u003e: Browsers only honor first 10-50 hints, rest are wasted\u003c/li\u003e\n\u003cli\u003e❌ \u003cstrong\u003eIrrelevant\u003c/strong\u003e: Most domains never visited from that specific page\u003c/li\u003e\n\u003cli\u003e❌ \u003cstrong\u003eBloated HTML\u003c/strong\u003e: Adds ~20KB+ of useless hints to every page\u003c/li\u003e\n\u003cli\u003e❌ \u003cstrong\u003eDNS overhead\u003c/strong\u003e: Forces browser to do hundreds of unnecessary DNS lookups\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"solution\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSolution\u003c/span\u003e \u003ca href=\"#solution\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eChanged from site-wide hints to page-specific hints.\u003c/strong\u003e\u003c/p\u003e\n\u003ch3 id=\"before-site-wide\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBefore (Site-Wide)\u003c/span\u003e \u003ca href=\"#before-site-wide\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003e1. Scan ALL pages → collect ALL domains\n2. Generate ONE big hint list (400+ domains)\n3. Inject SAME list into EVERY page\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"after-page-specific\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAfter (Page-Specific)\u003c/span\u003e \u003ca href=\"#after-page-specific\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003e1. For EACH page individually:\n   - Scan that page's content\n   - Detect only domains on THAT page\n   - Generate hints for THAT page only\n   - Inject page-specific hints\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"implementation-details\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eImplementation Details\u003c/span\u003e \u003ca href=\"#implementation-details\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"code-changes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCode Changes\u003c/span\u003e \u003ca href=\"#code-changes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eFile\u003c/strong\u003e: \u003ccode\u003epkg/plugins/resource_hints.go\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOld Behavior\u003c/strong\u003e: Two-pass algorithm\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Pass 1: Collect all domains from all pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eeach\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eHTML\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efile\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003escan\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eexternal\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edomains\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eadd\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eto\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003esite\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ewide\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edomain\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003emap\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Pass 2: Inject same hints everywhere\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egenerate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ehints\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efrom\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003esite\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ewide\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edomains\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eeach\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eHTML\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efile\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003einject\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003esame\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ehint\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eblock\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eNew Behavior\u003c/strong\u003e: Single-pass, page-specific\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eeach\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eHTML\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efile\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003escan\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eTHIS\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eexternal\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edomains\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003egenerate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ehints\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eTHIS\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eonly\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003einject\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epage\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003especific\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ehints\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"algorithm\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAlgorithm\u003c/span\u003e \u003ca href=\"#algorithm\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eResourceHintsPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eWrite\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Process each HTML file individually\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efilepath\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWalk\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eoutputDir\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epath\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003einfo\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eFileInfo\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Read this page\u0026#39;s HTML\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003ehtmlContent\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003ereadFile\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Detect domains on THIS page only\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003edetectedDomains\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edetector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eDetectExternalDomains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ehtmlContent\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Generate hints for THIS page\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003ehintTags\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egenerator\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eGenerateFromConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edetectedDomains\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Inject page-specific hints\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003emodifiedContent\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003einjectHints\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ehtmlContent\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ehintTags\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Write back\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nf\"\u003ewriteFile\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003emodifiedContent\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"key-differences\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKey Differences\u003c/span\u003e \u003ca href=\"#key-differences\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAspect\u003c/th\u003e\n\u003cth\u003eSite-Wide (Old)\u003c/th\u003e\n\u003cth\u003ePage-Specific (New)\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003ePasses\u003c/td\u003e\n\u003ctd\u003e2 (collect, inject)\u003c/td\u003e\n\u003ctd\u003e1 (detect \u0026amp; inject)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDomain scope\u003c/td\u003e\n\u003ctd\u003eAll pages\u003c/td\u003e\n\u003ctd\u003eSingle page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHint count\u003c/td\u003e\n\u003ctd\u003e400+ per page\u003c/td\u003e\n\u003ctd\u003e5-10 per page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRelevance\u003c/td\u003e\n\u003ctd\u003eLow (many unused)\u003c/td\u003e\n\u003ctd\u003eHigh (all used)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHTML size\u003c/td\u003e\n\u003ctd\u003e+20KB\u003c/td\u003e\n\u003ctd\u003e+500 bytes\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"impact-analysis\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eImpact Analysis\u003c/span\u003e \u003ca href=\"#impact-analysis\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"archive-page\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eArchive Page\u003c/span\u003e \u003ca href=\"#archive-page\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eBefore\u003c/strong\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c\"\u003e\u0026lt;!-- Auto-generated resource hints --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;dns-prefetch\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://youtube.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;dns-prefetch\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://github.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;dns-prefetch\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://dev.to\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ... (400+ more)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c\"\u003e\u0026lt;!-- End resource hints --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eAfter\u003c/strong\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c\"\u003e\u0026lt;!-- Auto-generated resource hints --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;dns-prefetch\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://cdn.jsdelivr.net\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;dns-prefetch\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://cdn.tailwindcss.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c\"\u003e\u0026lt;!-- End resource hints --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"typical-blog-post\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTypical Blog Post\u003c/span\u003e \u003ca href=\"#typical-blog-post\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eBefore\u003c/strong\u003e: 400+ hints (same site-wide list)\u003cbr\u003e\n\u003cstrong\u003eAfter\u003c/strong\u003e: 2-8 hints (YouTube/Vimeo media embeds, GitHub, images actually on post)\u003c/p\u003e\n\u003ch3 id=\"blogroll-page\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBlogroll Page\u003c/span\u003e \u003ca href=\"#blogroll-page\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eBefore\u003c/strong\u003e: 400+ hints (all blogroll domains)\u003cbr\u003e\n\u003cstrong\u003eAfter\u003c/strong\u003e: 400+ hints (still has all domains, but they\u0026rsquo;re actually on that page!)\u003c/p\u003e\n\u003ch2 id=\"performance-metrics\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePerformance Metrics\u003c/span\u003e \u003ca href=\"#performance-metrics\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"build-time\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Time\u003c/span\u003e \u003ca href=\"#build-time\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eImpact\u003c/strong\u003e: +100-200ms for typical sites (100-500 pages)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eScaling\u003c/strong\u003e: Linear with number of pages\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTrade-off\u003c/strong\u003e: Minimal build time increase for significant UX improvement\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eMeasurement\u003c/strong\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Before\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003etime\u003c/span\u003e markata build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# real    0m2.450s\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# After\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003etime\u003c/span\u003e markata build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# real    0m2.650s\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Difference: ~200ms for 300 page site\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"user-experience\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUser Experience\u003c/span\u003e \u003ca href=\"#user-experience\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eHTML Size\u003c/strong\u003e: ~20KB less per page (400 hints = ~20KB)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDNS Lookups\u003c/strong\u003e: 95% reduction in unnecessary lookups\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePage Load\u003c/strong\u003e: Faster due to relevant hints being honored\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBrowser Efficiency\u003c/strong\u003e: Browsers now honor all hints (\u0026lt; 50 per page)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"real-world-metrics\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReal-World Metrics\u003c/span\u003e \u003ca href=\"#real-world-metrics\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eExample from waylonwalker.com:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePage\u003c/th\u003e\n\u003cth\u003eBefore\u003c/th\u003e\n\u003cth\u003eAfter\u003c/th\u003e\n\u003cth\u003eReduction\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eArchive\u003c/td\u003e\n\u003ctd\u003e423 hints\u003c/td\u003e\n\u003ctd\u003e6 hints\u003c/td\u003e\n\u003ctd\u003e-98.6%\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBlog Post\u003c/td\u003e\n\u003ctd\u003e423 hints\u003c/td\u003e\n\u003ctd\u003e4 hints\u003c/td\u003e\n\u003ctd\u003e-99.1%\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHomepage\u003c/td\u003e\n\u003ctd\u003e423 hints\u003c/td\u003e\n\u003ctd\u003e8 hints\u003c/td\u003e\n\u003ctd\u003e-98.1%\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBlogroll\u003c/td\u003e\n\u003ctd\u003e423 hints\u003c/td\u003e\n\u003ctd\u003e380 hints\u003c/td\u003e\n\u003ctd\u003e-10.2%\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eAverage reduction\u003c/strong\u003e: -76% hints site-wide\u003cbr\u003e\n\u003cstrong\u003eBlogroll\u003c/strong\u003e: Still high because those domains are actually on that page!\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUsers can further customize with exclusion rules:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_detect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Exclude domains from auto-detection\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude_domains\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;reader.waylonwalker.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Don\u0026#39;t generate hints for reader links\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"alternative-approaches-considered\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAlternative Approaches Considered\u003c/span\u003e \u003ca href=\"#alternative-approaches-considered\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"option-1-page-specific-hints-implemented\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOption 1: ✅ Page-Specific Hints (Implemented)\u003c/span\u003e \u003ca href=\"#option-1-page-specific-hints-implemented\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003ePros\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMost accurate hints\u003c/li\u003e\n\u003cli\u003eBest user experience\u003c/li\u003e\n\u003cli\u003eReasonable build time impact\u003c/li\u003e\n\u003cli\u003eNo configuration required\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eCons\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSlightly longer builds (+100-200ms)\u003c/li\u003e\n\u003cli\u003eMore complex algorithm\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eDecision\u003c/strong\u003e: Implemented - Best balance of accuracy and performance\u003c/p\u003e\n\u003ch3 id=\"option-2-exclude-blogroll-domains\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOption 2: Exclude Blogroll Domains\u003c/span\u003e \u003ca href=\"#option-2-exclude-blogroll-domains\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003ePros\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eQuick fix\u003c/li\u003e\n\u003cli\u003eMinimal code changes\u003c/li\u003e\n\u003cli\u003eFast builds\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eCons\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eStill site-wide hints\u003c/li\u003e\n\u003cli\u003eConfiguration required\u003c/li\u003e\n\u003cli\u003eStill has irrelevant hints\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eDecision\u003c/strong\u003e: Not chosen - Available as supplementary option via \u003ccode\u003eexclude_domains\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"option-3-disable-auto-detection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOption 3: Disable Auto-Detection\u003c/span\u003e \u003ca href=\"#option-3-disable-auto-detection\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003ePros\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFastest builds\u003c/li\u003e\n\u003cli\u003eFull control\u003c/li\u003e\n\u003cli\u003ePredictable results\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eCons\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eManual configuration required\u003c/li\u003e\n\u003cli\u003eEasy to miss critical domains\u003c/li\u003e\n\u003cli\u003eHigh maintenance\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eDecision\u003c/strong\u003e: Available as option, not default\u003c/p\u003e\n\u003ch3 id=\"option-4-limit-number-of-hints\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOption 4: Limit Number of Hints\u003c/span\u003e \u003ca href=\"#option-4-limit-number-of-hints\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003ePros\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCaps bloat\u003c/li\u003e\n\u003cli\u003eFast builds\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eCons\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWhich domains to keep? (arbitrary)\u003c/li\u003e\n\u003cli\u003eMay exclude critical domains\u003c/li\u003e\n\u003cli\u003eDoesn\u0026rsquo;t address relevance\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eDecision\u003c/strong\u003e: Not needed with page-specific approach\u003c/p\u003e\n\u003ch2 id=\"testing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTesting\u003c/span\u003e \u003ca href=\"#testing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"unit-test\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUnit Test\u003c/span\u003e \u003ca href=\"#unit-test\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eFile\u003c/strong\u003e: \u003ccode\u003epkg/plugins/resource_hints_pagespecific_test.go\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eVerifies\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e✅ Page 1 only has domains from Page 1\u003c/li\u003e\n\u003cli\u003e✅ Page 2 only has domains from Page 2\u003c/li\u003e\n\u003cli\u003e✅ No cross-contamination of hints\u003c/li\u003e\n\u003cli\u003e✅ Hint count stays reasonable (\u0026lt; 10 per page typically)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eExample\u003c/strong\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eTestResourceHintsPageSpecific\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003et\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003etesting\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eT\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Create pages with different external links\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003epage1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003ecreatePage\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://github.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://cdn.jsdelivr.net\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003epage2\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003ecreatePage\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://youtube.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://dev.to\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Run plugin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWrite\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003emanager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Verify page 1 has only its domains\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eassert\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eContains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epage1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;github.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eassert\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNotContains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epage1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;youtube.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Verify page 2 has only its domains\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eassert\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eContains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epage2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;youtube.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eassert\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNotContains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epage2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;github.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"integration-testing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIntegration Testing\u003c/span\u003e \u003ca href=\"#integration-testing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eManual verification\u003c/strong\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build site\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Count hints on archive page\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egrep -c \u003cspan class=\"s1\"\u003e\u0026#39;rel=\u0026#34;dns-prefetch\u0026#34;\u0026#39;\u003c/span\u003e markout/archive/index.html\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Expected: ~5-10 (was 400+)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"migration-guide\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMigration Guide\u003c/span\u003e \u003ca href=\"#migration-guide\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"for-existing-sites\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFor Existing Sites\u003c/span\u003e \u003ca href=\"#for-existing-sites\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eNo action required!\u003c/strong\u003e The change is automatic:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eUpdate markata-go to latest version\u003c/li\u003e\n\u003cli\u003eRebuild your site\u003c/li\u003e\n\u003cli\u003eVerify improved hint counts\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"optional-tuning\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOptional Tuning\u003c/span\u003e \u003ca href=\"#optional-tuning\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd exclusions if desired:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude_domains\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;reader.waylonwalker.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;blogroll.example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"rollback-if-needed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRollback (If Needed)\u003c/span\u003e \u003ca href=\"#rollback-if-needed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTo disable auto-detection:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_detect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Manually configure hints\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edomains\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edomain\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cdn.jsdelivr.net\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehint_types\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;dns-prefetch\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"documentation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocumentation\u003c/span\u003e \u003ca href=\"#documentation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[[resource-hints|Resource Hints Guide]] - User documentation\u003c/li\u003e\n\u003cli\u003e[[resource-hints-quick-fix|Quick Fix Guide]] - Migration guide\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eexamples/resource_hints.toml\u003c/code\u003e - Configuration examples\u003c/li\u003e\n\u003cli\u003eThis document - Technical implementation details\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"future-improvements\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFuture Improvements\u003c/span\u003e \u003ca href=\"#future-improvements\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"potential-enhancements\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePotential Enhancements\u003c/span\u003e \u003ca href=\"#potential-enhancements\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eHint prioritization\u003c/strong\u003e - Rank domains by importance\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSmart limits\u003c/strong\u003e - Auto-cap hints at browser limits\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCritical path detection\u003c/strong\u003e - Identify critical resources\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCache awareness\u003c/strong\u003e - Skip hints for cached domains\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"performance-optimizations\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePerformance Optimizations\u003c/span\u003e \u003ca href=\"#performance-optimizations\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eParallel processing\u003c/strong\u003e - Process pages concurrently\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDomain caching\u003c/strong\u003e - Cache common domain patterns\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eIncremental builds\u003c/strong\u003e - Only process changed pages\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"related-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRelated Issues\u003c/span\u003e \u003ca href=\"#related-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eIssue #XXX: Excessive dns-prefetch links on archive page\u003c/li\u003e\n\u003cli\u003ePR #YYY: Implement page-specific resource hints\u003c/li\u003e\n\u003cli\u003eDiscussion #ZZZ: Resource hints configuration\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"references\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReferences\u003c/span\u003e \u003ca href=\"#references\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.w3.org/TR/resource-hints/\"\u003eResource Hints Spec\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/Performance/dns-prefetch\"\u003eDNS Prefetch\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://web.dev/preconnect-and-dns-prefetch/\"\u003ePreconnect Best Practices\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nThis document explains the technical implementation of page-specific resource hints and the migration from the previous site-wide approach.\n\n## Problem Statement\n\nThe archive page (https://go.waylonwalker.com/archive/) was generating **400+ dns-prefetch links**, most of which came from external links in the blogroll/reader feeds.\n\n### Root Cause\n\nThe resource hints plugin was:\n1. Scanning **all HTML files** across the entire site\n2. Collecting **every unique external domain** from all pages\n3. Injecting the **same comprehensive list** of hints into **every page**\n\nThis meant:\n- Archive page showed links to hundreds of blogs from reader.waylonwalker.com\n- Every domain from every blogroll link got a dns-prefetch\n- The same 400+ hints appeared on every single page (homepage, blog posts, etc.)\n\n### Why This Was Bad\n\n- ❌ **Performance**: Browsers only honor first 10-50 hints, rest are wasted\n- ❌ **Irrelevant**: Most domains never visited from that specific page\n- ❌ **Bloated HTML**: Adds ~20KB+ of useless hints to every page\n- ❌ **DNS overhead**: Forces browser to do hundreds of unnecessary DNS lookups\n\n## Solution\n\n**Changed from site-wide hints to page-specific hints.**\n\n### Before (Site-Wide)\n\n```\n1. Scan ALL pages → collect ALL domains\n2. Generate ONE big hint list (400+ domains)\n3. Inject SAME list into EVERY page\n```\n\n### After (Page-Specific)\n\n```\n1. For EACH page individually:\n   - Scan that page's content\n   - Detect only domains on THAT page\n   - Generate hints for THAT page only\n   - Inject page-specific hints\n```\n\n## Implementation Details\n\n### Code Changes\n\n**File**: `pkg/plugins/resource_hints.go`\n\n**Old Behavior**: Two-pass algorithm\n\n```go\n// Pass 1: Collect all domains from all pages\nfor each HTML file:\n    scan for external domains\n    add to site-wide domain map\n\n// Pass 2: Inject same hints everywhere\ngenerate hints from site-wide domains\nfor each HTML file:\n    inject same hint block\n```\n\n**New Behavior**: Single-pass, page-specific\n\n```go\nfor each HTML file:\n    scan THIS page for external domains\n    generate hints for THIS page only\n    inject page-specific hints\n```\n\n### Algorithm\n\n```go\nfunc (p *ResourceHintsPlugin) Write(m *lifecycle.Manager) error {\n    // Process each HTML file individually\n    return filepath.Walk(outputDir, func(path string, info os.FileInfo, err error) error {\n        // Read this page's HTML\n        htmlContent := readFile(path)\n\n        // Detect domains on THIS page only\n        detectedDomains := p.detector.DetectExternalDomains(htmlContent)\n\n        // Generate hints for THIS page\n        hintTags := p.generator.GenerateFromConfig(p.config, detectedDomains)\n\n        // Inject page-specific hints\n        modifiedContent := p.injectHints(htmlContent, hintTags)\n\n        // Write back\n        writeFile(path, modifiedContent)\n    })\n}\n```\n\n### Key Differences\n\n| Aspect | Site-Wide (Old) | Page-Specific (New) |\n|--------|----------------|---------------------|\n| Passes | 2 (collect, inject) | 1 (detect \u0026 inject) |\n| Domain scope | All pages | Single page |\n| Hint count | 400+ per page | 5-10 per page |\n| Relevance | Low (many unused) | High (all used) |\n| HTML size | +20KB | +500 bytes |\n\n## Impact Analysis\n\n### Archive Page\n\n**Before**:\n```html\n\u003chead\u003e\n  \u003c!-- Auto-generated resource hints --\u003e\n  \u003clink rel=\"dns-prefetch\" href=\"https://youtube.com\"\u003e\n  \u003clink rel=\"dns-prefetch\" href=\"https://github.com\"\u003e\n  \u003clink rel=\"dns-prefetch\" href=\"https://dev.to\"\u003e\n  ... (400+ more)\n  \u003c!-- End resource hints --\u003e\n\u003c/head\u003e\n```\n\n**After**:\n```html\n\u003chead\u003e\n  \u003c!-- Auto-generated resource hints --\u003e\n  \u003clink rel=\"dns-prefetch\" href=\"https://cdn.jsdelivr.net\"\u003e\n  \u003clink rel=\"dns-prefetch\" href=\"https://cdn.tailwindcss.com\"\u003e\n  \u003c!-- End resource hints --\u003e\n\u003c/head\u003e\n```\n\n### Typical Blog Post\n\n**Before**: 400+ hints (same site-wide list)  \n**After**: 2-8 hints (YouTube/Vimeo media embeds, GitHub, images actually on post)\n\n### Blogroll Page\n\n**Before**: 400+ hints (all blogroll domains)  \n**After**: 400+ hints (still has all domains, but they're actually on that page!)\n\n## Performance Metrics\n\n### Build Time\n\n- **Impact**: +100-200ms for typical sites (100-500 pages)\n- **Scaling**: Linear with number of pages\n- **Trade-off**: Minimal build time increase for significant UX improvement\n\n**Measurement**:\n```bash\n# Before\ntime markata build\n# real    0m2.450s\n\n# After\ntime markata build\n# real    0m2.650s\n\n# Difference: ~200ms for 300 page site\n```\n\n### User Experience\n\n- **HTML Size**: ~20KB less per page (400 hints = ~20KB)\n- **DNS Lookups**: 95% reduction in unnecessary lookups\n- **Page Load**: Faster due to relevant hints being honored\n- **Browser Efficiency**: Browsers now honor all hints (\u003c 50 per page)\n\n### Real-World Metrics\n\nExample from waylonwalker.com:\n\n| Page | Before | After | Reduction |\n|------|--------|-------|-----------|\n| Archive | 423 hints | 6 hints | -98.6% |\n| Blog Post | 423 hints | 4 hints | -99.1% |\n| Homepage | 423 hints | 8 hints | -98.1% |\n| Blogroll | 423 hints | 380 hints | -10.2% |\n\n**Average reduction**: -76% hints site-wide  \n**Blogroll**: Still high because those domains are actually on that page!\n\n## Configuration\n\nUsers can further customize with exclusion rules:\n\n```toml\n[resource_hints]\nenabled = true\nauto_detect = true\n\n# Exclude domains from auto-detection\nexclude_domains = [\n    \"reader.waylonwalker.com\",  # Don't generate hints for reader links\n]\n```\n\n## Alternative Approaches Considered\n\n### Option 1: ✅ Page-Specific Hints (Implemented)\n\n**Pros**:\n- Most accurate hints\n- Best user experience\n- Reasonable build time impact\n- No configuration required\n\n**Cons**:\n- Slightly longer builds (+100-200ms)\n- More complex algorithm\n\n**Decision**: Implemented - Best balance of accuracy and performance\n\n### Option 2: Exclude Blogroll Domains\n\n**Pros**:\n- Quick fix\n- Minimal code changes\n- Fast builds\n\n**Cons**:\n- Still site-wide hints\n- Configuration required\n- Still has irrelevant hints\n\n**Decision**: Not chosen - Available as supplementary option via `exclude_domains`\n\n### Option 3: Disable Auto-Detection\n\n**Pros**:\n- Fastest builds\n- Full control\n- Predictable results\n\n**Cons**:\n- Manual configuration required\n- Easy to miss critical domains\n- High maintenance\n\n**Decision**: Available as option, not default\n\n### Option 4: Limit Number of Hints\n\n**Pros**:\n- Caps bloat\n- Fast builds\n\n**Cons**:\n- Which domains to keep? (arbitrary)\n- May exclude critical domains\n- Doesn't address relevance\n\n**Decision**: Not needed with page-specific approach\n\n## Testing\n\n### Unit Test\n\n**File**: `pkg/plugins/resource_hints_pagespecific_test.go`\n\n**Verifies**:\n- ✅ Page 1 only has domains from Page 1\n- ✅ Page 2 only has domains from Page 2\n- ✅ No cross-contamination of hints\n- ✅ Hint count stays reasonable (\u003c 10 per page typically)\n\n**Example**:\n```go\nfunc TestResourceHintsPageSpecific(t *testing.T) {\n    // Create pages with different external links\n    page1 := createPage(\"https://github.com\", \"https://cdn.jsdelivr.net\")\n    page2 := createPage(\"https://youtube.com\", \"https://dev.to\")\n\n    // Run plugin\n    plugin.Write(manager)\n\n    // Verify page 1 has only its domains\n    assert.Contains(page1, \"github.com\")\n    assert.NotContains(page1, \"youtube.com\")\n\n    // Verify page 2 has only its domains\n    assert.Contains(page2, \"youtube.com\")\n    assert.NotContains(page2, \"github.com\")\n}\n```\n\n### Integration Testing\n\n**Manual verification**:\n```bash\n# Build site\nmarkata build\n\n# Count hints on archive page\ngrep -c 'rel=\"dns-prefetch\"' markout/archive/index.html\n\n# Expected: ~5-10 (was 400+)\n```\n\n## Migration Guide\n\n### For Existing Sites\n\n**No action required!** The change is automatic:\n\n1. Update markata-go to latest version\n2. Rebuild your site\n3. Verify improved hint counts\n\n### Optional Tuning\n\nAdd exclusions if desired:\n\n```toml\n[resource_hints]\nexclude_domains = [\n    \"reader.waylonwalker.com\",\n    \"blogroll.example.com\",\n]\n```\n\n### Rollback (If Needed)\n\nTo disable auto-detection:\n\n```toml\n[resource_hints]\nauto_detect = false\n\n# Manually configure hints\n[[resource_hints.domains]]\ndomain = \"cdn.jsdelivr.net\"\nhint_types = [\"dns-prefetch\"]\n```\n\n## Documentation\n\n- [[resource-hints|Resource Hints Guide]] - User documentation\n- [[resource-hints-quick-fix|Quick Fix Guide]] - Migration guide\n- `examples/resource_hints.toml` - Configuration examples\n- This document - Technical implementation details\n\n## Future Improvements\n\n### Potential Enhancements\n\n1. **Hint prioritization** - Rank domains by importance\n2. **Smart limits** - Auto-cap hints at browser limits\n3. **Critical path detection** - Identify critical resources\n4. **Cache awareness** - Skip hints for cached domains\n\n### Performance Optimizations\n\n1. **Parallel processing** - Process pages concurrently\n2. **Domain caching** - Cache common domain patterns\n3. **Incremental builds** - Only process changed pages\n\n## Related Issues\n\n- Issue #XXX: Excessive dns-prefetch links on archive page\n- PR #YYY: Implement page-specific resource hints\n- Discussion #ZZZ: Resource hints configuration\n\n## References\n\n- [Resource Hints Spec](https://www.w3.org/TR/resource-hints/)\n- [DNS Prefetch](https://developer.mozilla.org/en-US/docs/Web/Performance/dns-prefetch)\n- [Preconnect Best Practices](https://web.dev/preconnect-and-dns-prefetch/)\n",
      "summary": "Technical details of the page-specific resource hints implementation and migration from site-wide hints",
      "date_published": "2025-01-25T00:00:00Z",
      "date_modified": "2025-01-25T00:00:00Z",
      "tags": [
        "documentation",
        "technical",
        "resource-hints",
        "architecture",
        "performance"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/resource-hints/",
      "url": "https://markata.dev/docs/guides/resource-hints/",
      "title": "Resource Hints",
      "content_html": "\u003cp\u003eThe Resource Hints plugin automatically generates and injects resource hints (\u003ccode\u003edns-prefetch\u003c/code\u003e, \u003ccode\u003epreconnect\u003c/code\u003e, \u003ccode\u003epreload\u003c/code\u003e, \u003ccode\u003eprefetch\u003c/code\u003e) into your HTML pages to improve performance.\u003c/p\u003e\n\u003ch2 id=\"overview\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOverview\u003c/span\u003e \u003ca href=\"#overview\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eResource hints help browsers prepare for external resources before they\u0026rsquo;re needed, improving page load performance by:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eDNS Prefetch\u003c/strong\u003e: Performing DNS lookups in advance\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePreconnect\u003c/strong\u003e: Establishing full connections (DNS + TCP + TLS) early\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePreload\u003c/strong\u003e: Fetching critical resources before the browser discovers them\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePrefetch\u003c/strong\u003e: Loading resources for future navigation\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"page-specific-hints\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePage-Specific Hints\u003c/span\u003e \u003ca href=\"#page-specific-hints\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAs of the latest version, each page gets resource hints \u003cstrong\u003eonly for external domains detected on that specific page\u003c/strong\u003e, rather than a site-wide list.\u003c/p\u003e\n\u003ch3 id=\"benefits\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBenefits\u003c/span\u003e \u003ca href=\"#benefits\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e✅ \u003cstrong\u003eReduced HTML bloat\u003c/strong\u003e - Typically 5-20 hints per page instead of 400+\u003c/li\u003e\n\u003cli\u003e✅ \u003cstrong\u003eBetter performance\u003c/strong\u003e - Browsers honor relevant hints (ignore excess)\u003c/li\u003e\n\u003cli\u003e✅ \u003cstrong\u003eMore accurate\u003c/strong\u003e - Hints match actual page needs\u003c/li\u003e\n\u003cli\u003e✅ \u003cstrong\u003eCleaner code\u003c/strong\u003e - No irrelevant dns-prefetch pollution\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"before-vs-after\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBefore vs After\u003c/span\u003e \u003ca href=\"#before-vs-after\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eBefore\u003c/strong\u003e (site-wide approach):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eScanned all pages, collected all domains\u003c/li\u003e\n\u003cli\u003eGenerated one comprehensive list\u003c/li\u003e\n\u003cli\u003eInjected same 400+ hints everywhere\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eAfter\u003c/strong\u003e (page-specific approach):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEach page scanned individually\u003c/li\u003e\n\u003cli\u003eHints generated per page\u003c/li\u003e\n\u003cli\u003eOnly relevant domains included\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd resource hints configuration to your \u003ccode\u003emarkata.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Enable/disable resource hints generation (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Enable auto-detection of external domains in HTML/CSS (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_detect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Exclude specific domains from auto-detection\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Useful for pages with many external links (blogrolls, reader pages, etc.)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude_domains\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;reader.waylonwalker.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Exclude links from your reader\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Manually configure hints for specific domains\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edomains\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edomain\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cdn.jsdelivr.net\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehint_types\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;dns-prefetch\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edomains\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edomain\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;fonts.googleapis.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehint_types\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;preconnect\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecrossorigin\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;anonymous\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"hint-types\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHint Types\u003c/span\u003e \u003ca href=\"#hint-types\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"dns-prefetch\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDNS Prefetch\u003c/span\u003e \u003ca href=\"#dns-prefetch\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePerforms DNS lookup in advance with minimal overhead. Good for third-party resources.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edomains\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edomain\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cdn.jsdelivr.net\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehint_types\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;dns-prefetch\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eWhen to use\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThird-party CDNs\u003c/li\u003e\n\u003cli\u003eAnalytics domains\u003c/li\u003e\n\u003cli\u003eSocial media widgets\u003c/li\u003e\n\u003cli\u003eAny domain not critical but likely to be used\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"preconnect\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePreconnect\u003c/span\u003e \u003ca href=\"#preconnect\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEstablishes full connection (DNS + TCP + TLS handshake). Higher overhead but faster when resource is actually needed.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edomains\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edomain\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;fonts.googleapis.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehint_types\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;preconnect\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecrossorigin\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;anonymous\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eWhen to use\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCritical resources (fonts, critical CSS/JS)\u003c/li\u003e\n\u003cli\u003eDomains you know will be used immediately\u003c/li\u003e\n\u003cli\u003eA media origin only when the media starts immediately; YouTube and Vimeo\ndiscovered from page links use \u003ccode\u003edns-prefetch\u003c/code\u003e so a link alone does not open a\nTCP/TLS connection\u003c/li\u003e\n\u003cli\u003eLimit to 3-5 per page for best results\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"preload\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePreload\u003c/span\u003e \u003ca href=\"#preload\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFetches specific resources early. Requires the \u003ccode\u003eas\u003c/code\u003e attribute.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edomains\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edomain\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;fonts.gstatic.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehint_types\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;preload\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eas\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;font\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecrossorigin\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;anonymous\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eWhen to use\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCritical fonts\u003c/li\u003e\n\u003cli\u003eAbove-the-fold images\u003c/li\u003e\n\u003cli\u003eEssential scripts/styles\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"prefetch\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrefetch\u003c/span\u003e \u003ca href=\"#prefetch\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eLow-priority fetch for future navigation.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edomains\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edomain\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;next-page-cdn.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehint_types\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;prefetch\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eWhen to use\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eResources for next likely page\u003c/li\u003e\n\u003cli\u003eAssets for common navigation paths\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"excluding-domains\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExcluding Domains\u003c/span\u003e \u003ca href=\"#excluding-domains\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf you have pages with many external links (blogroll, reader page), exclude those domains from auto-detection:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude_domains\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;reader.waylonwalker.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Don\u0026#39;t generate hints for blogroll links\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;twitter.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Social media often not critical\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;github.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e               \u003cspan class=\"c\"\u003e# Code hosting links\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"why-exclude\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhy Exclude?\u003c/span\u003e \u003ca href=\"#why-exclude\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePages like blogrolls or RSS readers may have hundreds of external links. These domains:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAre rarely visited from the current page\u003c/li\u003e\n\u003cli\u003eWould generate excessive hints (400+)\u003c/li\u003e\n\u003cli\u003eWaste browser resources on unused DNS lookups\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eExample\u003c/strong\u003e: Your archive page shows posts that link to many blogs. Those blog domains shouldn\u0026rsquo;t generate hints because users don\u0026rsquo;t typically visit them from the archive.\u003c/p\u003e\n\u003ch2 id=\"performance-impact\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePerformance Impact\u003c/span\u003e \u003ca href=\"#performance-impact\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"build-time\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Time\u003c/span\u003e \u003ca href=\"#build-time\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eImpact\u003c/strong\u003e: Minimal, typically +100-200ms for 100-500 page sites\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eScaling\u003c/strong\u003e: Linear with number of pages\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTrade-off\u003c/strong\u003e: Slightly longer builds for significantly better UX\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"user-experience\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUser Experience\u003c/span\u003e \u003ca href=\"#user-experience\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eHTML Size\u003c/strong\u003e: ~20KB less per page (without irrelevant hints)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDNS Lookups\u003c/strong\u003e: Only relevant domains, better cache utilization\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePage Load\u003c/strong\u003e: Faster due to early DNS resolution of actually-used domains\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBrowser Efficiency\u003c/strong\u003e: Browsers honor reasonable hint counts (10-50)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"best-practices\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBest Practices\u003c/span\u003e \u003ca href=\"#best-practices\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"1-use-dns-prefetch-for-most-domains\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e1. Use DNS Prefetch for Most Domains\u003c/span\u003e \u003ca href=\"#1-use-dns-prefetch-for-most-domains\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eLow overhead, good for any external resource:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edomains\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edomain\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cdn.jsdelivr.net\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehint_types\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;dns-prefetch\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"2-reserve-preconnect-for-critical-origins\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e2. Reserve Preconnect for Critical Origins\u003c/span\u003e \u003ca href=\"#2-reserve-preconnect-for-critical-origins\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eLimit to 3-5 per page:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edomains\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edomain\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;fonts.googleapis.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehint_types\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;preconnect\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edomains\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edomain\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cdn.critical-resource.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehint_types\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;preconnect\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"3-exclude-blogroll-reader-links\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e3. Exclude Blogroll/Reader Links\u003c/span\u003e \u003ca href=\"#3-exclude-blogroll-reader-links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude_domains\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;reader.waylonwalker.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"4-monitor-hint-counts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e4. Monitor Hint Counts\u003c/span\u003e \u003ca href=\"#4-monitor-hint-counts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEach page should have \u0026lt; 20 hints for optimal results. Check your HTML:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Count hints on a page\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egrep -c \u003cspan class=\"s1\"\u003e\u0026#39;rel=\u0026#34;dns-prefetch\u0026#34;\u0026#39;\u003c/span\u003e output/archive/index.html\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"5-combine-with-other-optimizations\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e5. Combine with Other Optimizations\u003c/span\u003e \u003ca href=\"#5-combine-with-other-optimizations\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eMinimize external dependencies\u003c/li\u003e\n\u003cli\u003eSelf-host critical resources when possible\u003c/li\u003e\n\u003cli\u003eUse CDNs with good performance\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"example-output\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample Output\u003c/span\u003e \u003ca href=\"#example-output\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"typical-blog-post\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTypical Blog Post\u003c/span\u003e \u003ca href=\"#typical-blog-post\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003echarset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;UTF-8\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c\"\u003e\u0026lt;!-- Auto-generated resource hints --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;dns-prefetch\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://cdn.jsdelivr.net\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;dns-prefetch\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://www.youtube.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;dns-prefetch\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://github.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;dns-prefetch\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://i.ytimg.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c\"\u003e\u0026lt;!-- End resource hints --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eBlog Post\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"archive-page-after-fix\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eArchive Page (After Fix)\u003c/span\u003e \u003ca href=\"#archive-page-after-fix\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003echarset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;UTF-8\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c\"\u003e\u0026lt;!-- Auto-generated resource hints --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;dns-prefetch\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://cdn.jsdelivr.net\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;dns-prefetch\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://cdn.tailwindcss.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c\"\u003e\u0026lt;!-- End resource hints --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eArchive\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"too-many-hints-on-a-page\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eToo Many Hints on a Page?\u003c/span\u003e \u003ca href=\"#too-many-hints-on-a-page\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptoms\u003c/strong\u003e: Page has 50+ hints\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolutions\u003c/strong\u003e:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCheck if page has many external links (blogroll, reader)\u003c/li\u003e\n\u003cli\u003eAdd those domains to \u003ccode\u003eexclude_domains\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eConsider disabling auto-detection for specific content types\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude_domains\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;reader.waylonwalker.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;blogroll.example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"hints-not-showing-up\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHints Not Showing Up?\u003c/span\u003e \u003ca href=\"#hints-not-showing-up\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eCheck\u003c/strong\u003e:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003eenabled = true\u003c/code\u003e in config\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eauto_detect = true\u003c/code\u003e in config\u003c/li\u003e\n\u003cli\u003ePage has external URLs in \u003ccode\u003ehref\u003c/code\u003e or \u003ccode\u003esrc\u003c/code\u003e attributes\u003c/li\u003e\n\u003cli\u003ePage has \u003ccode\u003e\u0026lt;head\u0026gt;\u003c/code\u003e tag\u003c/li\u003e\n\u003cli\u003eBuild logs for errors\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"build-time-increased\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Time Increased?\u003c/span\u003e \u003ca href=\"#build-time-increased\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eExpected\u003c/strong\u003e: +100-200ms for typical sites\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eIf excessive\u003c/strong\u003e (\u0026gt; 1 second):\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCheck number of pages (scales linearly)\u003c/li\u003e\n\u003cli\u003eConsider disabling auto-detection:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_detect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003col start=\"3\"\u003e\n\u003cli\u003eManually configure critical domains only\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"duplicate-hints\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDuplicate Hints?\u003c/span\u003e \u003ca href=\"#duplicate-hints\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptoms\u003c/strong\u003e: Multiple hints for same domain\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCause\u003c/strong\u003e: Both manual config and auto-detection enabled\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution\u003c/strong\u003e: Choose one approach:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Option 1: Auto-detect only\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_detect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Option 2: Manual only\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_detect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edomains\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edomain\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cdn.example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehint_types\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;dns-prefetch\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"advanced-usage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdvanced Usage\u003c/span\u003e \u003ca href=\"#advanced-usage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"per-domain-hint-types\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePer-Domain Hint Types\u003c/span\u003e \u003ca href=\"#per-domain-hint-types\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSome domains benefit from multiple hint types:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edomains\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edomain\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;fonts.googleapis.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehint_types\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;dns-prefetch\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;preconnect\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis generates both:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;dns-prefetch\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://fonts.googleapis.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;preconnect\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://fonts.googleapis.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"cross-origin-hints\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCross-Origin Hints\u003c/span\u003e \u003ca href=\"#cross-origin-hints\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor resources requiring CORS:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edomains\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edomain\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;fonts.gstatic.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehint_types\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;preconnect\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecrossorigin\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;anonymous\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eGenerates:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;preconnect\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://fonts.gstatic.com\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ecrossorigin\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"preload-with-type\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePreload with Type\u003c/span\u003e \u003ca href=\"#preload-with-type\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor specific resource types:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edomains\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edomain\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cdn.example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehint_types\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;preload\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eas\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;font\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecrossorigin\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;anonymous\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eGenerates:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;preload\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://cdn.example.com\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eas\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;font\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ecrossorigin\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"migration-from-site-wide-hints\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMigration from Site-Wide Hints\u003c/span\u003e \u003ca href=\"#migration-from-site-wide-hints\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf you\u0026rsquo;re upgrading from an older version:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eNo action required\u003c/strong\u003e - Works automatically\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOptional\u003c/strong\u003e: Add \u003ccode\u003eexclude_domains\u003c/code\u003e for fine-tuning\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRebuild\u003c/strong\u003e to see reduced hint counts\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVerify\u003c/strong\u003e pages load correctly\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eYour site will automatically benefit from:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSmaller HTML files\u003c/li\u003e\n\u003cli\u003eFaster page loads\u003c/li\u003e\n\u003cli\u003eMore relevant resource hints\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"related-documentation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRelated Documentation\u003c/span\u003e \u003ca href=\"#related-documentation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[[performance|Performance Guide]] - Overall site optimization\u003c/li\u003e\n\u003cli\u003e[[configuration|Configuration Reference]] - All config options\u003c/li\u003e\n\u003cli\u003e[[plugin-development|Plugin Development]] - Extending markata-go\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.w3.org/TR/resource-hints/\"\u003eResource Hints Spec\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/Performance/dns-prefetch\"\u003eDNS Prefetch\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/Performance/Speculative_loading#preconnect\"\u003ePreconnect\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nThe Resource Hints plugin automatically generates and injects resource hints (`dns-prefetch`, `preconnect`, `preload`, `prefetch`) into your HTML pages to improve performance.\n\n## Overview\n\nResource hints help browsers prepare for external resources before they're needed, improving page load performance by:\n\n- **DNS Prefetch**: Performing DNS lookups in advance\n- **Preconnect**: Establishing full connections (DNS + TCP + TLS) early\n- **Preload**: Fetching critical resources before the browser discovers them\n- **Prefetch**: Loading resources for future navigation\n\n## Page-Specific Hints\n\nAs of the latest version, each page gets resource hints **only for external domains detected on that specific page**, rather than a site-wide list.\n\n### Benefits\n\n- ✅ **Reduced HTML bloat** - Typically 5-20 hints per page instead of 400+\n- ✅ **Better performance** - Browsers honor relevant hints (ignore excess)\n- ✅ **More accurate** - Hints match actual page needs\n- ✅ **Cleaner code** - No irrelevant dns-prefetch pollution\n\n### Before vs After\n\n**Before** (site-wide approach):\n- Scanned all pages, collected all domains\n- Generated one comprehensive list\n- Injected same 400+ hints everywhere\n\n**After** (page-specific approach):\n- Each page scanned individually\n- Hints generated per page\n- Only relevant domains included\n\n## Configuration\n\nAdd resource hints configuration to your `markata.toml`:\n\n```toml\n[resource_hints]\n# Enable/disable resource hints generation (default: true)\nenabled = true\n\n# Enable auto-detection of external domains in HTML/CSS (default: true)\nauto_detect = true\n\n# Exclude specific domains from auto-detection\n# Useful for pages with many external links (blogrolls, reader pages, etc.)\nexclude_domains = [\n    \"example.com\",\n    \"reader.waylonwalker.com\",  # Exclude links from your reader\n]\n\n# Manually configure hints for specific domains\n[[resource_hints.domains]]\ndomain = \"cdn.jsdelivr.net\"\nhint_types = [\"dns-prefetch\"]\n\n[[resource_hints.domains]]\ndomain = \"fonts.googleapis.com\"\nhint_types = [\"preconnect\"]\ncrossorigin = \"anonymous\"\n```\n\n## Hint Types\n\n### DNS Prefetch\n\nPerforms DNS lookup in advance with minimal overhead. Good for third-party resources.\n\n```toml\n[[resource_hints.domains]]\ndomain = \"cdn.jsdelivr.net\"\nhint_types = [\"dns-prefetch\"]\n```\n\n**When to use**:\n- Third-party CDNs\n- Analytics domains\n- Social media widgets\n- Any domain not critical but likely to be used\n\n### Preconnect\n\nEstablishes full connection (DNS + TCP + TLS handshake). Higher overhead but faster when resource is actually needed.\n\n```toml\n[[resource_hints.domains]]\ndomain = \"fonts.googleapis.com\"\nhint_types = [\"preconnect\"]\ncrossorigin = \"anonymous\"\n```\n\n**When to use**:\n- Critical resources (fonts, critical CSS/JS)\n- Domains you know will be used immediately\n- A media origin only when the media starts immediately; YouTube and Vimeo\n  discovered from page links use `dns-prefetch` so a link alone does not open a\n  TCP/TLS connection\n- Limit to 3-5 per page for best results\n\n### Preload\n\nFetches specific resources early. Requires the `as` attribute.\n\n```toml\n[[resource_hints.domains]]\ndomain = \"fonts.gstatic.com\"\nhint_types = [\"preload\"]\nas = \"font\"\ncrossorigin = \"anonymous\"\n```\n\n**When to use**:\n- Critical fonts\n- Above-the-fold images\n- Essential scripts/styles\n\n### Prefetch\n\nLow-priority fetch for future navigation.\n\n```toml\n[[resource_hints.domains]]\ndomain = \"next-page-cdn.com\"\nhint_types = [\"prefetch\"]\n```\n\n**When to use**:\n- Resources for next likely page\n- Assets for common navigation paths\n\n## Excluding Domains\n\nIf you have pages with many external links (blogroll, reader page), exclude those domains from auto-detection:\n\n```toml\n[resource_hints]\nexclude_domains = [\n    \"reader.waylonwalker.com\",  # Don't generate hints for blogroll links\n    \"twitter.com\",              # Social media often not critical\n    \"github.com\",               # Code hosting links\n]\n```\n\n### Why Exclude?\n\nPages like blogrolls or RSS readers may have hundreds of external links. These domains:\n- Are rarely visited from the current page\n- Would generate excessive hints (400+)\n- Waste browser resources on unused DNS lookups\n\n**Example**: Your archive page shows posts that link to many blogs. Those blog domains shouldn't generate hints because users don't typically visit them from the archive.\n\n## Performance Impact\n\n### Build Time\n\n- **Impact**: Minimal, typically +100-200ms for 100-500 page sites\n- **Scaling**: Linear with number of pages\n- **Trade-off**: Slightly longer builds for significantly better UX\n\n### User Experience\n\n- **HTML Size**: ~20KB less per page (without irrelevant hints)\n- **DNS Lookups**: Only relevant domains, better cache utilization\n- **Page Load**: Faster due to early DNS resolution of actually-used domains\n- **Browser Efficiency**: Browsers honor reasonable hint counts (10-50)\n\n## Best Practices\n\n### 1. Use DNS Prefetch for Most Domains\n\nLow overhead, good for any external resource:\n\n```toml\n[[resource_hints.domains]]\ndomain = \"cdn.jsdelivr.net\"\nhint_types = [\"dns-prefetch\"]\n```\n\n### 2. Reserve Preconnect for Critical Origins\n\nLimit to 3-5 per page:\n\n```toml\n[[resource_hints.domains]]\ndomain = \"fonts.googleapis.com\"\nhint_types = [\"preconnect\"]\n\n[[resource_hints.domains]]\ndomain = \"cdn.critical-resource.com\"\nhint_types = [\"preconnect\"]\n```\n\n### 3. Exclude Blogroll/Reader Links\n\n```toml\n[resource_hints]\nexclude_domains = [\"reader.waylonwalker.com\"]\n```\n\n### 4. Monitor Hint Counts\n\nEach page should have \u003c 20 hints for optimal results. Check your HTML:\n\n```bash\n# Count hints on a page\ngrep -c 'rel=\"dns-prefetch\"' output/archive/index.html\n```\n\n### 5. Combine with Other Optimizations\n\n- Minimize external dependencies\n- Self-host critical resources when possible\n- Use CDNs with good performance\n\n## Example Output\n\n### Typical Blog Post\n\n```html\n\u003chead\u003e\n  \u003cmeta charset=\"UTF-8\"\u003e\n\n  \u003c!-- Auto-generated resource hints --\u003e\n  \u003clink rel=\"dns-prefetch\" href=\"https://cdn.jsdelivr.net\"\u003e\n  \u003clink rel=\"dns-prefetch\" href=\"https://www.youtube.com\"\u003e\n  \u003clink rel=\"dns-prefetch\" href=\"https://github.com\"\u003e\n  \u003clink rel=\"dns-prefetch\" href=\"https://i.ytimg.com\"\u003e\n  \u003c!-- End resource hints --\u003e\n\n  \u003ctitle\u003eBlog Post\u003c/title\u003e\n  ...\n\u003c/head\u003e\n```\n\n### Archive Page (After Fix)\n\n```html\n\u003chead\u003e\n  \u003cmeta charset=\"UTF-8\"\u003e\n\n  \u003c!-- Auto-generated resource hints --\u003e\n  \u003clink rel=\"dns-prefetch\" href=\"https://cdn.jsdelivr.net\"\u003e\n  \u003clink rel=\"dns-prefetch\" href=\"https://cdn.tailwindcss.com\"\u003e\n  \u003c!-- End resource hints --\u003e\n\n  \u003ctitle\u003eArchive\u003c/title\u003e\n  ...\n\u003c/head\u003e\n```\n\n## Troubleshooting\n\n### Too Many Hints on a Page?\n\n**Symptoms**: Page has 50+ hints\n\n**Solutions**:\n1. Check if page has many external links (blogroll, reader)\n2. Add those domains to `exclude_domains`\n3. Consider disabling auto-detection for specific content types\n\n```toml\n[resource_hints]\nexclude_domains = [\n    \"reader.waylonwalker.com\",\n    \"blogroll.example.com\",\n]\n```\n\n### Hints Not Showing Up?\n\n**Check**:\n1. `enabled = true` in config\n2. `auto_detect = true` in config\n3. Page has external URLs in `href` or `src` attributes\n4. Page has `\u003chead\u003e` tag\n5. Build logs for errors\n\n### Build Time Increased?\n\n**Expected**: +100-200ms for typical sites\n\n**If excessive** (\u003e 1 second):\n1. Check number of pages (scales linearly)\n2. Consider disabling auto-detection:\n\n```toml\n[resource_hints]\nauto_detect = false\n```\n\n3. Manually configure critical domains only\n\n### Duplicate Hints?\n\n**Symptoms**: Multiple hints for same domain\n\n**Cause**: Both manual config and auto-detection enabled\n\n**Solution**: Choose one approach:\n\n```toml\n# Option 1: Auto-detect only\n[resource_hints]\nauto_detect = true\n\n# Option 2: Manual only\n[resource_hints]\nauto_detect = false\n\n[[resource_hints.domains]]\ndomain = \"cdn.example.com\"\nhint_types = [\"dns-prefetch\"]\n```\n\n## Advanced Usage\n\n### Per-Domain Hint Types\n\nSome domains benefit from multiple hint types:\n\n```toml\n[[resource_hints.domains]]\ndomain = \"fonts.googleapis.com\"\nhint_types = [\"dns-prefetch\", \"preconnect\"]\n```\n\nThis generates both:\n```html\n\u003clink rel=\"dns-prefetch\" href=\"https://fonts.googleapis.com\"\u003e\n\u003clink rel=\"preconnect\" href=\"https://fonts.googleapis.com\"\u003e\n```\n\n### Cross-Origin Hints\n\nFor resources requiring CORS:\n\n```toml\n[[resource_hints.domains]]\ndomain = \"fonts.gstatic.com\"\nhint_types = [\"preconnect\"]\ncrossorigin = \"anonymous\"\n```\n\nGenerates:\n```html\n\u003clink rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin\u003e\n```\n\n### Preload with Type\n\nFor specific resource types:\n\n```toml\n[[resource_hints.domains]]\ndomain = \"cdn.example.com\"\nhint_types = [\"preload\"]\nas = \"font\"\ncrossorigin = \"anonymous\"\n```\n\nGenerates:\n```html\n\u003clink rel=\"preload\" href=\"https://cdn.example.com\" as=\"font\" crossorigin\u003e\n```\n\n## Migration from Site-Wide Hints\n\nIf you're upgrading from an older version:\n\n1. **No action required** - Works automatically\n2. **Optional**: Add `exclude_domains` for fine-tuning\n3. **Rebuild** to see reduced hint counts\n4. **Verify** pages load correctly\n\nYour site will automatically benefit from:\n- Smaller HTML files\n- Faster page loads\n- More relevant resource hints\n\n## Related Documentation\n\n- [[performance|Performance Guide]] - Overall site optimization\n- [[configuration|Configuration Reference]] - All config options\n- [[plugin-development|Plugin Development]] - Extending markata-go\n\n## See Also\n\n- [Resource Hints Spec](https://www.w3.org/TR/resource-hints/)\n- [DNS Prefetch](https://developer.mozilla.org/en-US/docs/Web/Performance/dns-prefetch)\n- [Preconnect](https://developer.mozilla.org/en-US/docs/Web/Performance/Speculative_loading#preconnect)\n",
      "summary": "Automatically generate resource hints (dns-prefetch, preconnect, preload, prefetch) to improve page load performance",
      "date_published": "2025-01-25T00:00:00Z",
      "date_modified": "2025-01-25T00:00:00Z",
      "tags": [
        "documentation",
        "performance",
        "resource-hints",
        "optimization"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/resource-hints-quick-fix/",
      "url": "https://markata.dev/docs/guides/resource-hints-quick-fix/",
      "title": "Resource Hints Quick Fix",
      "content_html": "\u003ch2 id=\"quick-fix-excessive-dns-prefetch-links\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Fix: Excessive DNS-Prefetch Links\u003c/span\u003e \u003ca href=\"#quick-fix-excessive-dns-prefetch-links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch2 id=\"tl-dr\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTL;DR\u003c/span\u003e \u003ca href=\"#tl-dr\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eProblem\u003c/strong\u003e: Archive page has 400+ dns-prefetch links (most from blogroll/reader)\u003cbr\u003e\n\u003cstrong\u003eSolution\u003c/strong\u003e: Changed to page-specific hints\u003cbr\u003e\n\u003cstrong\u003eResult\u003c/strong\u003e: Archive now has ~5-10 relevant hints instead of 400+\u003c/p\u003e\n\u003ch2 id=\"what-changed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat Changed\u003c/span\u003e \u003ca href=\"#what-changed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e✅ Each page now gets hints only for external domains \u003cstrong\u003eon that specific page\u003c/strong\u003e\u003cbr\u003e\n✅ No more site-wide hint lists injected everywhere\u003cbr\u003e\n✅ Blogroll links no longer pollute other pages\u003c/p\u003e\n\u003ch2 id=\"do-you-need-to-change-anything\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDo You Need to Change Anything?\u003c/span\u003e \u003ca href=\"#do-you-need-to-change-anything\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eNo!\u003c/strong\u003e This works automatically. But you can optionally exclude domains:\u003c/p\u003e\n\u003ch3 id=\"optional-exclude-reader-domains\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOptional: Exclude Reader Domains\u003c/span\u003e \u003ca href=\"#optional-exclude-reader-domains\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd to your \u003ccode\u003emarkata.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude_domains\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;reader.waylonwalker.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis will prevent reader links from generating hints (useful if you don\u0026rsquo;t want any hints for blogroll domains).\u003c/p\u003e\n\u003ch2 id=\"will-this-slow-down-builds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWill This Slow Down Builds?\u003c/span\u003e \u003ca href=\"#will-this-slow-down-builds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eNo significant impact\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAdds ~100-200ms to build time (for 100-500 pages)\u003c/li\u003e\n\u003cli\u003eYou\u0026rsquo;ll barely notice it\u003c/li\u003e\n\u003cli\u003eMuch better user experience makes it worth it\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"what-if-i-want-the-old-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat If I Want the Old Behavior?\u003c/span\u003e \u003ca href=\"#what-if-i-want-the-old-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou can disable auto-detection and manually configure hints:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_detect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Manually add critical domains\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eresource_hints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edomains\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edomain\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cdn.jsdelivr.net\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehint_types\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;dns-prefetch\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext Steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eTest it\u003c/strong\u003e: Build your site and check an archive page\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOptionally\u003c/strong\u003e: Add \u003ccode\u003eexclude_domains\u003c/code\u003e if you want to filter reader links\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDone\u003c/strong\u003e: Enjoy cleaner HTML and better performance!\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"verification\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVerification\u003c/span\u003e \u003ca href=\"#verification\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCheck hint count on a page:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Count dns-prefetch hints on archive page\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egrep -c \u003cspan class=\"s1\"\u003e\u0026#39;rel=\u0026#34;dns-prefetch\u0026#34;\u0026#39;\u003c/span\u003e markout/archive/index.html\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# View actual hints\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egrep \u003cspan class=\"s1\"\u003e\u0026#39;dns-prefetch\u0026#39;\u003c/span\u003e markout/archive/index.html\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eExpected results\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eArchive: ~5-10 hints (was 400+)\u003c/li\u003e\n\u003cli\u003eBlog posts: ~4-8 hints (was 400+)\u003c/li\u003e\n\u003cli\u003eBlogroll: Still high, but legitimate (those links ARE on that page)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[[resource-hints|Resource Hints Guide]] - Full documentation\u003c/li\u003e\n\u003cli\u003e[[performance|Performance Guide]] - Overall optimization tips\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eexamples/resource_hints.toml\u003c/code\u003e - Configuration examples\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n## Quick Fix: Excessive DNS-Prefetch Links\n\n## TL;DR\n\n**Problem**: Archive page has 400+ dns-prefetch links (most from blogroll/reader)  \n**Solution**: Changed to page-specific hints  \n**Result**: Archive now has ~5-10 relevant hints instead of 400+  \n\n## What Changed\n\n✅ Each page now gets hints only for external domains **on that specific page**  \n✅ No more site-wide hint lists injected everywhere  \n✅ Blogroll links no longer pollute other pages  \n\n## Do You Need to Change Anything?\n\n**No!** This works automatically. But you can optionally exclude domains:\n\n### Optional: Exclude Reader Domains\n\nAdd to your `markata.toml`:\n\n```toml\n[resource_hints]\nexclude_domains = [\n    \"reader.waylonwalker.com\",\n]\n```\n\nThis will prevent reader links from generating hints (useful if you don't want any hints for blogroll domains).\n\n## Will This Slow Down Builds?\n\n**No significant impact**:\n- Adds ~100-200ms to build time (for 100-500 pages)\n- You'll barely notice it\n- Much better user experience makes it worth it\n\n## What If I Want the Old Behavior?\n\nYou can disable auto-detection and manually configure hints:\n\n```toml\n[resource_hints]\nauto_detect = false\n\n# Manually add critical domains\n[[resource_hints.domains]]\ndomain = \"cdn.jsdelivr.net\"\nhint_types = [\"dns-prefetch\"]\n```\n\n## Next Steps\n\n1. **Test it**: Build your site and check an archive page\n2. **Optionally**: Add `exclude_domains` if you want to filter reader links\n3. **Done**: Enjoy cleaner HTML and better performance!\n\n## Verification\n\nCheck hint count on a page:\n\n```bash\n# Count dns-prefetch hints on archive page\ngrep -c 'rel=\"dns-prefetch\"' markout/archive/index.html\n\n# View actual hints\ngrep 'dns-prefetch' markout/archive/index.html\n```\n\n**Expected results**:\n- Archive: ~5-10 hints (was 400+)\n- Blog posts: ~4-8 hints (was 400+)\n- Blogroll: Still high, but legitimate (those links ARE on that page)\n\n## See Also\n\n- [[resource-hints|Resource Hints Guide]] - Full documentation\n- [[performance|Performance Guide]] - Overall optimization tips\n- `examples/resource_hints.toml` - Configuration examples\n",
      "summary": "Quick reference for fixing excessive DNS-prefetch links on archive and blogroll pages",
      "date_published": "2025-01-25T00:00:00Z",
      "date_modified": "2025-01-25T00:00:00Z",
      "tags": [
        "documentation",
        "quick-reference",
        "resource-hints",
        "troubleshooting"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/embeds/",
      "url": "https://markata.dev/docs/guides/embeds/",
      "title": "Embeds",
      "content_html": "\u003cp\u003eThe embeds plugin lets you embed rich preview cards for both internal posts and external URLs in your markdown content.\u003c/p\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"internal-post-embeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInternal Post Embeds\u003c/span\u003e \u003ca href=\"#internal-post-embeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEmbed another post from your site using the \u003ccode\u003e\u0026lt;!-- embed not found: slug --\u0026gt; ![[slug]]\u003c/code\u003e syntax:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCheck out this related article:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![[getting-started]]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis creates a preview card showing the embedded post\u0026rsquo;s title, description, and date.\u003c/p\u003e\n\u003ch3 id=\"external-url-embeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExternal URL Embeds\u003c/span\u003e \u003ca href=\"#external-url-embeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEmbed external URLs using \u003ccode\u003e![embed](url)\u003c/code\u003e, \u003ccode\u003e[!embed](url)\u003c/code\u003e, or Obsidian-style `\u003cdiv class=\"embed-card embed-card-external\" data-markata-embed=\"true\"\u003e\n\u003ca href=\"https://url\" class=\"embed-card-link\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\n\u003cdiv class=\"embed-card-content\"\u003e\n\u003cdiv class=\"embed-card-title\"\u003eExternal Link\u003c/div\u003e\n\u003cdiv class=\"embed-card-meta\"\u003eurl\u003c/div\u003e\n\u003c/div\u003e\n\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n`:\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHere\u0026#39;s a great resource:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eembed\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://example.com/article\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eembed\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://example.com/article|card\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eembed\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://example.com/article|no_title center\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003e!embed\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://example.com/article\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003e!embed\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://example.com/article|hover\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![[https://example.com/article]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![[https://example.com/article|Custom Title]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![[https://example.com/article|Custom Title|center full_width]]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis resolves metadata via oEmbed (when available), then falls back to Open Graph, and displays a card with the title, description, and image.\u003c/p\u003e\n\u003cp\u003eIf the URL is a Hacker News discussion link, markata-go resolves the outbound article URL first so the card can use the real article metadata while still showing a \u0026ldquo;Found on HN\u0026rdquo; link to the original discussion.\u003c/p\u003e\n\u003cp\u003eSupported options (space-separated):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eno_title\u003c/code\u003e, \u003ccode\u003eno_description\u003c/code\u003e, \u003ccode\u003eno_meta\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eimage_only\u003c/code\u003e, \u003ccode\u003eperformance\u003c/code\u003e, \u003ccode\u003ehover\u003c/code\u003e, \u003ccode\u003ecard\u003c/code\u003e, \u003ccode\u003erich\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecenter\u003c/code\u003e, \u003ccode\u003efull_width\u003c/code\u003e, \u003ccode\u003elink\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"internal-embeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInternal Embeds\u003c/span\u003e \u003ca href=\"#internal-embeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"basic-syntax\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Syntax\u003c/span\u003e \u003ca href=\"#basic-syntax\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![[slug]]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe slug is the URL path of the post you want to embed. For example, if a post lives at \u003ccode\u003e/guides/configuration/\u003c/code\u003e, use:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![[guides/configuration]]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"custom-title\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Title\u003c/span\u003e \u003ca href=\"#custom-title\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOverride the display title with a pipe:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![[guides/configuration|Configuration Guide]]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"what-gets-displayed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat Gets Displayed\u003c/span\u003e \u003ca href=\"#what-gets-displayed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eInternal embed cards show:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTitle\u003c/strong\u003e - From the post or your custom title\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDescription\u003c/strong\u003e - First 200 characters\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDate\u003c/strong\u003e - If the post has a date\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"not-found-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNot Found Behavior\u003c/span\u003e \u003ca href=\"#not-found-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf the embedded post doesn\u0026rsquo;t exist, markata-go leaves the original syntax and adds an HTML comment:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- embed not found: nonexistent-post --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![[nonexistent-post]]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis helps you spot broken embeds without breaking your build.\u003c/p\u003e\n\u003ch2 id=\"external-embeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExternal Embeds\u003c/span\u003e \u003ca href=\"#external-embeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"syntax\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSyntax\u003c/span\u003e \u003ca href=\"#syntax\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eembed\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://example.com/article\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eembed\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://example.com/article|card\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eembed\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://example.com/article|no_description\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003e!embed\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://example.com/article|hover\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![[https://example.com/article]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![[https://example.com/article|Custom Title]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![[https://example.com/article|Custom Title|center full_width]]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eNote:\u003c/strong\u003e The alt text must be exactly \u003ccode\u003eembed\u003c/code\u003e. Regular images are not affected. The Obsidian-style form is only recognized for full URLs (\u003ccode\u003ehttp\u003c/code\u003e/\u003ccode\u003ehttps\u003c/code\u003e).\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"metadata-resolution\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMetadata Resolution\u003c/span\u003e \u003ca href=\"#metadata-resolution\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eExternal embeds fetch and display (in order based on strategy):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eoEmbed\u003c/strong\u003e - Title, provider name, thumbnail image (if available)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOpen Graph\u003c/strong\u003e - \u003ccode\u003eog:title\u003c/code\u003e, \u003ccode\u003eog:description\u003c/code\u003e, \u003ccode\u003eog:image\u003c/code\u003e, \u003ccode\u003eog:site_name\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"embed-modes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEmbed Modes\u003c/span\u003e \u003ca href=\"#embed-modes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEmbed modes control how external content is rendered:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecard\u003c/code\u003e (default): image + title + description + domain\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erich\u003c/code\u003e: full oEmbed HTML (iframes, scripts). YouTube defaults to Lite YouTube embeds.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eperformance\u003c/code\u003e: image only, no text\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehover\u003c/code\u003e: image preview, loads embed HTML on hover\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eimage_only\u003c/code\u003e: image-only rendering (useful for photo providers)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"github-gist-rendering\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGitHub Gist Rendering\u003c/span\u003e \u003ca href=\"#github-gist-rendering\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGist embeds render the first file as a code block styled by your configured\ncode theme. The filename appears above the code block with a link to the\noriginal gist.\u003c/p\u003e\n\u003ch3 id=\"caching\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCaching\u003c/span\u003e \u003ca href=\"#caching\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eMetadata is cached for 7 days by default (configurable) to avoid repeated HTTP requests. Cache files are stored in \u003ccode\u003e.cache/embeds/\u003c/code\u003e by default.\u003c/p\u003e\n\u003ch3 id=\"fallback-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFallback Behavior\u003c/span\u003e \u003ca href=\"#fallback-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf metadata can\u0026rsquo;t be fetched:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTitle shows \u0026ldquo;External Link\u0026rdquo; (configurable)\u003c/li\u003e\n\u003cli\u003eNo image is displayed\u003c/li\u003e\n\u003cli\u003eDomain name is shown\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd to your \u003ccode\u003emarkata-go.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eembeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# CSS classes for styling\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einternal_card_class\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;embed-card\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexternal_card_class\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;embed-card embed-card-external\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# External fetch settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efetch_external\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Set false to skip HTTP requests\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoembed_enabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Enable oEmbed resolution\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoembed_auto_discover\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e \u003cspan class=\"c\"\u003e# Use HTML auto-discovery when no provider matches\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault_mode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;card\u0026#34;\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Default embed mode\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoembed_providers_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://oembed.com/providers.json\u0026#34;\u003c/span\u003e \u003cspan class=\"c\"\u003e# Providers list URL (empty disables)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eresolution_strategy\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;oembed_first\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# oembed_first | og_first | oembed_only\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.cache/embeds\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Where to store cached metadata\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_ttl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e604800\u003c/span\u003e           \u003cspan class=\"c\"\u003e# Cache TTL in seconds (default 7 days)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etimeout\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# HTTP timeout in seconds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Display settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efallback_title\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;External Link\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Title when metadata is unavailable\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_image\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# Show images\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eembeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eproviders\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egiphy\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003emode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;image_only\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eyoutube\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003emode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;rich\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e# default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003evimeo\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etiktok\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eflickr\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003espotify\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esoundcloud\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecodepen\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecodesandbox\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejsfiddle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eobservable\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egithub\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslideshare\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eprezi\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003espeakerdeck\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eissuu\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edatawrapper\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eflourish\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einfogram\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereddit\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edailymotion\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewistia\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egiphy\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"disabling-external-fetching\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDisabling External Fetching\u003c/span\u003e \u003ca href=\"#disabling-external-fetching\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor faster builds or offline development:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eembeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efetch_external\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eExternal embeds will use the fallback title and show no image.\u003c/p\u003e\n\u003ch3 id=\"disabling-oembed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDisabling oEmbed\u003c/span\u003e \u003ca href=\"#disabling-oembed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eembeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoembed_enabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eresolution_strategy\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;og_first\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis skips oEmbed providers and falls back to Open Graph metadata only.\u003c/p\u003e\n\u003ch3 id=\"enabling-oembed-auto-discovery\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnabling oEmbed Auto-Discovery\u003c/span\u003e \u003ca href=\"#enabling-oembed-auto-discovery\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eembeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoembed_auto_discover\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen enabled, markata-go looks for oEmbed link tags in HTML pages and uses the discovered endpoint if no provider matches.\u003c/p\u003e\n\u003ch3 id=\"provider-mode-overrides\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProvider Mode Overrides\u003c/span\u003e \u003ca href=\"#provider-mode-overrides\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eYou can set a default mode for all embeds and override it per provider:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eembeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault_mode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;card\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eembeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eproviders\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eyoutube\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;rich\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eembeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eproviders\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egiphy\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;image_only\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"youtube-oembed-lite-youtube\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eYouTube oEmbed (Lite YouTube)\u003c/span\u003e \u003ca href=\"#youtube-oembed-lite-youtube\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eYouTube oEmbeds in rich mode render as Lite YouTube embeds by default for faster loads.\nLite YouTube assets are loaded only when needed and follow the vendor assets mode\n(\u003ccode\u003eassets.mode\u003c/code\u003e) for CDN vs self-hosted paths.\u003c/p\u003e\n\u003ch2 id=\"styling\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStyling\u003c/span\u003e \u003ca href=\"#styling\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEmbed cards use these CSS classes:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eClass\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.embed-card\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBase container\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.embed-card-external\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAdded for external embeds\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.embed-card-link\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe clickable anchor\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.embed-card-image\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eImage wrapper (external only)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.embed-card-rich\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRich HTML container\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.embed-card-hover\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHover-mode container\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.embed-card-hover-embed\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHover-mode embed HTML container\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.embed-card-content\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eText content area\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.embed-card-title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTitle\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.embed-card-description\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDescription\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.embed-card-meta\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDate or domain\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"custom-styling\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Styling\u003c/span\u003e \u003ca href=\"#custom-styling\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOverride the default styles in your custom CSS:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Make internal embeds more prominent */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eembed-card\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003enot\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eembed-card-external\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eborder-left-width\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eborder-left-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eaccent\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Larger images for external embeds */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eembed-card-image\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ewidth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e250\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"code-blocks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCode Blocks\u003c/span\u003e \u003ca href=\"#code-blocks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEmbed syntax inside code blocks is preserved:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eNormal embed:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![[my-post]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCode example (not processed):\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;!-- embed not found: my-post --\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![[my-post]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"blog-post-with-related-reading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBlog Post with Related Reading\u003c/span\u003e \u003ca href=\"#blog-post-with-related-reading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Advanced Configuration\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Advanced Configuration\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis guide builds on the basics. If you\u0026#39;re new, start here:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![[getting-started]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Deep Dive\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e...content...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Further Reading\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCheck out these external resources:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eembed\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://gohugo.io/getting-started/\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eembed\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://www.markdownguide.org/\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"documentation-with-cross-references\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocumentation with Cross-References\u003c/span\u003e \u003ca href=\"#documentation-with-cross-references\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# API Reference\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Authentication\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFor setup instructions, see:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![[guides/authentication|Authentication Guide]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Rate Limiting\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRelated:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![[api/errors]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![[guides/best-practices]]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"comparison-with-wikilinks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComparison with Wikilinks\u003c/span\u003e \u003ca href=\"#comparison-with-wikilinks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFeature\u003c/th\u003e\n\u003cth\u003eEmbeds (\u003ccode\u003e![[]]\u003c/code\u003e)\u003c/th\u003e\n\u003cth\u003eWikilinks (\u003ccode\u003e[[]]\u003c/code\u003e)\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eOutput\u003c/td\u003e\n\u003ctd\u003ePreview card\u003c/td\u003e\n\u003ctd\u003eInline link\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eShows description\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eShows date\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBest for\u003c/td\u003e\n\u003ctd\u003eRelated content, references\u003c/td\u003e\n\u003ctd\u003eIn-text mentions\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eUse embeds when you want readers to see a preview. Use wikilinks for inline mentions.\u003c/p\u003e\n\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"embed-not-rendering\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEmbed Not Rendering\u003c/span\u003e \u003ca href=\"#embed-not-rendering\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eCheck the slug matches the target post\u0026rsquo;s URL path\u003c/li\u003e\n\u003cli\u003eEnsure the target post is published\u003c/li\u003e\n\u003cli\u003eLook for \u003ccode\u003e\u0026lt;!-- embed not found --\u0026gt;\u003c/code\u003e comments in the HTML\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"external-embed-shows-fallback\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExternal Embed Shows Fallback\u003c/span\u003e \u003ca href=\"#external-embed-shows-fallback\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eCheck your internet connection\u003c/li\u003e\n\u003cli\u003eVerify the URL is accessible\u003c/li\u003e\n\u003cli\u003eSome sites block robots - the fallback is expected\u003c/li\u003e\n\u003cli\u003eIncrease timeout if the site is slow\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"images-not-showing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eImages Not Showing\u003c/span\u003e \u003ca href=\"#images-not-showing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eEnsure \u003ccode\u003eshow_image = true\u003c/code\u003e in config\u003c/li\u003e\n\u003cli\u003eThe page may not have an \u003ccode\u003eog:image\u003c/code\u003e tag\u003c/li\u003e\n\u003cli\u003eImage URL may be invalid or blocked\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"build-is-slow\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Is Slow\u003c/span\u003e \u003ca href=\"#build-is-slow\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eExternal fetching adds latency. Options:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eSet \u003ccode\u003efetch_external = false\u003c/code\u003e during development\u003c/li\u003e\n\u003cli\u003eReduce \u003ccode\u003etimeout\u003c/code\u003e value\u003c/li\u003e\n\u003cli\u003eLet the cache warm up (first build is slowest)\u003c/li\u003e\n\u003c/ol\u003e\n",
      "content_text": "\n\nThe embeds plugin lets you embed rich preview cards for both internal posts and external URLs in your markdown content.\n\n## Quick Start\n\n### Internal Post Embeds\n\nEmbed another post from your site using the `\u003c!-- embed not found: slug --\u003e\n![[slug]]` syntax:\n\n```markdown\nCheck out this related article:\n\n![[getting-started]]\n```\n\nThis creates a preview card showing the embedded post's title, description, and date.\n\n### External URL Embeds\n\nEmbed external URLs using `![embed](url)`, `[!embed](url)`, or Obsidian-style `\u003cdiv class=\"embed-card embed-card-external\" data-markata-embed=\"true\"\u003e\n  \u003ca href=\"https://url\" class=\"embed-card-link\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\n    \u003cdiv class=\"embed-card-content\"\u003e\n      \u003cdiv class=\"embed-card-title\"\u003eExternal Link\u003c/div\u003e\n      \u003cdiv class=\"embed-card-meta\"\u003eurl\u003c/div\u003e\n    \u003c/div\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n`:\n\n```markdown\nHere's a great resource:\n\n![embed](https://example.com/article)\n\n![embed](https://example.com/article|card)\n![embed](https://example.com/article|no_title center)\n\n[!embed](https://example.com/article)\n[!embed](https://example.com/article|hover)\n\n![[https://example.com/article]]\n![[https://example.com/article|Custom Title]]\n![[https://example.com/article|Custom Title|center full_width]]\n```\n\nThis resolves metadata via oEmbed (when available), then falls back to Open Graph, and displays a card with the title, description, and image.\n\nIf the URL is a Hacker News discussion link, markata-go resolves the outbound article URL first so the card can use the real article metadata while still showing a \"Found on HN\" link to the original discussion.\n\nSupported options (space-separated):\n\n- `no_title`, `no_description`, `no_meta`\n- `image_only`, `performance`, `hover`, `card`, `rich`\n- `center`, `full_width`, `link`\n\n## Internal Embeds\n\n### Basic Syntax\n\n```markdown\n![[slug]]\n```\n\nThe slug is the URL path of the post you want to embed. For example, if a post lives at `/guides/configuration/`, use:\n\n```markdown\n![[guides/configuration]]\n```\n\n### Custom Title\n\nOverride the display title with a pipe:\n\n```markdown\n![[guides/configuration|Configuration Guide]]\n```\n\n### What Gets Displayed\n\nInternal embed cards show:\n- **Title** - From the post or your custom title\n- **Description** - First 200 characters\n- **Date** - If the post has a date\n\n### Not Found Behavior\n\nIf the embedded post doesn't exist, markata-go leaves the original syntax and adds an HTML comment:\n\n```html\n\u003c!-- embed not found: nonexistent-post --\u003e\n![[nonexistent-post]]\n```\n\nThis helps you spot broken embeds without breaking your build.\n\n## External Embeds\n\n### Syntax\n\n```markdown\n![embed](https://example.com/article)\n![embed](https://example.com/article|card)\n![embed](https://example.com/article|no_description)\n[!embed](https://example.com/article|hover)\n![[https://example.com/article]]\n![[https://example.com/article|Custom Title]]\n![[https://example.com/article|Custom Title|center full_width]]\n```\n\n\u003e **Note:** The alt text must be exactly `embed`. Regular images are not affected. The Obsidian-style form is only recognized for full URLs (`http`/`https`).\n\n### Metadata Resolution\n\nExternal embeds fetch and display (in order based on strategy):\n- **oEmbed** - Title, provider name, thumbnail image (if available)\n- **Open Graph** - `og:title`, `og:description`, `og:image`, `og:site_name`\n\n### Embed Modes\n\nEmbed modes control how external content is rendered:\n\n- `card` (default): image + title + description + domain\n- `rich`: full oEmbed HTML (iframes, scripts). YouTube defaults to Lite YouTube embeds.\n- `performance`: image only, no text\n- `hover`: image preview, loads embed HTML on hover\n- `image_only`: image-only rendering (useful for photo providers)\n\n### GitHub Gist Rendering\n\nGist embeds render the first file as a code block styled by your configured\ncode theme. The filename appears above the code block with a link to the\noriginal gist.\n\n### Caching\n\nMetadata is cached for 7 days by default (configurable) to avoid repeated HTTP requests. Cache files are stored in `.cache/embeds/` by default.\n\n### Fallback Behavior\n\nIf metadata can't be fetched:\n- Title shows \"External Link\" (configurable)\n- No image is displayed\n- Domain name is shown\n\n## Configuration\n\nAdd to your `markata-go.toml`:\n\n```toml\n[embeds]\nenabled = true\n\n# CSS classes for styling\ninternal_card_class = \"embed-card\"\nexternal_card_class = \"embed-card embed-card-external\"\n\n# External fetch settings\nfetch_external = true        # Set false to skip HTTP requests\noembed_enabled = true        # Enable oEmbed resolution\noembed_auto_discover = false # Use HTML auto-discovery when no provider matches\ndefault_mode = \"card\"        # Default embed mode\noembed_providers_url = \"https://oembed.com/providers.json\" # Providers list URL (empty disables)\nresolution_strategy = \"oembed_first\"  # oembed_first | og_first | oembed_only\ncache_dir = \".cache/embeds\"  # Where to store cached metadata\ncache_ttl = 604800           # Cache TTL in seconds (default 7 days)\ntimeout = 10                 # HTTP timeout in seconds\n\n# Display settings\nfallback_title = \"External Link\"  # Title when metadata is unavailable\nshow_image = true                 # Show images\n\n[embeds.providers]\ngiphy = { enabled = true, mode = \"image_only\" }\nyoutube = { enabled = true, mode = \"rich\" } # default\nvimeo = { enabled = true }\ntiktok = { enabled = true }\nflickr = { enabled = true }\nspotify = { enabled = true }\nsoundcloud = { enabled = true }\ncodepen = { enabled = true }\ncodesandbox = { enabled = true }\njsfiddle = { enabled = true }\nobservable = { enabled = true }\ngithub = { enabled = true }\nslideshare = { enabled = true }\nprezi = { enabled = true }\nspeakerdeck = { enabled = true }\nissuu = { enabled = true }\ndatawrapper = { enabled = true }\nflourish = { enabled = true }\ninfogram = { enabled = true }\nreddit = { enabled = true }\ndailymotion = { enabled = true }\nwistia = { enabled = true }\ngiphy = { enabled = true }\n```\n\n### Disabling External Fetching\n\nFor faster builds or offline development:\n\n```toml\n[embeds]\nfetch_external = false\n```\n\nExternal embeds will use the fallback title and show no image.\n\n### Disabling oEmbed\n\n```toml\n[embeds]\noembed_enabled = false\nresolution_strategy = \"og_first\"\n```\n\nThis skips oEmbed providers and falls back to Open Graph metadata only.\n\n### Enabling oEmbed Auto-Discovery\n\n```toml\n[embeds]\noembed_auto_discover = true\n```\n\nWhen enabled, markata-go looks for oEmbed link tags in HTML pages and uses the discovered endpoint if no provider matches.\n\n### Provider Mode Overrides\n\nYou can set a default mode for all embeds and override it per provider:\n\n```toml\n[embeds]\ndefault_mode = \"card\"\n\n[embeds.providers.youtube]\nmode = \"rich\"\n\n[embeds.providers.giphy]\nmode = \"image_only\"\n```\n\n### YouTube oEmbed (Lite YouTube)\n\nYouTube oEmbeds in rich mode render as Lite YouTube embeds by default for faster loads.\nLite YouTube assets are loaded only when needed and follow the vendor assets mode\n(`assets.mode`) for CDN vs self-hosted paths.\n\n## Styling\n\nEmbed cards use these CSS classes:\n\n| Class | Description |\n|-------|-------------|\n| `.embed-card` | Base container |\n| `.embed-card-external` | Added for external embeds |\n| `.embed-card-link` | The clickable anchor |\n| `.embed-card-image` | Image wrapper (external only) |\n| `.embed-card-rich` | Rich HTML container |\n| `.embed-card-hover` | Hover-mode container |\n| `.embed-card-hover-embed` | Hover-mode embed HTML container |\n| `.embed-card-content` | Text content area |\n| `.embed-card-title` | Title |\n| `.embed-card-description` | Description |\n| `.embed-card-meta` | Date or domain |\n\n### Custom Styling\n\nOverride the default styles in your custom CSS:\n\n```css\n/* Make internal embeds more prominent */\n.embed-card:not(.embed-card-external) {\n  border-left-width: 6px;\n  border-left-color: var(--color-accent);\n}\n\n/* Larger images for external embeds */\n.embed-card-image {\n  width: 250px;\n}\n```\n\n## Code Blocks\n\nEmbed syntax inside code blocks is preserved:\n\n````markdown\nNormal embed:\n![[my-post]]\n\nCode example (not processed):\n```\n\u003c!-- embed not found: my-post --\u003e\n![[my-post]]\n```\n````\n\n## Examples\n\n### Blog Post with Related Reading\n\n```markdown\n---\ntitle: \"Advanced Configuration\"\n---\n\n# Advanced Configuration\n\nThis guide builds on the basics. If you're new, start here:\n\n![[getting-started]]\n\n## Deep Dive\n\n...content...\n\n## Further Reading\n\nCheck out these external resources:\n\n![embed](https://gohugo.io/getting-started/)\n\n![embed](https://www.markdownguide.org/)\n```\n\n### Documentation with Cross-References\n\n```markdown\n# API Reference\n\n## Authentication\n\nFor setup instructions, see:\n\n![[guides/authentication|Authentication Guide]]\n\n## Rate Limiting\n\nRelated:\n![[api/errors]]\n![[guides/best-practices]]\n```\n\n## Comparison with Wikilinks\n\n| Feature | Embeds (`![[]]`) | Wikilinks (`[[]]`) |\n|---------|------------------|-------------------|\n| Output | Preview card | Inline link |\n| Shows description | Yes | No |\n| Shows date | Yes | No |\n| Best for | Related content, references | In-text mentions |\n\nUse embeds when you want readers to see a preview. Use wikilinks for inline mentions.\n\n## Troubleshooting\n\n### Embed Not Rendering\n\n1. Check the slug matches the target post's URL path\n2. Ensure the target post is published\n3. Look for `\u003c!-- embed not found --\u003e` comments in the HTML\n\n### External Embed Shows Fallback\n\n1. Check your internet connection\n2. Verify the URL is accessible\n3. Some sites block robots - the fallback is expected\n4. Increase timeout if the site is slow\n\n### Images Not Showing\n\n1. Ensure `show_image = true` in config\n2. The page may not have an `og:image` tag\n3. Image URL may be invalid or blocked\n\n### Build Is Slow\n\nExternal fetching adds latency. Options:\n\n1. Set `fetch_external = false` during development\n2. Reduce `timeout` value\n3. Let the cache warm up (first build is slowest)\n",
      "summary": "Embed internal posts and external URLs as rich preview cards",
      "date_published": "2024-01-24T00:00:00Z",
      "date_modified": "2024-01-24T00:00:00Z",
      "tags": [
        "documentation",
        "plugins",
        "content"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/sidebars/",
      "url": "https://markata.dev/docs/guides/sidebars/",
      "title": "Sidebar Navigation",
      "content_html": "\u003cp\u003emarkata-go provides a powerful sidebar system that adapts to your site structure. You can have different sidebars for different sections, auto-generate navigation from feeds, or combine multiple feeds into a unified sidebar.\u003c/p\u003e\n\u003cp\u003eLarge sites reuse sidebar link projections within each build, avoiding repeated\nURL processing for the same post and feed. This requires no configuration:\ntitles, links, feed selection, and the current-page highlight remain page-correct,\nand the temporary cache is reset for the next template-render stage.\u003c/p\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe simplest way to add a sidebar is to define navigation items directly:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Navigation\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Home\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Documentation\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/docs/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/blog/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"sidebar-modes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSidebar Modes\u003c/span\u003e \u003ca href=\"#sidebar-modes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go supports three main sidebar modes:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eMode\u003c/th\u003e\n\u003cth\u003eUse Case\u003c/th\u003e\n\u003cth\u003eConfiguration\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eManual\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eHand-crafted navigation\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003esidebar.nav\u003c/code\u003e items\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003ePath-based\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eDifferent sidebars for different URL paths\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003esidebar.paths\u003c/code\u003e mapping\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eMulti-feed\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eCombined navigation from multiple feeds\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003esidebar.multi_feed = true\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"basic-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Configuration\u003c/span\u003e \u003ca href=\"#basic-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"sidebar-settings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSidebar Settings\u003c/span\u003e \u003ca href=\"#sidebar-settings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e           \u003cspan class=\"c\"\u003e# Show the sidebar (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;left\u0026#34;\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Position: \u0026#34;left\u0026#34; or \u0026#34;right\u0026#34; (default: \u0026#34;left\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewidth\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;280px\u0026#34;\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Sidebar width (default: \u0026#34;280px\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecollapsible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e       \u003cspan class=\"c\"\u003e# Allow collapsing on mobile (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault_open\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Start expanded (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Navigation\u0026#34;\u003c/span\u003e     \u003cspan class=\"c\"\u003e# Optional sidebar header\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"manual-navigation-items\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eManual Navigation Items\u003c/span\u003e \u003ca href=\"#manual-navigation-items\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDefine navigation items with nested structure:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Getting Started\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/getting-started/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Guides\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003echildren\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Configuration\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/guides/configuration/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Themes\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/guides/themes/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Templates\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/guides/templates/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;API Reference\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/reference/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003echildren\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;CLI\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/reference/cli/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Plugins\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/reference/plugins/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"navigation-item-properties\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNavigation Item Properties\u003c/span\u003e \u003ca href=\"#navigation-item-properties\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eProperty\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eDisplay text for the link\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehref\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eURL path (optional for parent items)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003echildren\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earray\u003c/td\u003e\n\u003ctd\u003eNested navigation items\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexternal\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eOpens in new tab if true\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eicon\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eOptional icon name\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"path-based-sidebars\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePath-Based Sidebars\u003c/span\u003e \u003ca href=\"#path-based-sidebars\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eShow different sidebars based on the current page\u0026rsquo;s URL path. This is ideal for sites with distinct sections like docs, blog, and tutorials.\u003c/p\u003e\n\u003ch3 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Sidebar for /docs/ pages\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/docs/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Documentation\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Introduction\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/docs/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Installation\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/docs/install/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Configuration\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/docs/config/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Sidebar for /blog/ pages\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/blog/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;All Posts\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/blog/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Archive\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/blog/archive/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Tags\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/blog/tags/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Sidebar for /tutorials/ pages\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/tutorials/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efeed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorials\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Auto-generate from feed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"path-matching\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePath Matching\u003c/span\u003e \u003ca href=\"#path-matching\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePaths are matched using \u003cstrong\u003elongest prefix wins\u003c/strong\u003e:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePage URL\u003c/th\u003e\n\u003cth\u003eMatching Path\u003c/th\u003e\n\u003cth\u003eSidebar\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/docs/install/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/docs/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDocumentation\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/docs/v2/getting-started/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/docs/v2/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDocs v2 (if defined)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/blog/my-post/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/blog/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBlog\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/about/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e(none)\u003c/td\u003e\n\u003ctd\u003eDefault sidebar\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"path-sidebar-options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePath Sidebar Options\u003c/span\u003e \u003ca href=\"#path-sidebar-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/docs/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Documentation\u0026#34;\u003c/span\u003e       \u003cspan class=\"c\"\u003e# Section title\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;left\u0026#34;\u003c/span\u003e            \u003cspan class=\"c\"\u003e# Override default position\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecollapsible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e           \u003cspan class=\"c\"\u003e# Override collapsible setting\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Option 1: Manual items\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[...]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Option 2: Link to a feed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efeed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Option 3: Auto-generate from directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_generate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003edirectory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eorder_by\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;nav_order\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"feed-linked-sidebars\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed-Linked Sidebars\u003c/span\u003e \u003ca href=\"#feed-linked-sidebars\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eLink a sidebar to a feed to automatically generate navigation from the feed\u0026rsquo;s posts.\u003c/p\u003e\n\u003ch3 id=\"enable-sidebar-on-a-feed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnable Sidebar on a Feed\u003c/span\u003e \u003ca href=\"#enable-sidebar-on-a-feed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;path.startswith(\u0026#39;docs/\u0026#39;)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Documentation\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Enable sidebar generation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar_title\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Docs\u0026#34;\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Override title in sidebar\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar_order\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e           \u003cspan class=\"c\"\u003e# Position in multi-feed sidebars\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar_group_by\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;category\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Group by frontmatter field\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"link-path-to-feed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLink Path to Feed\u003c/span\u003e \u003ca href=\"#link-path-to-feed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/docs/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efeed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Uses the \u0026#34;docs\u0026#34; feed for navigation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"grouping-by-frontmatter\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGrouping by Frontmatter\u003c/span\u003e \u003ca href=\"#grouping-by-frontmatter\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen \u003ccode\u003esidebar_group_by\u003c/code\u003e is set, posts are grouped by that frontmatter field:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;tutorial\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar_group_by\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;difficulty\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWith posts having frontmatter like:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Your First Site\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edifficulty\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Beginner\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe sidebar will show:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eTutorials\n├── Beginner\n│   ├── Your First Site\n│   └── Basic Configuration\n├── Intermediate\n│   ├── Custom Templates\n│   └── Plugin Development\n└── Advanced\n    └── Performance Optimization\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch2 id=\"auto-generated-sidebars\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuto-Generated Sidebars\u003c/span\u003e \u003ca href=\"#auto-generated-sidebars\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAutomatically generate sidebar navigation from your directory structure.\u003c/p\u003e\n\u003ch3 id=\"from-directory\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFrom Directory\u003c/span\u003e \u003ca href=\"#from-directory\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_generate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003edirectory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"full-auto-generate-options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFull Auto-Generate Options\u003c/span\u003e \u003ca href=\"#full-auto-generate-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauto_generate\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edirectory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e           \u003cspan class=\"c\"\u003e# Source directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eorder_by\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;nav_order\u0026#34;\u003c/span\u003e       \u003cspan class=\"c\"\u003e# Sort: \u0026#34;title\u0026#34;, \u0026#34;date\u0026#34;, \u0026#34;nav_order\u0026#34;, \u0026#34;filename\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Reverse sort order\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_depth\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e                \u003cspan class=\"c\"\u003e# Limit directory depth (0 = unlimited)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;drafts/*\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;_*\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"c\"\u003e# Glob patterns to exclude\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"ordering-with-nav_order\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOrdering with nav_order\u003c/span\u003e \u003ca href=\"#ordering-with-nav_order\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd \u003ccode\u003enav_order\u003c/code\u003e to your frontmatter to control sidebar order:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Getting Started\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003enav_order\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Configuration\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003enav_order\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eLower numbers appear first. Posts without \u003ccode\u003enav_order\u003c/code\u003e default to 999.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"multi-feed-sidebars\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMulti-Feed Sidebars\u003c/span\u003e \u003ca href=\"#multi-feed-sidebars\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCombine multiple feeds into a single sidebar with collapsible sections.\u003c/p\u003e\n\u003ch3 id=\"basic-multi-feed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Multi-Feed\u003c/span\u003e \u003ca href=\"#basic-multi-feed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emulti_feed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;guides\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;reference\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis creates a sidebar like:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e├── Documentation\n│   ├── Getting Started\n│   └── Installation\n├── Guides\n│   ├── Configuration\n│   └── Themes\n└── Reference\n    ├── CLI\n    └── Plugins\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"detailed-section-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDetailed Section Configuration\u003c/span\u003e \u003ca href=\"#detailed-section-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor more control, use \u003ccode\u003efeed_sections\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emulti_feed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_sections\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efeed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Documentation\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Override feed title\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecollapsed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Start expanded\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_items\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e             \u003cspan class=\"c\"\u003e# Limit items shown\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_sections\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efeed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;guides\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Guides\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecollapsed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e           \u003cspan class=\"c\"\u003e# Start collapsed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_sections\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efeed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;reference\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;API Reference\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecollapsed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_items\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"feed-sidebar-properties\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Sidebar Properties\u003c/span\u003e \u003ca href=\"#feed-sidebar-properties\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eProperty\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esidebar\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable this feed for sidebar\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esidebar_title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003efeed title\u003c/td\u003e\n\u003ctd\u003eDisplay title in sidebar\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esidebar_order\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e0\u003c/td\u003e\n\u003ctd\u003eSort order in multi-feed mode\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esidebar_group_by\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003eGroup posts by frontmatter field\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"template-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Integration\u003c/span\u003e \u003ca href=\"#template-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSidebar data is available in templates via the context:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if sidebar_items %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;sidebar\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if sidebar_title %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ sidebar_title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% for item in sidebar_items %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% if item.href %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ item.href }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e               \u003cspan class=\"err\"\u003e{%\u003c/span\u003e \u003cspan class=\"na\"\u003eif\u003c/span\u003e \u003cspan class=\"na\"\u003eitem\u003c/span\u003e\u003cspan class=\"err\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ehref \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e=\u003c/span\u003e \u003cspan class=\"na\"\u003epost\u003c/span\u003e\u003cspan class=\"err\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ehref\u003c/span\u003e \u003cspan class=\"err\"\u003e%}\u003c/span\u003e\u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;active\u0026#34;\u003c/span\u003e\u003cspan class=\"err\"\u003e{%\u003c/span\u003e \u003cspan class=\"na\"\u003eendif\u003c/span\u003e \u003cspan class=\"err\"\u003e%}\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                {{ item.title }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ item.title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% if item.children %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                {% for child in item.children %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ child.href }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                       \u003cspan class=\"err\"\u003e{%\u003c/span\u003e \u003cspan class=\"na\"\u003eif\u003c/span\u003e \u003cspan class=\"na\"\u003echild\u003c/span\u003e\u003cspan class=\"err\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ehref \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e=\u003c/span\u003e \u003cspan class=\"na\"\u003epost\u003c/span\u003e\u003cspan class=\"err\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ehref\u003c/span\u003e \u003cspan class=\"err\"\u003e%}\u003c/span\u003e\u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;active\u0026#34;\u003c/span\u003e\u003cspan class=\"err\"\u003e{%\u003c/span\u003e \u003cspan class=\"na\"\u003eendif\u003c/span\u003e \u003cspan class=\"err\"\u003e%}\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        {{ child.title }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"available-template-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAvailable Template Variables\u003c/span\u003e \u003ca href=\"#available-template-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esidebar_items\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earray\u003c/td\u003e\n\u003ctd\u003eNavigation items for current page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esidebar_title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSidebar title/header\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig.sidebar\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003eFull sidebar configuration\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"per-page-overrides\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePer-Page Overrides\u003c/span\u003e \u003ca href=\"#per-page-overrides\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOverride sidebar settings in page frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Page\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"c\"\u003e# Hide sidebar on this page\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Special Page\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003elayout\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elanding        \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Landing layout has no sidebar\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"documentation-site\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocumentation Site\u003c/span\u003e \u003ca href=\"#documentation-site\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/docs/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Documentation\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_generate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003edirectory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eorder_by\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;nav_order\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/api/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;API Reference\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_generate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003edirectory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;api\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eorder_by\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"blog-with-categories\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBlog with Categories\u003c/span\u003e \u003ca href=\"#blog-with-categories\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;path.startswith(\u0026#39;blog/\u0026#39;)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar_title\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Categories\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar_group_by\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;category\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/blog/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efeed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"multi-section-site\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMulti-Section Site\u003c/span\u003e \u003ca href=\"#multi-section-site\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emulti_feed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;path.startswith(\u0026#39;docs/\u0026#39;)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar_order\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;tutorial\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar_order\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;path.startswith(\u0026#39;blog/\u0026#39;)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar_order\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"versioned-documentation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVersioned Documentation\u003c/span\u003e \u003ca href=\"#versioned-documentation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/v1/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;v1 Documentation\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_generate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003edirectory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;v1\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/v2/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;v2 Documentation\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_generate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003edirectory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;v2\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"best-practices\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBest Practices\u003c/span\u003e \u003ca href=\"#best-practices\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUse path-based sidebars\u003c/strong\u003e for sites with distinct sections (docs, blog, guides)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUse feed-linked sidebars\u003c/strong\u003e when you want navigation to automatically update as you add content\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUse multi-feed sidebars\u003c/strong\u003e for comprehensive navigation across your entire site\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eAdd nav_order\u003c/strong\u003e to frontmatter for predictable ordering instead of relying on alphabetical sort\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eKeep sidebars focused\u003c/strong\u003e - don\u0026rsquo;t try to show everything; use the header nav for top-level navigation\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eTest mobile behavior\u003c/strong\u003e - ensure sidebars collapse properly on small screens\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"sidebar-not-showing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSidebar not showing\u003c/span\u003e \u003ca href=\"#sidebar-not-showing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eCheck that \u003ccode\u003esidebar.enabled = true\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eVerify your layout supports sidebars (\u003ccode\u003edocs\u003c/code\u003e layout, not \u003ccode\u003elanding\u003c/code\u003e or \u003ccode\u003ebare\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eCheck frontmatter doesn\u0026rsquo;t have \u003ccode\u003esidebar: false\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"wrong-sidebar-showing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWrong sidebar showing\u003c/span\u003e \u003ca href=\"#wrong-sidebar-showing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eCheck path matching - longer prefixes take priority\u003c/li\u003e\n\u003cli\u003eVerify feed slugs match in both feed definition and sidebar config\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"items-not-appearing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eItems not appearing\u003c/span\u003e \u003ca href=\"#items-not-appearing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eCheck feed filter is matching expected posts\u003c/li\u003e\n\u003cli\u003eVerify posts have \u003ccode\u003epublished: true\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eCheck exclude patterns aren\u0026rsquo;t filtering desired content\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"incorrect-order\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIncorrect order\u003c/span\u003e \u003ca href=\"#incorrect-order\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eAdd \u003ccode\u003enav_order\u003c/code\u003e frontmatter to control explicit ordering\u003c/li\u003e\n\u003cli\u003eCheck \u003ccode\u003eorder_by\u003c/code\u003e setting matches your intent\u003c/li\u003e\n\u003cli\u003eVerify \u003ccode\u003ereverse\u003c/code\u003e is set correctly\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"related\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRelated\u003c/span\u003e \u003ca href=\"#related\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[[configuration|Configuration Guide]] - Full configuration reference\u003c/li\u003e\n\u003cli\u003e[[feeds|Feeds Guide]] - Creating and configuring feeds\u003c/li\u003e\n\u003cli\u003e[[templates|Templates Guide]] - Customizing sidebar templates\u003c/li\u003e\n\u003cli\u003e[[themes|Themes Guide]] - Styling your sidebar\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nmarkata-go provides a powerful sidebar system that adapts to your site structure. You can have different sidebars for different sections, auto-generate navigation from feeds, or combine multiple feeds into a unified sidebar.\n\nLarge sites reuse sidebar link projections within each build, avoiding repeated\nURL processing for the same post and feed. This requires no configuration:\ntitles, links, feed selection, and the current-page highlight remain page-correct,\nand the temporary cache is reset for the next template-render stage.\n\n## Quick Start\n\nThe simplest way to add a sidebar is to define navigation items directly:\n\n```toml\n[markata-go.sidebar]\nenabled = true\ntitle = \"Navigation\"\n\n[[markata-go.sidebar.nav]]\ntitle = \"Home\"\nhref = \"/\"\n\n[[markata-go.sidebar.nav]]\ntitle = \"Documentation\"\nhref = \"/docs/\"\n\n[[markata-go.sidebar.nav]]\ntitle = \"Blog\"\nhref = \"/blog/\"\n```\n\n---\n\n## Sidebar Modes\n\nmarkata-go supports three main sidebar modes:\n\n| Mode | Use Case | Configuration |\n|------|----------|---------------|\n| **Manual** | Hand-crafted navigation | `sidebar.nav` items |\n| **Path-based** | Different sidebars for different URL paths | `sidebar.paths` mapping |\n| **Multi-feed** | Combined navigation from multiple feeds | `sidebar.multi_feed = true` |\n\n---\n\n## Basic Configuration\n\n### Sidebar Settings\n\n```toml\n[markata-go.sidebar]\nenabled = true           # Show the sidebar (default: true)\nposition = \"left\"        # Position: \"left\" or \"right\" (default: \"left\")\nwidth = \"280px\"          # Sidebar width (default: \"280px\")\ncollapsible = true       # Allow collapsing on mobile (default: true)\ndefault_open = true      # Start expanded (default: true)\ntitle = \"Navigation\"     # Optional sidebar header\n```\n\n### Manual Navigation Items\n\nDefine navigation items with nested structure:\n\n```toml\n[[markata-go.sidebar.nav]]\ntitle = \"Getting Started\"\nhref = \"/getting-started/\"\n\n[[markata-go.sidebar.nav]]\ntitle = \"Guides\"\nchildren = [\n    { title = \"Configuration\", href = \"/guides/configuration/\" },\n    { title = \"Themes\", href = \"/guides/themes/\" },\n    { title = \"Templates\", href = \"/guides/templates/\" },\n]\n\n[[markata-go.sidebar.nav]]\ntitle = \"API Reference\"\nhref = \"/reference/\"\nchildren = [\n    { title = \"CLI\", href = \"/reference/cli/\" },\n    { title = \"Plugins\", href = \"/reference/plugins/\" },\n]\n```\n\n### Navigation Item Properties\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `title` | string | Display text for the link |\n| `href` | string | URL path (optional for parent items) |\n| `children` | array | Nested navigation items |\n| `external` | bool | Opens in new tab if true |\n| `icon` | string | Optional icon name |\n\n---\n\n## Path-Based Sidebars\n\nShow different sidebars based on the current page's URL path. This is ideal for sites with distinct sections like docs, blog, and tutorials.\n\n### Configuration\n\n```toml\n[markata-go.sidebar]\nenabled = true\n\n# Sidebar for /docs/ pages\n[markata-go.sidebar.paths.\"/docs/\"]\ntitle = \"Documentation\"\nitems = [\n    { title = \"Introduction\", href = \"/docs/\" },\n    { title = \"Installation\", href = \"/docs/install/\" },\n    { title = \"Configuration\", href = \"/docs/config/\" },\n]\n\n# Sidebar for /blog/ pages\n[markata-go.sidebar.paths.\"/blog/\"]\ntitle = \"Blog\"\nitems = [\n    { title = \"All Posts\", href = \"/blog/\" },\n    { title = \"Archive\", href = \"/blog/archive/\" },\n    { title = \"Tags\", href = \"/blog/tags/\" },\n]\n\n# Sidebar for /tutorials/ pages\n[markata-go.sidebar.paths.\"/tutorials/\"]\ntitle = \"Tutorials\"\nfeed = \"tutorials\"  # Auto-generate from feed\n```\n\n### Path Matching\n\nPaths are matched using **longest prefix wins**:\n\n| Page URL | Matching Path | Sidebar |\n|----------|---------------|---------|\n| `/docs/install/` | `/docs/` | Documentation |\n| `/docs/v2/getting-started/` | `/docs/v2/` | Docs v2 (if defined) |\n| `/blog/my-post/` | `/blog/` | Blog |\n| `/about/` | (none) | Default sidebar |\n\n### Path Sidebar Options\n\n```toml\n[markata-go.sidebar.paths.\"/docs/\"]\ntitle = \"Documentation\"       # Section title\nposition = \"left\"            # Override default position\ncollapsible = true           # Override collapsible setting\n\n# Option 1: Manual items\nitems = [...]\n\n# Option 2: Link to a feed\nfeed = \"docs\"\n\n# Option 3: Auto-generate from directory\nauto_generate = { directory = \"docs\", order_by = \"nav_order\" }\n```\n\n---\n\n## Feed-Linked Sidebars\n\nLink a sidebar to a feed to automatically generate navigation from the feed's posts.\n\n### Enable Sidebar on a Feed\n\n```toml\n[[markata-go.feeds]]\nslug = \"docs\"\nfilter = \"path.startswith('docs/')\"\ntitle = \"Documentation\"\nsidebar = true              # Enable sidebar generation\nsidebar_title = \"Docs\"      # Override title in sidebar\nsidebar_order = 1           # Position in multi-feed sidebars\nsidebar_group_by = \"category\"  # Group by frontmatter field\n```\n\n### Link Path to Feed\n\n```toml\n[markata-go.sidebar.paths.\"/docs/\"]\nfeed = \"docs\"  # Uses the \"docs\" feed for navigation\n```\n\n### Grouping by Frontmatter\n\nWhen `sidebar_group_by` is set, posts are grouped by that frontmatter field:\n\n```toml\n[[markata-go.feeds]]\nslug = \"tutorials\"\nfilter = \"'tutorial' in tags\"\nsidebar = true\nsidebar_group_by = \"difficulty\"\n```\n\nWith posts having frontmatter like:\n\n```yaml\n---\ntitle: \"Your First Site\"\ndifficulty: \"Beginner\"\n---\n```\n\nThe sidebar will show:\n\n```\nTutorials\n├── Beginner\n│   ├── Your First Site\n│   └── Basic Configuration\n├── Intermediate\n│   ├── Custom Templates\n│   └── Plugin Development\n└── Advanced\n    └── Performance Optimization\n```\n\n---\n\n## Auto-Generated Sidebars\n\nAutomatically generate sidebar navigation from your directory structure.\n\n### From Directory\n\n```toml\n[markata-go.sidebar]\nauto_generate = { directory = \"docs\" }\n```\n\n### Full Auto-Generate Options\n\n```toml\n[markata-go.sidebar.auto_generate]\ndirectory = \"docs\"           # Source directory\norder_by = \"nav_order\"       # Sort: \"title\", \"date\", \"nav_order\", \"filename\"\nreverse = false              # Reverse sort order\nmax_depth = 3                # Limit directory depth (0 = unlimited)\nexclude = [\"drafts/*\", \"_*\"] # Glob patterns to exclude\n```\n\n### Ordering with nav_order\n\nAdd `nav_order` to your frontmatter to control sidebar order:\n\n```yaml\n---\ntitle: \"Getting Started\"\nnav_order: 1\n---\n```\n\n```yaml\n---\ntitle: \"Configuration\"\nnav_order: 2\n---\n```\n\nLower numbers appear first. Posts without `nav_order` default to 999.\n\n---\n\n## Multi-Feed Sidebars\n\nCombine multiple feeds into a single sidebar with collapsible sections.\n\n### Basic Multi-Feed\n\n```toml\n[markata-go.sidebar]\nmulti_feed = true\nfeeds = [\"docs\", \"guides\", \"reference\"]\n```\n\nThis creates a sidebar like:\n\n```\n├── Documentation\n│   ├── Getting Started\n│   └── Installation\n├── Guides\n│   ├── Configuration\n│   └── Themes\n└── Reference\n    ├── CLI\n    └── Plugins\n```\n\n### Detailed Section Configuration\n\nFor more control, use `feed_sections`:\n\n```toml\n[markata-go.sidebar]\nmulti_feed = true\n\n[[markata-go.sidebar.feed_sections]]\nfeed = \"docs\"\ntitle = \"Documentation\"    # Override feed title\ncollapsed = false          # Start expanded\nmax_items = 10             # Limit items shown\n\n[[markata-go.sidebar.feed_sections]]\nfeed = \"guides\"\ntitle = \"Guides\"\ncollapsed = true           # Start collapsed\n\n[[markata-go.sidebar.feed_sections]]\nfeed = \"reference\"\ntitle = \"API Reference\"\ncollapsed = true\nmax_items = 5\n```\n\n### Feed Sidebar Properties\n\n| Property | Type | Default | Description |\n|----------|------|---------|-------------|\n| `sidebar` | bool | `false` | Enable this feed for sidebar |\n| `sidebar_title` | string | feed title | Display title in sidebar |\n| `sidebar_order` | int | 0 | Sort order in multi-feed mode |\n| `sidebar_group_by` | string | - | Group posts by frontmatter field |\n\n---\n\n## Template Integration\n\nSidebar data is available in templates via the context:\n\n```html\n{% if sidebar_items %}\n\u003cnav class=\"sidebar\"\u003e\n    {% if sidebar_title %}\n    \u003ch2\u003e{{ sidebar_title }}\u003c/h2\u003e\n    {% endif %}\n\n    \u003cul\u003e\n    {% for item in sidebar_items %}\n        \u003cli\u003e\n            {% if item.href %}\n            \u003ca href=\"{{ item.href }}\"\n               {% if item.href == post.href %}class=\"active\"{% endif %}\u003e\n                {{ item.title }}\n            \u003c/a\u003e\n            {% else %}\n            \u003cspan\u003e{{ item.title }}\u003c/span\u003e\n            {% endif %}\n\n            {% if item.children %}\n            \u003cul\u003e\n                {% for child in item.children %}\n                \u003cli\u003e\n                    \u003ca href=\"{{ child.href }}\"\n                       {% if child.href == post.href %}class=\"active\"{% endif %}\u003e\n                        {{ child.title }}\n                    \u003c/a\u003e\n                \u003c/li\u003e\n                {% endfor %}\n            \u003c/ul\u003e\n            {% endif %}\n        \u003c/li\u003e\n    {% endfor %}\n    \u003c/ul\u003e\n\u003c/nav\u003e\n{% endif %}\n```\n\n### Available Template Variables\n\n| Variable | Type | Description |\n|----------|------|-------------|\n| `sidebar_items` | array | Navigation items for current page |\n| `sidebar_title` | string | Sidebar title/header |\n| `config.sidebar` | object | Full sidebar configuration |\n\n---\n\n## Per-Page Overrides\n\nOverride sidebar settings in page frontmatter:\n\n```yaml\n---\ntitle: \"My Page\"\nsidebar: false          # Hide sidebar on this page\n---\n```\n\n```yaml\n---\ntitle: \"Special Page\"\nlayout: landing         # Landing layout has no sidebar\n---\n```\n\n---\n\n## Examples\n\n### Documentation Site\n\n```toml\n[markata-go.sidebar]\nenabled = true\n\n[markata-go.sidebar.paths.\"/docs/\"]\ntitle = \"Documentation\"\nauto_generate = { directory = \"docs\", order_by = \"nav_order\" }\n\n[markata-go.sidebar.paths.\"/api/\"]\ntitle = \"API Reference\"\nauto_generate = { directory = \"api\", order_by = \"title\" }\n```\n\n### Blog with Categories\n\n```toml\n[[markata-go.feeds]]\nslug = \"posts\"\nfilter = \"path.startswith('blog/')\"\nsidebar = true\nsidebar_title = \"Categories\"\nsidebar_group_by = \"category\"\n\n[markata-go.sidebar.paths.\"/blog/\"]\nfeed = \"posts\"\n```\n\n### Multi-Section Site\n\n```toml\n[markata-go.sidebar]\nmulti_feed = true\n\n[[markata-go.feeds]]\nslug = \"docs\"\nfilter = \"path.startswith('docs/')\"\nsidebar = true\nsidebar_order = 1\n\n[[markata-go.feeds]]\nslug = \"tutorials\"\nfilter = \"'tutorial' in tags\"\nsidebar = true\nsidebar_order = 2\n\n[[markata-go.feeds]]\nslug = \"blog\"\nfilter = \"path.startswith('blog/')\"\nsidebar = true\nsidebar_order = 3\n```\n\n### Versioned Documentation\n\n```toml\n[markata-go.sidebar.paths.\"/v1/\"]\ntitle = \"v1 Documentation\"\nauto_generate = { directory = \"v1\" }\n\n[markata-go.sidebar.paths.\"/v2/\"]\ntitle = \"v2 Documentation\"\nauto_generate = { directory = \"v2\" }\n```\n\n---\n\n## Best Practices\n\n1. **Use path-based sidebars** for sites with distinct sections (docs, blog, guides)\n\n2. **Use feed-linked sidebars** when you want navigation to automatically update as you add content\n\n3. **Use multi-feed sidebars** for comprehensive navigation across your entire site\n\n4. **Add nav_order** to frontmatter for predictable ordering instead of relying on alphabetical sort\n\n5. **Keep sidebars focused** - don't try to show everything; use the header nav for top-level navigation\n\n6. **Test mobile behavior** - ensure sidebars collapse properly on small screens\n\n---\n\n## Troubleshooting\n\n### Sidebar not showing\n\n1. Check that `sidebar.enabled = true`\n2. Verify your layout supports sidebars (`docs` layout, not `landing` or `bare`)\n3. Check frontmatter doesn't have `sidebar: false`\n\n### Wrong sidebar showing\n\n1. Check path matching - longer prefixes take priority\n2. Verify feed slugs match in both feed definition and sidebar config\n\n### Items not appearing\n\n1. Check feed filter is matching expected posts\n2. Verify posts have `published: true`\n3. Check exclude patterns aren't filtering desired content\n\n### Incorrect order\n\n1. Add `nav_order` frontmatter to control explicit ordering\n2. Check `order_by` setting matches your intent\n3. Verify `reverse` is set correctly\n\n---\n\n## Related\n\n- [[configuration|Configuration Guide]] - Full configuration reference\n- [[feeds|Feeds Guide]] - Creating and configuring feeds\n- [[templates|Templates Guide]] - Customizing sidebar templates\n- [[themes|Themes Guide]] - Styling your sidebar\n",
      "summary": "Complete guide to configuring sidebar navigation with path-based, feed-linked, and multi-feed sidebars",
      "date_published": "2024-01-23T00:00:00Z",
      "date_modified": "2024-01-23T00:00:00Z",
      "tags": [
        "documentation",
        "layout",
        "navigation",
        "sidebar"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/self-hosting/",
      "url": "https://markata.dev/docs/guides/self-hosting/",
      "title": "Self-Hosting Guide",
      "content_html": "\u003cp\u003eThis guide covers deploying markata-go sites on your own infrastructure. Whether you prefer Docker containers, systemd services, or manual setups, you\u0026rsquo;ll find everything you need to self-host your static site.\u003c/p\u003e\n\u003ch2 id=\"overview\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOverview\u003c/span\u003e \u003ca href=\"#overview\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSelf-hosting gives you complete control over your site\u0026rsquo;s infrastructure. markata-go supports several deployment methods:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eMethod\u003c/th\u003e\n\u003cth\u003eBest For\u003c/th\u003e\n\u003cth\u003eComplexity\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eDocker Compose\u003c/td\u003e\n\u003ctd\u003eQuick setup, portability\u003c/td\u003e\n\u003ctd\u003eLow\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003esystemd\u003c/td\u003e\n\u003ctd\u003eLinux servers, integration\u003c/td\u003e\n\u003ctd\u003eMedium\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eCustom setups, learning\u003c/td\u003e\n\u003ctd\u003eHigh\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003ePrerequisites:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eA Linux server (VPS, dedicated, or home server)\u003c/li\u003e\n\u003cli\u003eDomain name pointed to your server\u003c/li\u003e\n\u003cli\u003eBasic command line knowledge\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"quick-start-with-docker\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start with Docker\u003c/span\u003e \u003ca href=\"#quick-start-with-docker\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe fastest way to self-host is using Docker Compose:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Clone your site or create a new one\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clone https://github.com/you/your-site.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e your-site\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Copy the deployment files\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecp -r deploy/docker ./docker-deploy\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e docker-deploy\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Configure environment\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecp .env.example .env\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Edit .env with your domain: SITE_DOMAIN=example.com\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Start production stack\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker compose -f docker-compose.prod.yml up -d\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYour site will be available at \u003ccode\u003ehttps://your-domain.com\u003c/code\u003e with automatic HTTPS.\u003c/p\u003e\n\u003cp\u003eSee \u003ca href=\"https://github.com/WaylonWalker/markata-go/tree/main/deploy/docker\"\u003eDocker Deployment README\u003c/a\u003e for detailed configuration options.\u003c/p\u003e\n\u003ch2 id=\"docker-compose-configurations\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocker Compose Configurations\u003c/span\u003e \u003ca href=\"#docker-compose-configurations\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"development-mode\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDevelopment Mode\u003c/span\u003e \u003ca href=\"#development-mode\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor local development with hot reload:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e deploy/docker\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker compose -f docker-compose.dev.yml up\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFeatures:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHot reload on file changes\u003c/li\u003e\n\u003cli\u003eLocal preview at http://localhost:8000\u003c/li\u003e\n\u003cli\u003eGo module caching\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"production-mode\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProduction Mode\u003c/span\u003e \u003ca href=\"#production-mode\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor production with Caddy reverse proxy:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e deploy/docker\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Configure\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecp .env.example .env\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evim .env  \u003cspan class=\"c1\"\u003e# Set SITE_DOMAIN and SITE_URL\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Deploy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker compose -f docker-compose.prod.yml up -d\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFeatures:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAutomatic HTTPS via Let\u0026rsquo;s Encrypt\u003c/li\u003e\n\u003cli\u003eHTTP/2 and HTTP/3 support\u003c/li\u003e\n\u003cli\u003eSecurity headers\u003c/li\u003e\n\u003cli\u003eGzip/Zstd compression\u003c/li\u003e\n\u003cli\u003eOptimized caching\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"environment-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment Variables\u003c/span\u003e \u003ca href=\"#environment-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eSITE_DOMAIN\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eYour domain name\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eexample.com\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eSITE_URL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFull URL for feeds/links\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehttps://example.com\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eSITE_DIR\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePath to site content\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./../..\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ePORT\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDevelopment port\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e8000\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"systemd-services\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003esystemd Services\u003c/span\u003e \u003ca href=\"#systemd-services\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor traditional Linux server deployments, use systemd services.\u003c/p\u003e\n\u003ch3 id=\"quick-setup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Setup\u003c/span\u003e \u003ca href=\"#quick-setup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e deploy/systemd\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo ./install.sh\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe installer prompts for:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSite directory (default: \u003ccode\u003e/var/www/mysite\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eSite URL (default: \u003ccode\u003ehttps://example.com\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eService user (default: \u003ccode\u003emarkata\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"manual-setup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eManual Setup\u003c/span\u003e \u003ca href=\"#manual-setup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create service user\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo useradd -r -s /bin/false -d /var/www/mysite markata\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create directories\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo mkdir -p /var/www/mysite/\u003cspan class=\"o\"\u003e{\u003c/span\u003epublic,.go\u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo chown -R markata:markata /var/www/mysite\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Install markata-go\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo -u markata bash -c \u003cspan class=\"s1\"\u003e\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    export GOPATH=/var/www/mysite/.go\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Install services\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo cp deploy/systemd/markata-go.service /etc/systemd/system/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo cp deploy/systemd/markata-go-watch.service /etc/systemd/system/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Edit paths in service files\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl daemon-reload\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"available-services\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAvailable Services\u003c/span\u003e \u003ca href=\"#available-services\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003emarkata-go.service\u003c/strong\u003e - One-time build:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl \u003cspan class=\"nb\"\u003eenable\u003c/span\u003e markata-go\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl start markata-go\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Rebuild site\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl restart markata-go\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003emarkata-go-watch.service\u003c/strong\u003e - Auto-rebuild on changes:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl \u003cspan class=\"nb\"\u003eenable\u003c/span\u003e markata-go-watch\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl start markata-go-watch\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# View logs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo journalctl -u markata-go-watch -f\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSee \u003ca href=\"https://github.com/WaylonWalker/markata-go/tree/main/deploy/systemd\"\u003esystemd Deployment README\u003c/a\u003e for detailed setup and troubleshooting.\u003c/p\u003e\n\u003ch2 id=\"web-server-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWeb Server Configuration\u003c/span\u003e \u003ca href=\"#web-server-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"using-nginx\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing nginx\u003c/span\u003e \u003ca href=\"#using-nginx\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf using systemd with nginx:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eserver\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elisten\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elisten\u003c/span\u003e \u003cspan class=\"s\"\u003e[::]:80\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eserver_name\u003c/span\u003e \u003cspan class=\"s\"\u003eexample.com\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003ereturn\u003c/span\u003e \u003cspan class=\"mi\"\u003e301\u003c/span\u003e \u003cspan class=\"s\"\u003ehttps://\u003c/span\u003e\u003cspan class=\"nv\"\u003e$server_name$request_uri\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eserver\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elisten\u003c/span\u003e \u003cspan class=\"mi\"\u003e443\u003c/span\u003e \u003cspan class=\"s\"\u003essl\u003c/span\u003e \u003cspan class=\"s\"\u003ehttp2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elisten\u003c/span\u003e \u003cspan class=\"s\"\u003e[::]:443\u003c/span\u003e \u003cspan class=\"s\"\u003essl\u003c/span\u003e \u003cspan class=\"s\"\u003ehttp2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eserver_name\u003c/span\u003e \u003cspan class=\"s\"\u003eexample.com\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003essl_certificate\u003c/span\u003e \u003cspan class=\"s\"\u003e/etc/letsencrypt/live/example.com/fullchain.pem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003essl_certificate_key\u003c/span\u003e \u003cspan class=\"s\"\u003e/etc/letsencrypt/live/example.com/privkey.pem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eroot\u003c/span\u003e \u003cspan class=\"s\"\u003e/var/www/mysite/public\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eindex\u003c/span\u003e \u003cspan class=\"s\"\u003eindex.html\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Security headers\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eadd_header\u003c/span\u003e \u003cspan class=\"s\"\u003eX-Frame-Options\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;DENY\u0026#34;\u003c/span\u003e \u003cspan class=\"s\"\u003ealways\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eadd_header\u003c/span\u003e \u003cspan class=\"s\"\u003eX-Content-Type-Options\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;nosniff\u0026#34;\u003c/span\u003e \u003cspan class=\"s\"\u003ealways\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# MIME types for txt/md files\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"p\"\u003e~\u003c/span\u003e \u003cspan class=\"sr\"\u003e\\.(txt|md)$\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003edefault_type\u003c/span\u003e \u003cspan class=\"s\"\u003etext/plain\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003echarset\u003c/span\u003e \u003cspan class=\"s\"\u003eutf-8\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Caching\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"s\"\u003e/static/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eexpires\u003c/span\u003e \u003cspan class=\"s\"\u003e1y\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eadd_header\u003c/span\u003e \u003cspan class=\"s\"\u003eCache-Control\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;public,\u003c/span\u003e \u003cspan class=\"s\"\u003eimmutable\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Try exact file first, then index.html, then directory\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# This supports reversed redirects where /robots.txt is canonical\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"s\"\u003e/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003etry_files\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri/index.html\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri/\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e404\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eTesting nginx configuration:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Test configuration syntax\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo nginx -t\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Reload configuration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl reload nginx\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Verify txt files are served correctly\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -I https://example.com/robots.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Should return: Content-Type: text/plain; charset=utf-8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"using-caddy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing Caddy\u003c/span\u003e \u003ca href=\"#using-caddy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSimpler alternative with automatic HTTPS:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003eexample.com\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eroot\u003c/span\u003e \u003cspan class=\"nd\"\u003e*\u003c/span\u003e \u003cspan class=\"s\"\u003e/var/www/mysite/public\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efile_server\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eencode\u003c/span\u003e \u003cspan class=\"s\"\u003egzip\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eheader\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eX-Frame-Options\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;DENY\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eX-Content-Type-Options\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;nosniff\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e    # MIME types for txt/md files\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@txtmd\u003c/span\u003e \u003cspan class=\"k\"\u003epath\u003c/span\u003e \u003cspan class=\"s\"\u003e*.txt\u003c/span\u003e \u003cspan class=\"s\"\u003e*.md\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eheader\u003c/span\u003e \u003cspan class=\"nd\"\u003e@txtmd\u003c/span\u003e \u003cspan class=\"s\"\u003eContent-Type\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;text/plain; charset=utf-8\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@static\u003c/span\u003e \u003cspan class=\"k\"\u003epath\u003c/span\u003e \u003cspan class=\"s\"\u003e/static/*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eheader\u003c/span\u003e \u003cspan class=\"nd\"\u003e@static\u003c/span\u003e \u003cspan class=\"s\"\u003eCache-Control\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public, max-age=31536000, immutable\u0026#34;\u003c/span\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e    # Try exact file first (for /robots.txt), then index.html, then directory\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003etry_files\u003c/span\u003e \u003cspan class=\"se\"\u003e{path}\u003c/span\u003e \u003cspan class=\"se\"\u003e{path}\u003c/span\u003e\u003cspan class=\"s\"\u003e/index.html\u003c/span\u003e \u003cspan class=\"se\"\u003e{path}\u003c/span\u003e\u003cspan class=\"s\"\u003e/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eTesting Caddy configuration:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Validate Caddyfile syntax\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecaddy validate --config /etc/caddy/Caddyfile\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Reload configuration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl reload caddy\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Verify txt files are served correctly\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -I https://example.com/robots.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Should return: Content-Type: text/plain; charset=utf-8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"live-update-patterns\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLive Update Patterns\u003c/span\u003e \u003ca href=\"#live-update-patterns\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThere are several approaches to keeping your self-hosted site up-to-date with content changes.\u003c/p\u003e\n\u003ch3 id=\"development-mode-watch\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDevelopment Mode (Watch)\u003c/span\u003e \u003ca href=\"#development-mode-watch\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor development, use the serve command which watches for file changes by default:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Watch is enabled by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve --port \u003cspan class=\"m\"\u003e8000\u003c/span\u003e --host 0.0.0.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Explicitly disable watch for static serving\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve --no-watch\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eNote:\u003c/strong\u003e The \u003ccode\u003eserve\u003c/code\u003e command has file watching enabled by default. Use \u003ccode\u003e--no-watch\u003c/code\u003e to disable it.\u003c/p\u003e\n\u003ch3 id=\"git-webhooks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGit Webhooks\u003c/span\u003e \u003ca href=\"#git-webhooks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor production, trigger rebuilds via webhooks when content is pushed to your repository.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. Create a webhook handler script:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# /usr/local/bin/webhook-rebuild.sh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eset\u003c/span\u003e -e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eSITE_DIR\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/var/www/mysite\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eLOG_FILE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/var/log/markata-rebuild.log\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eLOCK_FILE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/tmp/markata-rebuild.lock\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Prevent concurrent rebuilds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e -f \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$LOCK_FILE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003edate\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e: Rebuild already in progress, skipping\u0026#34;\u003c/span\u003e \u0026gt;\u0026gt; \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$LOG_FILE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eexit\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003etrap\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;rm -f \u003c/span\u003e\u003cspan class=\"nv\"\u003e$LOCK_FILE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e EXIT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etouch \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$LOCK_FILE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003edate\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e: Starting rebuild\u0026#34;\u003c/span\u003e \u0026gt;\u0026gt; \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$LOG_FILE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$SITE_DIR\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit fetch origin main\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit reset --hard origin/main\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Rebuild the site\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/var/www/mysite/.go/bin/markata-go build --clean \u0026gt;\u0026gt; \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$LOG_FILE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e 2\u0026gt;\u003cspan class=\"p\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003edate\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e: Rebuild complete\u0026#34;\u003c/span\u003e \u0026gt;\u0026gt; \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$LOG_FILE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e2. Set up a lightweight webhook server:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCreate \u003ccode\u003e/etc/systemd/system/webhook.service\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e[Unit]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eDescription\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003eWebhook server for site rebuilds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eAfter\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003enetwork.target\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e[Service]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eType\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003esimple\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eUser\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003emarkata\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eExecStart\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e/usr/bin/webhook -hooks /etc/webhook/hooks.json -port 9000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eRestart\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003ealways\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e[Install]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eWantedBy\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003emulti-user.target\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e3. Configure the webhook:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCreate \u003ccode\u003e/etc/webhook/hooks.json\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;rebuild-site\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;execute-command\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/usr/local/bin/webhook-rebuild.sh\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;command-working-directory\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/var/www/mysite\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;pass-arguments-to-command\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;trigger-rule\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;match\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;payload-hmac-sha256\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;secret\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;your-webhook-secret\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e  \u003cspan class=\"err\"\u003e#\u003c/span\u003e \u003cspan class=\"err\"\u003epragma:\u003c/span\u003e \u003cspan class=\"err\"\u003eallowlist\u003c/span\u003e \u003cspan class=\"err\"\u003esecret\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;parameter\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;header\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;X-Hub-Signature-256\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e4. Configure your Git host:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eGitHub: Settings \u0026gt; Webhooks \u0026gt; Add webhook\u003c/li\u003e\n\u003cli\u003eURL: \u003ccode\u003ehttps://your-domain.com/hooks/rebuild-site\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eSecret: Same as in hooks.json\u003c/li\u003e\n\u003cli\u003eEvents: Push events\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"scheduled-rebuilds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eScheduled Rebuilds\u003c/span\u003e \u003ca href=\"#scheduled-rebuilds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor sites that pull data from external sources, use scheduled rebuilds.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. Create the rebuild service:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# /etc/systemd/system/markata-go-rebuild.service\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e[Unit]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eDescription\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003eRebuild markata-go site\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eAfter\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003enetwork.target\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e[Service]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eType\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003eoneshot\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eUser\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003emarkata\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eWorkingDirectory\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e/var/www/mysite\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003eHOME=/var/www/mysite\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003eGOPATH=/var/www/mysite/.go\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003ePATH=/var/www/mysite/.go/bin:/usr/local/go/bin:/usr/bin:/bin\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eExecStart\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e/var/www/mysite/.go/bin/markata-go build --clean\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eStandardOutput\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003ejournal\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eStandardError\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003ejournal\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e2. Create the timer:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# /etc/systemd/system/markata-go-rebuild.timer\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e[Unit]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eDescription\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003eRebuild site on schedule\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e[Timer]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Rebuild hourly\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eOnCalendar\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003ehourly\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Or use specific times: OnCalendar=*-*-* 06,12,18:00:00\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Catch up on missed runs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003ePersistent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Add randomized delay to avoid thundering herd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eRandomizedDelaySec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e300\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e[Install]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eWantedBy\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003etimers.target\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e3. Enable the timer:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl daemon-reload\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl \u003cspan class=\"nb\"\u003eenable\u003c/span\u003e markata-go-rebuild.timer\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl start markata-go-rebuild.timer\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check timer status\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl list-timers markata-go-rebuild.timer\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"ci-cd-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCI/CD Integration\u003c/span\u003e \u003ca href=\"#ci-cd-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBuild in CI and deploy via rsync:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# .github/workflows/deploy.yml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy Site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eschedule\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# Rebuild daily at 6am UTC\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003ecron\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;0 6 * * *\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eworkflow_dispatch\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edeploy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-go@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ego-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1.22\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          markata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy via rsync\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          rsync -avz --delete public/ user@server:/var/www/mysite/public/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eSSH_PRIVATE_KEY\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.SSH_PRIVATE_KEY }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"health-checks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHealth Checks\u003c/span\u003e \u003ca href=\"#health-checks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHealth checks help ensure your site is running correctly and enable automated recovery.\u003c/p\u003e\n\u003ch3 id=\"http-health-checks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHTTP Health Checks\u003c/span\u003e \u003ca href=\"#http-health-checks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eBasic curl check:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# /usr/local/bin/health-check.sh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e curl -sf http://localhost:8000/ \u0026gt; /dev/null\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Site is healthy\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eexit\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Site is unhealthy\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eexit\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003esystemd health monitoring:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eAdd to your service file:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e[Service]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# ... existing config ...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Health check with automatic restart\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eExecStartPost\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e/bin/sleep 5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eExecStartPost\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e/usr/bin/curl -sf http://localhost:8000/ || exit 1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Watchdog (systemd will restart if no response)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eWatchdogSec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e60\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eNotifyAccess\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003emain\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"docker-health-checks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocker Health Checks\u003c/span\u003e \u003ca href=\"#docker-health-checks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003edocker-compose.yml health check:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eservices\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# ... other config ...\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehealthcheck\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003etest\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;CMD\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;wget\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--spider\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;-q\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;http://localhost:8000/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003einterval\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e30s\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003etimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e10s\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eretries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003estart_period\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e30s\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eMulti-endpoint health check:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ehealthcheck\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etest\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    wget --spider -q http://localhost:8000/ \u0026amp;\u0026amp;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    wget --spider -q http://localhost:8000/blog/ \u0026amp;\u0026amp;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    wget --spider -q http://localhost:8000/blog/rss.xml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003einterval\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e60s\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e15s\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eretries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"external-monitoring\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExternal Monitoring\u003c/span\u003e \u003ca href=\"#external-monitoring\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse external services to monitor your site from outside your infrastructure:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eService\u003c/th\u003e\n\u003cth\u003eFree Tier\u003c/th\u003e\n\u003cth\u003eFeatures\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://uptimerobot.com/\"\u003eUptime Robot\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e50 monitors\u003c/td\u003e\n\u003ctd\u003eHTTP, keyword, ping\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://healthchecks.io/\"\u003eHealthchecks.io\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e20 checks\u003c/td\u003e\n\u003ctd\u003eCron monitoring, alerts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://betterstack.com/\"\u003eBetter Stack\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e10 monitors\u003c/td\u003e\n\u003ctd\u003eStatus pages, incidents\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eHealthchecks.io integration for scheduled rebuilds:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# /usr/local/bin/webhook-rebuild.sh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eHEALTHCHECK_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://hc-ping.com/your-uuid\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Ping start\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -fsS -m \u003cspan class=\"m\"\u003e10\u003c/span\u003e --retry \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eHEALTHCHECK_URL\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e/start\u0026#34;\u003c/span\u003e \u0026gt; /dev/null\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Do the rebuild\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e /var/www/mysite\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit pull origin main\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/var/www/mysite/.go/bin/markata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Ping success or failure\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e \u003cspan class=\"nv\"\u003e$?\u003c/span\u003e -eq \u003cspan class=\"m\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    curl -fsS -m \u003cspan class=\"m\"\u003e10\u003c/span\u003e --retry \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eHEALTHCHECK_URL\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u0026gt; /dev/null\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    curl -fsS -m \u003cspan class=\"m\"\u003e10\u003c/span\u003e --retry \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eHEALTHCHECK_URL\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e/fail\u0026#34;\u003c/span\u003e \u0026gt; /dev/null\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"container-orchestration-health\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContainer Orchestration Health\u003c/span\u003e \u003ca href=\"#container-orchestration-health\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eKubernetes readiness probe:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eapiVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ekind\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ePod\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003espec\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003econtainers\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ereadinessProbe\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ehttpGet\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eport\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e8000\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003einitialDelaySeconds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e10\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eperiodSeconds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003elivenessProbe\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ehttpGet\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eport\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e8000\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003einitialDelaySeconds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e30\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eperiodSeconds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e10\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eDocker Swarm health check:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eservices\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edeploy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ereplicas\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eupdate_config\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eparallelism\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003edelay\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e10s\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003efailure_action\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003erollback\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehealthcheck\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003etest\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;CMD\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;wget\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--spider\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;-q\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;http://localhost:8000/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003einterval\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e30s\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003etimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e10s\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eretries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"security-checklist\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSecurity Checklist\u003c/span\u003e \u003ca href=\"#security-checklist\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBefore going live:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Firewall configured (only ports 80, 443, and SSH)\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e SSH key authentication only (disable password auth)\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Automatic security updates enabled\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e HTTPS working with valid certificate\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Security headers configured\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Service running as non-root user\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e File permissions restricted\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"firewall-setup-ufw\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFirewall Setup (ufw)\u003c/span\u003e \u003ca href=\"#firewall-setup-ufw\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo ufw default deny incoming\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo ufw default allow outgoing\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo ufw allow ssh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo ufw allow http\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo ufw allow https\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo ufw \u003cspan class=\"nb\"\u003eenable\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"monitoring\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMonitoring\u003c/span\u003e \u003ca href=\"#monitoring\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"basic-health-checks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Health Checks\u003c/span\u003e \u003ca href=\"#basic-health-checks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check if site is responding\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -I https://example.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check systemd service\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl status markata-go\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# View recent logs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo journalctl -u markata-go -n \u003cspan class=\"m\"\u003e100\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"uptime-monitoring\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUptime Monitoring\u003c/span\u003e \u003ca href=\"#uptime-monitoring\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConsider using:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://uptimerobot.com/\"\u003eUptime Robot\u003c/a\u003e (free tier available)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://healthchecks.io/\"\u003eHealthchecks.io\u003c/a\u003e for cron monitoring\u003c/li\u003e\n\u003cli\u003eSelf-hosted: \u003ca href=\"https://github.com/louislam/uptime-kuma\"\u003eUptime Kuma\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"site-not-loading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSite Not Loading\u003c/span\u003e \u003ca href=\"#site-not-loading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eCheck if the service is running:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl status markata-go\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker compose ps\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCheck if web server is running:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl status nginx  \u003cspan class=\"c1\"\u003e# or caddy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCheck firewall:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo ufw status\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"https-not-working\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHTTPS Not Working\u003c/span\u003e \u003ca href=\"#https-not-working\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eVerify DNS is pointing to your server\u003c/li\u003e\n\u003cli\u003eCheck Let\u0026rsquo;s Encrypt logs:\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Caddy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker compose logs caddy\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Certbot\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo certbot certificates\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"build-failures\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Failures\u003c/span\u003e \u003ca href=\"#build-failures\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eCheck build logs:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo journalctl -u markata-go\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker compose logs builder\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRun build manually:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e /var/www/mysite\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"resource-requirements\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eResource Requirements\u003c/span\u003e \u003ca href=\"#resource-requirements\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSetup\u003c/th\u003e\n\u003cth\u003eCPU\u003c/th\u003e\n\u003cth\u003eRAM\u003c/th\u003e\n\u003cth\u003eDisk\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eMinimum\u003c/td\u003e\n\u003ctd\u003e1 core\u003c/td\u003e\n\u003ctd\u003e512 MB\u003c/td\u003e\n\u003ctd\u003e1 GB\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRecommended\u003c/td\u003e\n\u003ctd\u003e2 cores\u003c/td\u003e\n\u003ctd\u003e1 GB\u003c/td\u003e\n\u003ctd\u003e5 GB\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWith build cache\u003c/td\u003e\n\u003ctd\u003e2 cores\u003c/td\u003e\n\u003ctd\u003e2 GB\u003c/td\u003e\n\u003ctd\u003e10 GB\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext Steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfiguration Guide\u003c/a\u003e - Customize your site\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/deployment/\"\u003eDeployment Guide\u003c/a\u003e - Other hosting options\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/themes/\"\u003eThemes Guide\u003c/a\u003e - Customize appearance\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nThis guide covers deploying markata-go sites on your own infrastructure. Whether you prefer Docker containers, systemd services, or manual setups, you'll find everything you need to self-host your static site.\n\n## Overview\n\nSelf-hosting gives you complete control over your site's infrastructure. markata-go supports several deployment methods:\n\n| Method | Best For | Complexity |\n|--------|----------|------------|\n| Docker Compose | Quick setup, portability | Low |\n| systemd | Linux servers, integration | Medium |\n| Manual | Custom setups, learning | High |\n\n**Prerequisites:**\n- A Linux server (VPS, dedicated, or home server)\n- Domain name pointed to your server\n- Basic command line knowledge\n\n## Quick Start with Docker\n\nThe fastest way to self-host is using Docker Compose:\n\n```bash\n# Clone your site or create a new one\ngit clone https://github.com/you/your-site.git\ncd your-site\n\n# Copy the deployment files\ncp -r deploy/docker ./docker-deploy\ncd docker-deploy\n\n# Configure environment\ncp .env.example .env\n# Edit .env with your domain: SITE_DOMAIN=example.com\n\n# Start production stack\ndocker compose -f docker-compose.prod.yml up -d\n```\n\nYour site will be available at `https://your-domain.com` with automatic HTTPS.\n\nSee [Docker Deployment README](https://github.com/WaylonWalker/markata-go/tree/main/deploy/docker) for detailed configuration options.\n\n## Docker Compose Configurations\n\n### Development Mode\n\nFor local development with hot reload:\n\n```bash\ncd deploy/docker\ndocker compose -f docker-compose.dev.yml up\n```\n\nFeatures:\n- Hot reload on file changes\n- Local preview at http://localhost:8000\n- Go module caching\n\n### Production Mode\n\nFor production with Caddy reverse proxy:\n\n```bash\ncd deploy/docker\n\n# Configure\ncp .env.example .env\nvim .env  # Set SITE_DOMAIN and SITE_URL\n\n# Deploy\ndocker compose -f docker-compose.prod.yml up -d\n```\n\nFeatures:\n- Automatic HTTPS via Let's Encrypt\n- HTTP/2 and HTTP/3 support\n- Security headers\n- Gzip/Zstd compression\n- Optimized caching\n\n### Environment Variables\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `SITE_DOMAIN` | Your domain name | `example.com` |\n| `SITE_URL` | Full URL for feeds/links | `https://example.com` |\n| `SITE_DIR` | Path to site content | `./../..` |\n| `PORT` | Development port | `8000` |\n\n## systemd Services\n\nFor traditional Linux server deployments, use systemd services.\n\n### Quick Setup\n\n```bash\ncd deploy/systemd\nsudo ./install.sh\n```\n\nThe installer prompts for:\n- Site directory (default: `/var/www/mysite`)\n- Site URL (default: `https://example.com`)\n- Service user (default: `markata`)\n\n### Manual Setup\n\n```bash\n# Create service user\nsudo useradd -r -s /bin/false -d /var/www/mysite markata\n\n# Create directories\nsudo mkdir -p /var/www/mysite/{public,.go}\nsudo chown -R markata:markata /var/www/mysite\n\n# Install markata-go\nsudo -u markata bash -c '\n    export GOPATH=/var/www/mysite/.go\n    go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n'\n\n# Install services\nsudo cp deploy/systemd/markata-go.service /etc/systemd/system/\nsudo cp deploy/systemd/markata-go-watch.service /etc/systemd/system/\n# Edit paths in service files\n\nsudo systemctl daemon-reload\n```\n\n### Available Services\n\n**markata-go.service** - One-time build:\n```bash\nsudo systemctl enable markata-go\nsudo systemctl start markata-go\n\n# Rebuild site\nsudo systemctl restart markata-go\n```\n\n**markata-go-watch.service** - Auto-rebuild on changes:\n```bash\nsudo systemctl enable markata-go-watch\nsudo systemctl start markata-go-watch\n\n# View logs\nsudo journalctl -u markata-go-watch -f\n```\n\nSee [systemd Deployment README](https://github.com/WaylonWalker/markata-go/tree/main/deploy/systemd) for detailed setup and troubleshooting.\n\n## Web Server Configuration\n\n### Using nginx\n\nIf using systemd with nginx:\n\n```nginx\nserver {\n    listen 80;\n    listen [::]:80;\n    server_name example.com;\n    return 301 https://$server_name$request_uri;\n}\n\nserver {\n    listen 443 ssl http2;\n    listen [::]:443 ssl http2;\n    server_name example.com;\n\n    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;\n    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;\n\n    root /var/www/mysite/public;\n    index index.html;\n\n    # Security headers\n    add_header X-Frame-Options \"DENY\" always;\n    add_header X-Content-Type-Options \"nosniff\" always;\n\n    # MIME types for txt/md files\n    location ~ \\.(txt|md)$ {\n        default_type text/plain;\n        charset utf-8;\n    }\n\n    # Caching\n    location /static/ {\n        expires 1y;\n        add_header Cache-Control \"public, immutable\";\n    }\n\n    # Try exact file first, then index.html, then directory\n    # This supports reversed redirects where /robots.txt is canonical\n    location / {\n        try_files $uri $uri/index.html $uri/ =404;\n    }\n}\n```\n\n**Testing nginx configuration:**\n\n```bash\n# Test configuration syntax\nsudo nginx -t\n\n# Reload configuration\nsudo systemctl reload nginx\n\n# Verify txt files are served correctly\ncurl -I https://example.com/robots.txt\n# Should return: Content-Type: text/plain; charset=utf-8\n```\n\n### Using Caddy\n\nSimpler alternative with automatic HTTPS:\n\n```caddyfile\nexample.com {\n    root * /var/www/mysite/public\n    file_server\n    encode gzip\n\n    header {\n        X-Frame-Options \"DENY\"\n        X-Content-Type-Options \"nosniff\"\n    }\n\n    # MIME types for txt/md files\n    @txtmd path *.txt *.md\n    header @txtmd Content-Type \"text/plain; charset=utf-8\"\n\n    @static path /static/*\n    header @static Cache-Control \"public, max-age=31536000, immutable\"\n\n    # Try exact file first (for /robots.txt), then index.html, then directory\n    try_files {path} {path}/index.html {path}/\n}\n```\n\n**Testing Caddy configuration:**\n\n```bash\n# Validate Caddyfile syntax\ncaddy validate --config /etc/caddy/Caddyfile\n\n# Reload configuration\nsudo systemctl reload caddy\n\n# Verify txt files are served correctly\ncurl -I https://example.com/robots.txt\n# Should return: Content-Type: text/plain; charset=utf-8\n```\n\n## Live Update Patterns\n\nThere are several approaches to keeping your self-hosted site up-to-date with content changes.\n\n### Development Mode (Watch)\n\nFor development, use the serve command which watches for file changes by default:\n\n```bash\n# Watch is enabled by default\nmarkata-go serve --port 8000 --host 0.0.0.0\n\n# Explicitly disable watch for static serving\nmarkata-go serve --no-watch\n```\n\n**Note:** The `serve` command has file watching enabled by default. Use `--no-watch` to disable it.\n\n### Git Webhooks\n\nFor production, trigger rebuilds via webhooks when content is pushed to your repository.\n\n**1. Create a webhook handler script:**\n\n```bash\n#!/bin/bash\n# /usr/local/bin/webhook-rebuild.sh\n\nset -e\n\nSITE_DIR=\"/var/www/mysite\"\nLOG_FILE=\"/var/log/markata-rebuild.log\"\nLOCK_FILE=\"/tmp/markata-rebuild.lock\"\n\n# Prevent concurrent rebuilds\nif [ -f \"$LOCK_FILE\" ]; then\n    echo \"$(date): Rebuild already in progress, skipping\" \u003e\u003e \"$LOG_FILE\"\n    exit 0\nfi\n\ntrap \"rm -f $LOCK_FILE\" EXIT\ntouch \"$LOCK_FILE\"\n\necho \"$(date): Starting rebuild\" \u003e\u003e \"$LOG_FILE\"\n\ncd \"$SITE_DIR\"\ngit fetch origin main\ngit reset --hard origin/main\n\n# Rebuild the site\n/var/www/mysite/.go/bin/markata-go build --clean \u003e\u003e \"$LOG_FILE\" 2\u003e\u00261\n\necho \"$(date): Rebuild complete\" \u003e\u003e \"$LOG_FILE\"\n```\n\n**2. Set up a lightweight webhook server:**\n\nCreate `/etc/systemd/system/webhook.service`:\n\n```ini\n[Unit]\nDescription=Webhook server for site rebuilds\nAfter=network.target\n\n[Service]\nType=simple\nUser=markata\nExecStart=/usr/bin/webhook -hooks /etc/webhook/hooks.json -port 9000\nRestart=always\n\n[Install]\nWantedBy=multi-user.target\n```\n\n**3. Configure the webhook:**\n\nCreate `/etc/webhook/hooks.json`:\n\n```json\n[\n  {\n    \"id\": \"rebuild-site\",\n    \"execute-command\": \"/usr/local/bin/webhook-rebuild.sh\",\n    \"command-working-directory\": \"/var/www/mysite\",\n    \"pass-arguments-to-command\": [],\n    \"trigger-rule\": {\n      \"match\": {\n        \"type\": \"payload-hmac-sha256\",\n        \"secret\": \"your-webhook-secret\",  # pragma: allowlist secret\n        \"parameter\": {\n          \"source\": \"header\",\n          \"name\": \"X-Hub-Signature-256\"\n        }\n      }\n    }\n  }\n]\n```\n\n**4. Configure your Git host:**\n\n- GitHub: Settings \u003e Webhooks \u003e Add webhook\n- URL: `https://your-domain.com/hooks/rebuild-site`\n- Secret: Same as in hooks.json\n- Events: Push events\n\n### Scheduled Rebuilds\n\nFor sites that pull data from external sources, use scheduled rebuilds.\n\n**1. Create the rebuild service:**\n\n```ini\n# /etc/systemd/system/markata-go-rebuild.service\n[Unit]\nDescription=Rebuild markata-go site\nAfter=network.target\n\n[Service]\nType=oneshot\nUser=markata\nWorkingDirectory=/var/www/mysite\nEnvironment=HOME=/var/www/mysite\nEnvironment=GOPATH=/var/www/mysite/.go\nEnvironment=PATH=/var/www/mysite/.go/bin:/usr/local/go/bin:/usr/bin:/bin\nExecStart=/var/www/mysite/.go/bin/markata-go build --clean\nStandardOutput=journal\nStandardError=journal\n```\n\n**2. Create the timer:**\n\n```ini\n# /etc/systemd/system/markata-go-rebuild.timer\n[Unit]\nDescription=Rebuild site on schedule\n\n[Timer]\n# Rebuild hourly\nOnCalendar=hourly\n# Or use specific times: OnCalendar=*-*-* 06,12,18:00:00\n# Catch up on missed runs\nPersistent=true\n# Add randomized delay to avoid thundering herd\nRandomizedDelaySec=300\n\n[Install]\nWantedBy=timers.target\n```\n\n**3. Enable the timer:**\n\n```bash\nsudo systemctl daemon-reload\nsudo systemctl enable markata-go-rebuild.timer\nsudo systemctl start markata-go-rebuild.timer\n\n# Check timer status\nsudo systemctl list-timers markata-go-rebuild.timer\n```\n\n### CI/CD Integration\n\nBuild in CI and deploy via rsync:\n\n```yaml\n# .github/workflows/deploy.yml\nname: Deploy Site\n\non:\n  push:\n    branches: [main]\n  schedule:\n    # Rebuild daily at 6am UTC\n    - cron: '0 6 * * *'\n  workflow_dispatch:\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Setup Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: '1.22'\n\n      - name: Build site\n        run: |\n          go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n          markata-go build --clean\n        env:\n          MARKATA_GO_URL: https://example.com\n\n      - name: Deploy via rsync\n        run: |\n          rsync -avz --delete public/ user@server:/var/www/mysite/public/\n        env:\n          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}\n```\n\n## Health Checks\n\nHealth checks help ensure your site is running correctly and enable automated recovery.\n\n### HTTP Health Checks\n\n**Basic curl check:**\n\n```bash\n#!/bin/bash\n# /usr/local/bin/health-check.sh\nif curl -sf http://localhost:8000/ \u003e /dev/null; then\n    echo \"Site is healthy\"\n    exit 0\nelse\n    echo \"Site is unhealthy\"\n    exit 1\nfi\n```\n\n**systemd health monitoring:**\n\nAdd to your service file:\n\n```ini\n[Service]\n# ... existing config ...\n\n# Health check with automatic restart\nExecStartPost=/bin/sleep 5\nExecStartPost=/usr/bin/curl -sf http://localhost:8000/ || exit 1\n\n# Watchdog (systemd will restart if no response)\nWatchdogSec=60\nNotifyAccess=main\n```\n\n### Docker Health Checks\n\n**docker-compose.yml health check:**\n\n```yaml\nservices:\n  markata:\n    # ... other config ...\n    healthcheck:\n      test: [\"CMD\", \"wget\", \"--spider\", \"-q\", \"http://localhost:8000/\"]\n      interval: 30s\n      timeout: 10s\n      retries: 3\n      start_period: 30s\n```\n\n**Multi-endpoint health check:**\n\n```yaml\nhealthcheck:\n  test: |\n    wget --spider -q http://localhost:8000/ \u0026\u0026\n    wget --spider -q http://localhost:8000/blog/ \u0026\u0026\n    wget --spider -q http://localhost:8000/blog/rss.xml\n  interval: 60s\n  timeout: 15s\n  retries: 3\n```\n\n### External Monitoring\n\nUse external services to monitor your site from outside your infrastructure:\n\n| Service | Free Tier | Features |\n|---------|-----------|----------|\n| [Uptime Robot](https://uptimerobot.com/) | 50 monitors | HTTP, keyword, ping |\n| [Healthchecks.io](https://healthchecks.io/) | 20 checks | Cron monitoring, alerts |\n| [Better Stack](https://betterstack.com/) | 10 monitors | Status pages, incidents |\n\n**Healthchecks.io integration for scheduled rebuilds:**\n\n```bash\n#!/bin/bash\n# /usr/local/bin/webhook-rebuild.sh\n\nHEALTHCHECK_URL=\"https://hc-ping.com/your-uuid\"\n\n# Ping start\ncurl -fsS -m 10 --retry 5 \"${HEALTHCHECK_URL}/start\" \u003e /dev/null\n\n# Do the rebuild\ncd /var/www/mysite\ngit pull origin main\n/var/www/mysite/.go/bin/markata-go build --clean\n\n# Ping success or failure\nif [ $? -eq 0 ]; then\n    curl -fsS -m 10 --retry 5 \"${HEALTHCHECK_URL}\" \u003e /dev/null\nelse\n    curl -fsS -m 10 --retry 5 \"${HEALTHCHECK_URL}/fail\" \u003e /dev/null\nfi\n```\n\n### Container Orchestration Health\n\n**Kubernetes readiness probe:**\n\n```yaml\napiVersion: v1\nkind: Pod\nspec:\n  containers:\n    - name: markata\n      readinessProbe:\n        httpGet:\n          path: /\n          port: 8000\n        initialDelaySeconds: 10\n        periodSeconds: 5\n      livenessProbe:\n        httpGet:\n          path: /\n          port: 8000\n        initialDelaySeconds: 30\n        periodSeconds: 10\n```\n\n**Docker Swarm health check:**\n\n```yaml\nservices:\n  markata:\n    deploy:\n      replicas: 2\n      update_config:\n        parallelism: 1\n        delay: 10s\n        failure_action: rollback\n    healthcheck:\n      test: [\"CMD\", \"wget\", \"--spider\", \"-q\", \"http://localhost:8000/\"]\n      interval: 30s\n      timeout: 10s\n      retries: 3\n```\n\n## Security Checklist\n\nBefore going live:\n\n- [ ] Firewall configured (only ports 80, 443, and SSH)\n- [ ] SSH key authentication only (disable password auth)\n- [ ] Automatic security updates enabled\n- [ ] HTTPS working with valid certificate\n- [ ] Security headers configured\n- [ ] Service running as non-root user\n- [ ] File permissions restricted\n\n### Firewall Setup (ufw)\n\n```bash\nsudo ufw default deny incoming\nsudo ufw default allow outgoing\nsudo ufw allow ssh\nsudo ufw allow http\nsudo ufw allow https\nsudo ufw enable\n```\n\n## Monitoring\n\n### Basic Health Checks\n\n```bash\n# Check if site is responding\ncurl -I https://example.com\n\n# Check systemd service\nsudo systemctl status markata-go\n\n# View recent logs\nsudo journalctl -u markata-go -n 100\n```\n\n### Uptime Monitoring\n\nConsider using:\n- [Uptime Robot](https://uptimerobot.com/) (free tier available)\n- [Healthchecks.io](https://healthchecks.io/) for cron monitoring\n- Self-hosted: [Uptime Kuma](https://github.com/louislam/uptime-kuma)\n\n## Troubleshooting\n\n### Site Not Loading\n\n1. Check if the service is running:\n   ```bash\n   sudo systemctl status markata-go\n   docker compose ps\n   ```\n\n2. Check if web server is running:\n   ```bash\n   sudo systemctl status nginx  # or caddy\n   ```\n\n3. Check firewall:\n   ```bash\n   sudo ufw status\n   ```\n\n### HTTPS Not Working\n\n1. Verify DNS is pointing to your server\n2. Check Let's Encrypt logs:\n   ```bash\n   # Caddy\n   docker compose logs caddy\n   # Certbot\n   sudo certbot certificates\n   ```\n\n### Build Failures\n\n1. Check build logs:\n   ```bash\n   sudo journalctl -u markata-go\n   docker compose logs builder\n   ```\n\n2. Run build manually:\n   ```bash\n   cd /var/www/mysite\n   markata-go build --clean -v\n   ```\n\n## Resource Requirements\n\n| Setup | CPU | RAM | Disk |\n|-------|-----|-----|------|\n| Minimum | 1 core | 512 MB | 1 GB |\n| Recommended | 2 cores | 1 GB | 5 GB |\n| With build cache | 2 cores | 2 GB | 10 GB |\n\n## Next Steps\n\n- [Configuration Guide](/docs/guides/configuration/) - Customize your site\n- [Deployment Guide](/docs/guides/deployment/) - Other hosting options\n- [Themes Guide](/docs/guides/themes/) - Customize appearance\n",
      "summary": "Deploy markata-go sites on your own servers using Docker, systemd, or manual setups",
      "date_published": "2024-01-23T00:00:00Z",
      "date_modified": "2024-01-23T00:00:00Z",
      "tags": [
        "documentation",
        "deployment",
        "self-hosting",
        "docker",
        "systemd"
      ]
    },
    {
      "id": "https://markata.dev/docs/troubleshooting/",
      "url": "https://markata.dev/docs/troubleshooting/",
      "title": "Troubleshooting",
      "content_html": "\u003cp\u003eThis guide covers common issues users encounter when working with markata-go and how to resolve them.\u003c/p\u003e\n\u003ch2 id=\"table-of-contents\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTable of Contents\u003c/span\u003e \u003ca href=\"#table-of-contents\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#installation-issues\"\u003eInstallation Issues\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#configuration-issues\"\u003eConfiguration Issues\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#content-issues\"\u003eContent Issues\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#build-issues\"\u003eBuild Issues\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#feed-issues\"\u003eFeed Issues\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#serve-issues\"\u003eServe Issues\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#deployment-issues\"\u003eDeployment Issues\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#plugin-issues\"\u003ePlugin Issues\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#getting-help\"\u003eGetting Help\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"installation-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInstallation Issues\u003c/span\u003e \u003ca href=\"#installation-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"go-not-installed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGo Not Installed\u003c/span\u003e \u003ca href=\"#go-not-installed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ebash: go: command not found\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eOr on Windows:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e'go' is not recognized as an internal or external command\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e Go is not installed on your system or not in your PATH.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eDownload Go from \u003ca href=\"https://go.dev/dl/\"\u003ehttps://go.dev/dl/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFollow the installation instructions for your operating system\u003c/li\u003e\n\u003cli\u003eVerify installation:\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eExample output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ego version go1.22.2 linux/amd64\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch3 id=\"wrong-go-version\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWrong Go Version\u003c/span\u003e \u003ca href=\"#wrong-go-version\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003enote: module requires Go 1.22\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eOr build errors mentioning unsupported language features.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e markata-go requires Go 1.22 or later, but an older version is installed.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eCheck your current version:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf it\u0026rsquo;s older than 1.22, update Go:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDownload the latest version from \u003ca href=\"https://go.dev/dl/\"\u003ehttps://go.dev/dl/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRemove the old version and install the new one\u003c/li\u003e\n\u003cli\u003eOr use a version manager like \u003ca href=\"https://github.com/moovweb/gvm\"\u003egvm\u003c/a\u003e or \u003ca href=\"https://github.com/syndbg/goenv\"\u003egoenv\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVerify the update:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Should show go1.22.x or higher\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch3 id=\"path-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePATH Issues\u003c/span\u003e \u003ca href=\"#path-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ebash: markata-go: command not found\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eAfter running \u003ccode\u003ego install\u003c/code\u003e successfully.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e The Go bin directory is not in your PATH.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eFind your Go bin directory:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego env GOPATH\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Typically: /home/username/go (Linux/macOS) or C:\\Users\\username\\go (Windows)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAdd the bin directory to your PATH:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLinux/macOS (bash/zsh):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Add to ~/.bashrc, ~/.zshrc, or ~/.profile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003ePATH\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nv\"\u003e$PATH\u003c/span\u003e:\u003cspan class=\"k\"\u003e$(\u003c/span\u003ego env GOPATH\u003cspan class=\"k\"\u003e)\u003c/span\u003e/bin\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Reload the shell\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003esource\u003c/span\u003e ~/.bashrc  \u003cspan class=\"c1\"\u003e# or ~/.zshrc\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eWindows (PowerShell):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Add to your PowerShell profile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$env:PATH\u003c/span\u003e \u003cspan class=\"p\"\u003e+=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;;\u003c/span\u003e\u003cspan class=\"p\"\u003e$(\u003c/span\u003e\u003cspan class=\"n\"\u003ego\u003c/span\u003e \u003cspan class=\"n\"\u003eenv\u003c/span\u003e \u003cspan class=\"n\"\u003eGOPATH\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e\\bin\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eWindows (permanently):\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOpen System Properties \u0026gt; Environment Variables\u003c/li\u003e\n\u003cli\u003eEdit the \u003ccode\u003ePATH\u003c/code\u003e variable\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003e%USERPROFILE%\\go\\bin\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVerify markata-go is accessible:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go --version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch3 id=\"installation-fails-with-network-error\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInstallation Fails with Network Error\u003c/span\u003e \u003ca href=\"#installation-fails-with-network-error\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ego: github.com/WaylonWalker/markata-go@latest: module lookup disabled by GOPROXY=off\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eOr timeout errors during installation.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e Network issues or proxy misconfiguration.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eCheck your proxy settings:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego env GOPROXY\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReset to default if needed:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego env -w \u003cspan class=\"nv\"\u003eGOPROXY\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://proxy.golang.org,direct\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIf behind a corporate proxy, configure it:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eHTTP_PROXY\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttp://proxy.example.com:8080\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eHTTPS_PROXY\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttp://proxy.example.com:8080\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRetry installation:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"configuration-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration Issues\u003c/span\u003e \u003ca href=\"#configuration-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"config-file-not-found\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfig File Not Found\u003c/span\u003e \u003ca href=\"#config-file-not-found\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e markata-go uses default values when you expected it to load a site configuration.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e No configuration file exists in the expected locations, or it has the wrong name. When no configuration file is found, markata-go continues with built-in defaults and environment-variable overrides.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eCheck that a config file exists with the correct name:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003els -la markata-go.toml markata-go.yaml markata-go.yml markata-go.json 2\u0026gt;/dev/null\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCreate a config file if missing:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config init\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOr specify a custom config path:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --config path/to/my-config.toml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eSupported local config file names (in priority order):\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go.toml\u003c/code\u003e (recommended)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go.yaml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go.yml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go.json\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIf none of those exists, markata-go also checks \u003ccode\u003e~/.config/markata-go/config.toml\u003c/code\u003e before falling back to built-in defaults.\u003c/p\u003e\n\u003cp\u003eSee the [[configuration-guide|Configuration Guide]] for details on config file locations.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"invalid-toml-yaml-syntax\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInvalid TOML/YAML Syntax\u003c/span\u003e \u003ca href=\"#invalid-toml-yaml-syntax\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eError: failed to parse config: toml: line 15: expected '=' after key\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eOr:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eError: yaml: line 10: did not find expected key\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e Syntax error in your configuration file.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eValidate your config file:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config validate\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCommon TOML mistakes:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWrong - missing quotes on strings with special characters:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eMy\u003c/span\u003e \u003cspan class=\"nx\"\u003eSite\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003eThe\u003c/span\u003e \u003cspan class=\"nx\"\u003eBest\u003c/span\u003e\u003cspan class=\"err\"\u003e!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCorrect:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Site: The Best!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eWrong - using colons instead of equals:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCorrect:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCommon YAML mistakes:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWrong - incorrect indentation:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCorrect:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eWrong - tabs instead of spaces:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Tab character\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCorrect:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Two spaces\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUse an online validator:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTOML: \u003ca href=\"https://www.toml-lint.com/\"\u003etoml-lint.com\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eYAML: \u003ca href=\"http://www.yamllint.com/\"\u003eyamllint.com\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch3 id=\"unknown-configuration-options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUnknown Configuration Options\u003c/span\u003e \u003ca href=\"#unknown-configuration-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eWarning: unknown configuration key: output-dir\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eOr a setting doesn\u0026rsquo;t seem to take effect.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e Typo in configuration key or using the wrong format.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eCheck for typos. Common mistakes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eoutput-dir\u003c/code\u003e should be \u003ccode\u003eoutput_dir\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etemplatesDir\u003c/code\u003e should be \u003ccode\u003etemplates_dir\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eKeys are case-sensitive\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVerify the correct key names:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config show\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReference the [[configuration-guide|Configuration Guide]] for the complete list of options.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eExample of correct configuration:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Correct: underscore\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplates_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;templates\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eassets_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;static\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"how-to-validate-config\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow to Validate Config\u003c/span\u003e \u003ca href=\"#how-to-validate-config\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eRun the validation command:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config validate\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eExample success output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eConfiguration is valid\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eExample error output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eConfiguration errors:\n  - url: URL must include a scheme (e.g., https://)\n  - concurrency: must be \u0026gt;= 0 (0 means auto-detect)\n\nConfiguration warnings:\n  - glob.patterns: no glob patterns specified, no files will be processed\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eTo see the fully resolved configuration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config show\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo see a specific value:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config get output_dir\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config get glob.patterns\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"content-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContent Issues\u003c/span\u003e \u003ca href=\"#content-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"invalid-frontmatter-yaml\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInvalid Frontmatter YAML\u003c/span\u003e \u003ca href=\"#invalid-frontmatter-yaml\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eError: failed to parse frontmatter in posts/my-post.md: yaml: line 5: could not find expected ':'\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e YAML syntax error in the frontmatter block.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eCheck the frontmatter structure:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ego\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003etutorial\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCommon frontmatter mistakes:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWrong - missing closing delimiter:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etitle: \u0026#34;My Post\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent starts here...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCorrect:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent starts here...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eWrong - invalid date format:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eJanuary 15, 2024\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCorrect:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eWrong - unquoted special characters:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nt\"\u003eMy Post\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eA Guide\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCorrect:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Post: A Guide\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eValidate YAML online at \u003ca href=\"http://www.yamllint.com/\"\u003eyamllint.com\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eSee the [[frontmatter-guide|Frontmatter Guide]] for complete frontmatter documentation.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"posts-not-appearing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePosts Not Appearing\u003c/span\u003e \u003ca href=\"#posts-not-appearing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e You created a post but it doesn\u0026rsquo;t appear on your site.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e Multiple possible causes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePost not published\u003c/li\u003e\n\u003cli\u003eFiltered out by feed configuration\u003c/li\u003e\n\u003cli\u003eFile not matched by glob patterns\u003c/li\u003e\n\u003cli\u003eFile in .gitignore\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck if the post is published:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# Must be true\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edraft\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"c\"\u003e# Should be false for production\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck your feed filter:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Make sure your post matches\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck glob patterns:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;posts/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Does your file match this pattern?\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck if the file is gitignored:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit check-ignore posts/my-post.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# If it returns the filename, the file is ignored\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eRun a verbose build to see what\u0026rsquo;s being processed:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch3 id=\"drafts-showing-in-production\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDrafts Showing in Production\u003c/span\u003e \u003ca href=\"#drafts-showing-in-production\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Draft posts appear on the live site.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e Feed filters don\u0026rsquo;t exclude drafts.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eAdd draft filtering to your feed configuration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and draft == False\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOr filter only by published status (drafts should have \u003ccode\u003epublished: false\u003c/code\u003e):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVerify draft status in frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Draft\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edraft\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch3 id=\"date-format-problems\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDate Format Problems\u003c/span\u003e \u003ca href=\"#date-format-problems\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eError: cannot parse \u0026quot;January 15, 2024\u0026quot; as \u0026quot;2006-01-02\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eOr dates display incorrectly.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e Using an unsupported date format in frontmatter.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eUse ISO 8601 format (recommended):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupported date formats:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e              \u003c/span\u003e\u003cspan class=\"c\"\u003e# YYYY-MM-DD (recommended)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15T10:30:00\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"c\"\u003e# With time\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15T10:30:00Z\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# With timezone\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;2024-01-15\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c\"\u003e# Quoted string\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eNOT supported:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eJanuary 15, 2024       \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Wrong\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e15\u003c/span\u003e\u003cspan class=\"l\"\u003e/01/2024             \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Wrong\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e01-15-2024\u003c/span\u003e\u003cspan class=\"w\"\u003e              \u003c/span\u003e\u003cspan class=\"c\"\u003e# Wrong (MM-DD-YYYY)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch3 id=\"encoding-issues-utf-8\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEncoding Issues (UTF-8)\u003c/span\u003e \u003ca href=\"#encoding-issues-utf-8\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSpecial characters display as \u003ccode\u003e?\u003c/code\u003e or garbled text\u003c/li\u003e\n\u003cli\u003eBuild errors mentioning encoding\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e File is not saved as UTF-8, or has a BOM (Byte Order Mark).\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck file encoding:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efile -i posts/my-post.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Should show: text/plain; charset=utf-8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eConvert to UTF-8 (Linux/macOS):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eiconv -f ISO-8859-1 -t UTF-8 posts/my-post.md -o posts/my-post-utf8.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emv posts/my-post-utf8.md posts/my-post.md\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eRemove BOM if present:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esed -i \u003cspan class=\"s1\"\u003e\u0026#39;1s/^\\xEF\\xBB\\xBF//\u0026#39;\u003c/span\u003e posts/my-post.md\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eConfigure your editor to use UTF-8:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVS Code: Bottom status bar shows encoding, click to change\u003c/li\u003e\n\u003cli\u003eVim: \u003ccode\u003e:set encoding=utf-8\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eEnsure files are saved without BOM\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerify your HTML templates include charset:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003echarset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;UTF-8\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"build-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Issues\u003c/span\u003e \u003ca href=\"#build-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"empty-output-directory\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEmpty Output Directory\u003c/span\u003e \u003ca href=\"#empty-output-directory\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e After building, the output directory is empty or missing files.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e No files matched the glob patterns, or all posts are filtered out.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck glob patterns match your files:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;posts/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pages/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerify files exist in the expected location:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003els -la posts/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck if files are being processed:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck feed filters aren\u0026rsquo;t excluding everything:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Do any posts have published: true?\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eDo a dry run to see what would be built:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --dry-run\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch3 id=\"missing-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMissing Templates\u003c/span\u003e \u003ca href=\"#missing-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eError: template \u0026quot;post.html\u0026quot; not found\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eOr:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eError: template \u0026quot;custom-layout.html\u0026quot; not found\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e Template file doesn\u0026rsquo;t exist in the templates directory.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck templates directory exists:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003els -la templates/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerify template filename matches what\u0026rsquo;s specified:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# In frontmatter\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;post.html\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Must exist as templates/post.html\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCreate missing templates or use defaults:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create a minimal post template\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir -p templates\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecat \u0026gt; templates/post.html \u003cspan class=\"s\"\u003e\u0026lt;\u0026lt; \u0026#39;EOF\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e{% extends \u0026#34;base.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e\u0026lt;article\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e  \u0026lt;h1\u0026gt;{{ post.Title }}\u0026lt;/h1\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e  {{ body|safe }}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e\u0026lt;/article\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003eEOF\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck templates_dir configuration:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplates_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;templates\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Must match your directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eSee the [[templates-guide|Templates Guide]] for template setup.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"template-errors\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Errors\u003c/span\u003e \u003ca href=\"#template-errors\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eError: template error in post.html: unexpected tag \u0026quot;endif\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eOr:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eError: template error: variable \u0026quot;post.title\u0026quot; not found\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e Syntax error in template or incorrect variable access.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck template syntax:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWrong - mismatched tags:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.Tags %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e...\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% end %}  \u003cspan class=\"c\"\u003e\u0026lt;!-- Wrong --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCorrect:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.Tags %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e...\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck variable names are correct (case-sensitive):\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWrong:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ post.title }}  \u003cspan class=\"c\"\u003e\u0026lt;!-- Wrong case --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCorrect:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ post.Title }}  \u003cspan class=\"c\"\u003e\u0026lt;!-- Correct --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUse safe filter for HTML content:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ body|safe }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ post.ArticleHTML|safe }}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eHandle missing values:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ post.Description|default_if_none:\u0026#34;No description\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eCommon template variables:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePost title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Slug\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eURL slug\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Href\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRelative URL path\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Date\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePublication date\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Tags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eList of tags\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.ArticleHTML\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRendered HTML content\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebody\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAlias for ArticleHTML\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig.Title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig.URL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch3 id=\"slow-builds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSlow Builds\u003c/span\u003e \u003ca href=\"#slow-builds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Build takes much longer than expected.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e Too many files, inefficient configuration, or resource constraints.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eIncrease concurrency:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econcurrency\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Adjust based on CPU cores\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eNarrow glob patterns:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Instead of:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# patterns = [\u0026#34;**/*.md\u0026#34;]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Be more specific:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;posts/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pages/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eEnable gitignore filtering:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003euse_gitignore\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eProfile the build:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003etime\u003c/span\u003e markata-go build -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck for large files or images in content directories:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efind posts/ -type f -size +1M\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"feed-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Issues\u003c/span\u003e \u003ca href=\"#feed-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"rss-atom-not-generating\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRSS/Atom Not Generating\u003c/span\u003e \u003ca href=\"#rss-atom-not-generating\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e No \u003ccode\u003erss.xml\u003c/code\u003e or \u003ccode\u003eatom.xml\u003c/code\u003e files in the output.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e Feed formats are not enabled in configuration.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eEnable RSS/Atom formats:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eOr set defaults for all feeds:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerify the feed is being generated:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003els -la output/blog/rss.xml output/blog/atom.xml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eSee the [[feeds-guide|Feeds Guide]] for detailed feed configuration.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"empty-feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEmpty Feeds\u003c/span\u003e \u003ca href=\"#empty-feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e RSS/Atom files are generated but contain no items.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e No posts match the feed filter, or posts lack required fields.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck feed filter matches posts:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Do posts have published: true?\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerify posts have required frontmatter:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c\"\u003e# Required for feed items\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c\"\u003e# Required for feed ordering\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e         \u003c/span\u003e\u003cspan class=\"c\"\u003e# Required to match filter\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck syndication settings:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esyndication\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_items\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Not set to 0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eDebug by removing the filter temporarily:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;debug\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# No filter - should include all posts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch3 id=\"missing-site-url\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMissing Site URL\u003c/span\u003e \u003ca href=\"#missing-site-url\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFeed URLs show as relative paths or empty\u003c/li\u003e\n\u003cli\u003eFeed validators report \u0026ldquo;missing link\u0026rdquo; errors\u003c/li\u003e\n\u003cli\u003eSocial sharing doesn\u0026rsquo;t work\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e The \u003ccode\u003eurl\u003c/code\u003e configuration is not set.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSet the site URL in configuration:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eOr set via environment variable:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerify the URL is set:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config get url\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch3 id=\"feed-validation-errors\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Validation Errors\u003c/span\u003e \u003ca href=\"#feed-validation-errors\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Feed validators report errors like:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u0026ldquo;Missing required element\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;Invalid date format\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;URL must be absolute\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e Missing configuration or invalid content.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eEnsure site URL is set (required for valid feeds):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eEnsure all posts have dates:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eValidate generated feeds:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# RSS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003exmllint --noout output/blog/rss.xml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Atom  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003exmllint --noout output/blog/atom.xml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUse online validators:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://validator.w3.org/feed/\"\u003eW3C Feed Validator\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.feedvalidator.org/\"\u003eFeed Validator\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck feed templates if using custom ones:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;rss.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;atom.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"serve-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eServe Issues\u003c/span\u003e \u003ca href=\"#serve-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"port-already-in-use\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePort Already in Use\u003c/span\u003e \u003ca href=\"#port-already-in-use\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eError: listen tcp :8000: bind: address already in use\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e Another process is using port 8000.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUse a different port:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve -p \u003cspan class=\"m\"\u003e3000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve -p \u003cspan class=\"m\"\u003e8080\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eFind what\u0026rsquo;s using the port:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Linux/macOS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elsof -i :8000\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Windows\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enetstat -ano \u003cspan class=\"p\"\u003e|\u003c/span\u003e findstr :8000\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eKill the process using the port:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Linux/macOS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ekill\u003c/span\u003e \u003cspan class=\"k\"\u003e$(\u003c/span\u003elsof -t -i :8000\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Or force kill\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ekill\u003c/span\u003e -9 \u003cspan class=\"k\"\u003e$(\u003c/span\u003elsof -t -i :8000\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch3 id=\"live-reload-not-working\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLive Reload Not Working\u003c/span\u003e \u003ca href=\"#live-reload-not-working\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Changes to files don\u0026rsquo;t trigger a browser refresh.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e File watcher not detecting changes, or browser cache.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eEnsure file watching is enabled (default):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve  \u003cspan class=\"c1\"\u003e# Watching is on by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# NOT this:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve --no-watch  \u003cspan class=\"c1\"\u003e# This disables watching\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck for file system notification limits (Linux):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check current limit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecat /proc/sys/fs/inotify/max_user_watches\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Increase if needed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e fs.inotify.max_user_watches\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e524288\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e sudo tee -a /etc/sysctl.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo sysctl -p\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eHard refresh your browser:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eChrome/Firefox: \u003ccode\u003eCtrl+Shift+R\u003c/code\u003e (Windows/Linux) or \u003ccode\u003eCmd+Shift+R\u003c/code\u003e (Mac)\u003c/li\u003e\n\u003cli\u003eOr open in incognito/private mode\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck the terminal for rebuild messages:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe server should show \u0026ldquo;Rebuilding\u0026hellip;\u0026rdquo; when files change\u003c/li\u003e\n\u003cli\u003eIf not, the file watcher isn\u0026rsquo;t detecting changes\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eTry verbose mode:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch3 id=\"changes-not-reflecting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChanges Not Reflecting\u003c/span\u003e \u003ca href=\"#changes-not-reflecting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e You made changes but the browser shows old content.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e Browser caching, or changes to files outside watched directories.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eHard refresh the browser:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eCtrl+Shift+R\u003c/code\u003e or \u003ccode\u003eCmd+Shift+R\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eClear browser cache:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDeveloper Tools \u0026gt; Application \u0026gt; Clear Storage\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerify the file is in a watched directory:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFiles must match glob patterns to be watched\u003c/li\u003e\n\u003cli\u003eCheck \u003ccode\u003epatterns\u003c/code\u003e in your config\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eRebuild manually if needed:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Stop the server and rebuild\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck file permissions:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003els -la posts/my-post.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Ensure the file is readable\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"deployment-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeployment Issues\u003c/span\u003e \u003ca href=\"#deployment-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"404-errors\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e404 Errors\u003c/span\u003e \u003ca href=\"#404-errors\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Pages return 404 Not Found after deployment.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e Wrong base URL, incorrect paths, or server configuration.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck base URL matches deployment:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://yourdomain.com\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Must match exactly\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eFor GitHub Pages with repo subdirectory:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# If deployed to https://username.github.io/repo-name/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://username.github.io/repo-name\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerify files exist in output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003els -la output/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003els -la output/my-post/index.html\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck server is configured for clean URLs:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEnsure \u003ccode\u003e/my-post/\u003c/code\u003e serves \u003ccode\u003e/my-post/index.html\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eMost static hosts handle this automatically\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eFor custom servers (nginx), ensure proper config:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003elocation\u003c/span\u003e \u003cspan class=\"s\"\u003e/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003etry_files\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri/\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e404\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch3 id=\"broken-links\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBroken Links\u003c/span\u003e \u003ca href=\"#broken-links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Links on the site lead to 404 pages.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e Internal links are incorrect or posts have moved/been deleted.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eValidate links before deploying:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Install linkinator\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpm install -g linkinator\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check for broken links\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elinkinator output --recurse\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck wikilinks are correct:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[[other-post]]           # Must match a slug exactly\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[[other-post|Link Text]] # Custom link text\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerify slug values:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;my-post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Links should reference this exact slug\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eAdd redirects for moved content:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eNetlify (_redirects or netlify.toml):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e/old-post  /new-post  301\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eVercel (vercel.json):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;redirects\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/old-post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;destination\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/new-post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;permanent\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch3 id=\"missing-assets\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMissing Assets\u003c/span\u003e \u003ca href=\"#missing-assets\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e CSS, JavaScript, or images don\u0026rsquo;t load.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e Assets not copied to output, wrong paths, or base URL issues.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck assets_dir is configured:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eassets_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;static\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerify assets are in the correct directory:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003els -la static/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Should contain css/, js/, images/, etc.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck assets were copied to output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003els -la output/static/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# or\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003els -la output/css/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUse correct paths in templates:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- Absolute path (recommended) --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;stylesheet\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/css/style.css\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- NOT relative --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;stylesheet\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;css/style.css\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e  \u003cspan class=\"c\"\u003e\u0026lt;!-- May break on subpages --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eFor GitHub Pages subdirectory deployment:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- If deployed to /repo-name/ --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;stylesheet\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/repo-name/css/style.css\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch3 id=\"wrong-base-url\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWrong Base URL\u003c/span\u003e \u003ca href=\"#wrong-base-url\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAbsolute URLs point to wrong domain\u003c/li\u003e\n\u003cli\u003eRSS/Atom feeds have incorrect links\u003c/li\u003e\n\u003cli\u003eSocial sharing shows wrong URLs\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e The \u003ccode\u003eurl\u003c/code\u003e config doesn\u0026rsquo;t match the deployment URL.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSet the correct URL for each environment:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eProduction (config file):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eStaging (environment variable):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://staging.example.com markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eFor different deployment environments, use CI/CD variables:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eGitHub Actions:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ vars.SITE_URL }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eNetlify:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eproduction\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eMARKATA_GO_URL\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edeploy-preview\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eMARKATA_GO_URL\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Use relative URLs for previews\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerify the URL is correct:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config get url\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"plugin-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlugin Issues\u003c/span\u003e \u003ca href=\"#plugin-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"plugin-not-loading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlugin Not Loading\u003c/span\u003e \u003ca href=\"#plugin-not-loading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePlugin features don\u0026rsquo;t work\u003c/li\u003e\n\u003cli\u003eWarning about unknown plugin name\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e Plugin not registered, typo in name, or disabled.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck hooks configuration:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehooks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Loads all default plugins\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck disabled_hooks doesn\u0026rsquo;t include your plugin:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edisabled_hooks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Make sure it\u0026#39;s not listed here\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerify the plugin name against the [[built-in-plugins|Plugin Reference]].\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eFor custom plugins, ensure they\u0026rsquo;re registered properly:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSee the [[plugin-development|Plugin Development Guide]]\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch3 id=\"plugin-errors\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlugin Errors\u003c/span\u003e \u003ca href=\"#plugin-errors\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eError: plugin \u0026quot;my_plugin\u0026quot; failed: \u0026lt;specific error message\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eCause:\u003c/strong\u003e Plugin-specific issue, usually configuration or data related.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck plugin configuration:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Plugin-specific options go under the main namespace\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emy_plugin_option\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eEnable verbose output to see detailed errors:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck posts have required fields for the plugin:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eReading time plugin needs content\u003c/li\u003e\n\u003cli\u003eFeed plugins need dates for sorting\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eReview the plugin documentation for requirements\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eTry disabling the plugin to isolate the issue:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edisabled_hooks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;my_plugin\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"getting-help\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGetting Help\u003c/span\u003e \u003ca href=\"#getting-help\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf you can\u0026rsquo;t resolve your issue with this guide:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck existing issues:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/issues\"\u003eGitHub Issues\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSearch the documentation:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e[[getting-started|Getting Started]]\u003c/li\u003e\n\u003cli\u003e[[configuration-guide|Configuration Guide]]\u003c/li\u003e\n\u003cli\u003e[[feeds-guide|Feeds Guide]]\u003c/li\u003e\n\u003cli\u003e[[templates-guide|Templates Guide]]\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCreate a minimal reproduction:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCreate the smallest possible project that shows the issue\u003c/li\u003e\n\u003cli\u003eInclude your config file and a sample post\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eOpen a new issue with:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003emarkata-go version (\u003ccode\u003emarkata-go --version\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eGo version (\u003ccode\u003ego version\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eOperating system\u003c/li\u003e\n\u003cli\u003eFull error message\u003c/li\u003e\n\u003cli\u003eSteps to reproduce\u003c/li\u003e\n\u003cli\u003eRelevant configuration\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUse verbose mode when reporting issues:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build -v 2\u0026gt;\u003cspan class=\"p\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e tee build-output.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"quick-reference-common-commands\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Reference: Common Commands\u003c/span\u003e \u003ca href=\"#quick-reference-common-commands\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Validate configuration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config validate\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Show resolved configuration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config show\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Get a specific config value\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config get url\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build with verbose output\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Dry run (preview without writing)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --dry-run\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Clean build\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Serve on a different port\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve -p \u003cspan class=\"m\"\u003e3000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create a new post\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new \u003cspan class=\"s2\"\u003e\u0026#34;My Post Title\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check version\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go --version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"agent-assisted-troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAgent-assisted troubleshooting\u003c/span\u003e \u003ca href=\"#agent-assisted-troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRun \u003ccode\u003emarkata triage\u003c/code\u003e to prepare a diagnostic prompt and choose an installed coding agent, clipboard, or stdout. See the \u003ca href=\"/docs/guides/triage/\"\u003etriage guide\u003c/a\u003e.\u003c/p\u003e\n",
      "content_text": "\n\nThis guide covers common issues users encounter when working with markata-go and how to resolve them.\n\n## Table of Contents\n\n- [Installation Issues](#installation-issues)\n- [Configuration Issues](#configuration-issues)\n- [Content Issues](#content-issues)\n- [Build Issues](#build-issues)\n- [Feed Issues](#feed-issues)\n- [Serve Issues](#serve-issues)\n- [Deployment Issues](#deployment-issues)\n- [Plugin Issues](#plugin-issues)\n- [Getting Help](#getting-help)\n\n---\n\n## Installation Issues\n\n### Go Not Installed\n\n**Symptom:**\n```\nbash: go: command not found\n```\nOr on Windows:\n```\n'go' is not recognized as an internal or external command\n```\n\n**Cause:** Go is not installed on your system or not in your PATH.\n\n**Solution:**\n\n1. Download Go from [https://go.dev/dl/](https://go.dev/dl/)\n2. Follow the installation instructions for your operating system\n3. Verify installation:\n   ```bash\n   go version\n   ```\n\n**Example output:**\n```\ngo version go1.22.2 linux/amd64\n```\n\n---\n\n### Wrong Go Version\n\n**Symptom:**\n```\nnote: module requires Go 1.22\n```\nOr build errors mentioning unsupported language features.\n\n**Cause:** markata-go requires Go 1.22 or later, but an older version is installed.\n\n**Solution:**\n\n1. Check your current version:\n   ```bash\n   go version\n   ```\n\n2. If it's older than 1.22, update Go:\n   - Download the latest version from [https://go.dev/dl/](https://go.dev/dl/)\n   - Remove the old version and install the new one\n   - Or use a version manager like [gvm](https://github.com/moovweb/gvm) or [goenv](https://github.com/syndbg/goenv)\n\n3. Verify the update:\n   ```bash\n   go version\n   # Should show go1.22.x or higher\n   ```\n\n---\n\n### PATH Issues\n\n**Symptom:**\n```\nbash: markata-go: command not found\n```\nAfter running `go install` successfully.\n\n**Cause:** The Go bin directory is not in your PATH.\n\n**Solution:**\n\n1. Find your Go bin directory:\n   ```bash\n   go env GOPATH\n   # Typically: /home/username/go (Linux/macOS) or C:\\Users\\username\\go (Windows)\n   ```\n\n2. Add the bin directory to your PATH:\n\n   **Linux/macOS (bash/zsh):**\n   ```bash\n   # Add to ~/.bashrc, ~/.zshrc, or ~/.profile\n   export PATH=$PATH:$(go env GOPATH)/bin\n\n   # Reload the shell\n   source ~/.bashrc  # or ~/.zshrc\n   ```\n\n   **Windows (PowerShell):**\n   ```powershell\n   # Add to your PowerShell profile\n   $env:PATH += \";$(go env GOPATH)\\bin\"\n   ```\n\n   **Windows (permanently):**\n   - Open System Properties \u003e Environment Variables\n   - Edit the `PATH` variable\n   - Add `%USERPROFILE%\\go\\bin`\n\n3. Verify markata-go is accessible:\n   ```bash\n   markata-go --version\n   ```\n\n---\n\n### Installation Fails with Network Error\n\n**Symptom:**\n```\ngo: github.com/WaylonWalker/markata-go@latest: module lookup disabled by GOPROXY=off\n```\nOr timeout errors during installation.\n\n**Cause:** Network issues or proxy misconfiguration.\n\n**Solution:**\n\n1. Check your proxy settings:\n   ```bash\n   go env GOPROXY\n   ```\n\n2. Reset to default if needed:\n   ```bash\n   go env -w GOPROXY=https://proxy.golang.org,direct\n   ```\n\n3. If behind a corporate proxy, configure it:\n   ```bash\n   export HTTP_PROXY=http://proxy.example.com:8080\n   export HTTPS_PROXY=http://proxy.example.com:8080\n   ```\n\n4. Retry installation:\n   ```bash\n   go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n   ```\n\n---\n\n## Configuration Issues\n\n### Config File Not Found\n\n**Symptom:** markata-go uses default values when you expected it to load a site configuration.\n\n**Cause:** No configuration file exists in the expected locations, or it has the wrong name. When no configuration file is found, markata-go continues with built-in defaults and environment-variable overrides.\n\n**Solution:**\n\n1. Check that a config file exists with the correct name:\n   ```bash\n   ls -la markata-go.toml markata-go.yaml markata-go.yml markata-go.json 2\u003e/dev/null\n   ```\n\n2. Create a config file if missing:\n   ```bash\n   markata-go config init\n   ```\n\n3. Or specify a custom config path:\n   ```bash\n   markata-go build --config path/to/my-config.toml\n   ```\n\n**Supported local config file names (in priority order):**\n- `markata-go.toml` (recommended)\n- `markata-go.yaml`\n- `markata-go.yml`\n- `markata-go.json`\n\nIf none of those exists, markata-go also checks `~/.config/markata-go/config.toml` before falling back to built-in defaults.\n\nSee the [[configuration-guide|Configuration Guide]] for details on config file locations.\n\n---\n\n### Invalid TOML/YAML Syntax\n\n**Symptom:**\n```\nError: failed to parse config: toml: line 15: expected '=' after key\n```\nOr:\n```\nError: yaml: line 10: did not find expected key\n```\n\n**Cause:** Syntax error in your configuration file.\n\n**Solution:**\n\n1. Validate your config file:\n   ```bash\n   markata-go config validate\n   ```\n\n2. Common TOML mistakes:\n\n   **Wrong - missing quotes on strings with special characters:**\n   ```toml\n   title = My Site: The Best!\n   ```\n\n   **Correct:**\n   ```toml\n   title = \"My Site: The Best!\"\n   ```\n\n   **Wrong - using colons instead of equals:**\n   ```toml\n   title: \"My Site\"\n   ```\n\n   **Correct:**\n   ```toml\n   title = \"My Site\"\n   ```\n\n3. Common YAML mistakes:\n\n   **Wrong - incorrect indentation:**\n   ```yaml\n   markata-go:\n   title: \"My Site\"\n   ```\n\n   **Correct:**\n   ```yaml\n   markata-go:\n     title: \"My Site\"\n   ```\n\n   **Wrong - tabs instead of spaces:**\n   ```yaml\n   markata-go:\n   \ttitle: \"My Site\"  # Tab character\n   ```\n\n   **Correct:**\n   ```yaml\n   markata-go:\n     title: \"My Site\"  # Two spaces\n   ```\n\n4. Use an online validator:\n   - TOML: [toml-lint.com](https://www.toml-lint.com/)\n   - YAML: [yamllint.com](http://www.yamllint.com/)\n\n---\n\n### Unknown Configuration Options\n\n**Symptom:**\n```\nWarning: unknown configuration key: output-dir\n```\nOr a setting doesn't seem to take effect.\n\n**Cause:** Typo in configuration key or using the wrong format.\n\n**Solution:**\n\n1. Check for typos. Common mistakes:\n   - `output-dir` should be `output_dir`\n   - `templatesDir` should be `templates_dir`\n   - Keys are case-sensitive\n\n2. Verify the correct key names:\n   ```bash\n   markata-go config show\n   ```\n\n3. Reference the [[configuration-guide|Configuration Guide]] for the complete list of options.\n\n**Example of correct configuration:**\n```toml\n[markata-go]\noutput_dir = \"public\"      # Correct: underscore\ntemplates_dir = \"templates\"\nassets_dir = \"static\"\n```\n\n---\n\n### How to Validate Config\n\n**Solution:**\n\nRun the validation command:\n```bash\nmarkata-go config validate\n```\n\n**Example success output:**\n```\nConfiguration is valid\n```\n\n**Example error output:**\n```\nConfiguration errors:\n  - url: URL must include a scheme (e.g., https://)\n  - concurrency: must be \u003e= 0 (0 means auto-detect)\n\nConfiguration warnings:\n  - glob.patterns: no glob patterns specified, no files will be processed\n```\n\nTo see the fully resolved configuration:\n```bash\nmarkata-go config show\n```\n\nTo see a specific value:\n```bash\nmarkata-go config get output_dir\nmarkata-go config get glob.patterns\n```\n\n---\n\n## Content Issues\n\n### Invalid Frontmatter YAML\n\n**Symptom:**\n```\nError: failed to parse frontmatter in posts/my-post.md: yaml: line 5: could not find expected ':'\n```\n\n**Cause:** YAML syntax error in the frontmatter block.\n\n**Solution:**\n\n1. Check the frontmatter structure:\n   ```markdown\n   ---\n   title: \"My Post\"\n   date: 2024-01-15\n   tags:\n     - go\n     - tutorial\n   ---\n   ```\n\n2. Common frontmatter mistakes:\n\n   **Wrong - missing closing delimiter:**\n   ```markdown\n   ---\n   title: \"My Post\"\n\n   Content starts here...\n   ```\n\n   **Correct:**\n   ```markdown\n   ---\n   title: \"My Post\"\n   ---\n\n   Content starts here...\n   ```\n\n   **Wrong - invalid date format:**\n   ```markdown\n   ---\n   date: January 15, 2024\n   ---\n   ```\n\n   **Correct:**\n   ```markdown\n   ---\n   date: 2024-01-15\n   ---\n   ```\n\n   **Wrong - unquoted special characters:**\n   ```markdown\n   ---\n   title: My Post: A Guide\n   ---\n   ```\n\n   **Correct:**\n   ```markdown\n   ---\n   title: \"My Post: A Guide\"\n   ---\n   ```\n\n3. Validate YAML online at [yamllint.com](http://www.yamllint.com/)\n\nSee the [[frontmatter-guide|Frontmatter Guide]] for complete frontmatter documentation.\n\n---\n\n### Posts Not Appearing\n\n**Symptom:** You created a post but it doesn't appear on your site.\n\n**Cause:** Multiple possible causes:\n- Post not published\n- Filtered out by feed configuration\n- File not matched by glob patterns\n- File in .gitignore\n\n**Solution:**\n\n1. **Check if the post is published:**\n   ```markdown\n   ---\n   title: \"My Post\"\n   published: true    # Must be true\n   draft: false       # Should be false for production\n   ---\n   ```\n\n2. **Check your feed filter:**\n   ```toml\n   [[markata-go.feeds]]\n   slug = \"blog\"\n   filter = \"published == True\"  # Make sure your post matches\n   ```\n\n3. **Check glob patterns:**\n   ```toml\n   [markata-go.glob]\n   patterns = [\"posts/**/*.md\"]  # Does your file match this pattern?\n   ```\n\n4. **Check if the file is gitignored:**\n   ```bash\n   git check-ignore posts/my-post.md\n   # If it returns the filename, the file is ignored\n   ```\n\n5. **Run a verbose build to see what's being processed:**\n   ```bash\n   markata-go build -v\n   ```\n\n---\n\n### Drafts Showing in Production\n\n**Symptom:** Draft posts appear on the live site.\n\n**Cause:** Feed filters don't exclude drafts.\n\n**Solution:**\n\n1. Add draft filtering to your feed configuration:\n   ```toml\n   [[markata-go.feeds]]\n   slug = \"blog\"\n   filter = \"published == True and draft == False\"\n   ```\n\n2. Or filter only by published status (drafts should have `published: false`):\n   ```toml\n   [[markata-go.feeds]]\n   slug = \"blog\"\n   filter = \"published == True\"\n   ```\n\n3. Verify draft status in frontmatter:\n   ```markdown\n   ---\n   title: \"My Draft\"\n   published: false\n   draft: true\n   ---\n   ```\n\n---\n\n### Date Format Problems\n\n**Symptom:**\n```\nError: cannot parse \"January 15, 2024\" as \"2006-01-02\"\n```\nOr dates display incorrectly.\n\n**Cause:** Using an unsupported date format in frontmatter.\n\n**Solution:**\n\n1. Use ISO 8601 format (recommended):\n   ```yaml\n   date: 2024-01-15\n   ```\n\n2. Supported date formats:\n   ```yaml\n   date: 2024-01-15              # YYYY-MM-DD (recommended)\n   date: 2024-01-15T10:30:00     # With time\n   date: 2024-01-15T10:30:00Z    # With timezone\n   date: \"2024-01-15\"            # Quoted string\n   ```\n\n3. **NOT supported:**\n   ```yaml\n   date: January 15, 2024        # Wrong\n   date: 15/01/2024              # Wrong\n   date: 01-15-2024              # Wrong (MM-DD-YYYY)\n   ```\n\n---\n\n### Encoding Issues (UTF-8)\n\n**Symptom:**\n- Special characters display as `?` or garbled text\n- Build errors mentioning encoding\n\n**Cause:** File is not saved as UTF-8, or has a BOM (Byte Order Mark).\n\n**Solution:**\n\n1. **Check file encoding:**\n   ```bash\n   file -i posts/my-post.md\n   # Should show: text/plain; charset=utf-8\n   ```\n\n2. **Convert to UTF-8 (Linux/macOS):**\n   ```bash\n   iconv -f ISO-8859-1 -t UTF-8 posts/my-post.md -o posts/my-post-utf8.md\n   mv posts/my-post-utf8.md posts/my-post.md\n   ```\n\n3. **Remove BOM if present:**\n   ```bash\n   sed -i '1s/^\\xEF\\xBB\\xBF//' posts/my-post.md\n   ```\n\n4. **Configure your editor to use UTF-8:**\n   - VS Code: Bottom status bar shows encoding, click to change\n   - Vim: `:set encoding=utf-8`\n   - Ensure files are saved without BOM\n\n5. **Verify your HTML templates include charset:**\n   ```html\n   \u003cmeta charset=\"UTF-8\"\u003e\n   ```\n\n---\n\n## Build Issues\n\n### Empty Output Directory\n\n**Symptom:** After building, the output directory is empty or missing files.\n\n**Cause:** No files matched the glob patterns, or all posts are filtered out.\n\n**Solution:**\n\n1. **Check glob patterns match your files:**\n   ```toml\n   [markata-go.glob]\n   patterns = [\"posts/**/*.md\", \"pages/*.md\"]\n   ```\n\n2. **Verify files exist in the expected location:**\n   ```bash\n   ls -la posts/\n   ```\n\n3. **Check if files are being processed:**\n   ```bash\n   markata-go build -v\n   ```\n\n4. **Check feed filters aren't excluding everything:**\n   ```toml\n   [[markata-go.feeds]]\n   filter = \"published == True\"  # Do any posts have published: true?\n   ```\n\n5. **Do a dry run to see what would be built:**\n   ```bash\n   markata-go build --dry-run\n   ```\n\n---\n\n### Missing Templates\n\n**Symptom:**\n```\nError: template \"post.html\" not found\n```\nOr:\n```\nError: template \"custom-layout.html\" not found\n```\n\n**Cause:** Template file doesn't exist in the templates directory.\n\n**Solution:**\n\n1. **Check templates directory exists:**\n   ```bash\n   ls -la templates/\n   ```\n\n2. **Verify template filename matches what's specified:**\n   ```yaml\n   # In frontmatter\n   template: \"post.html\"  # Must exist as templates/post.html\n   ```\n\n3. **Create missing templates or use defaults:**\n   ```bash\n   # Create a minimal post template\n   mkdir -p templates\n   cat \u003e templates/post.html \u003c\u003c 'EOF'\n   {% extends \"base.html\" %}\n   {% block content %}\n   \u003carticle\u003e\n     \u003ch1\u003e{{ post.Title }}\u003c/h1\u003e\n     {{ body|safe }}\n   \u003c/article\u003e\n   {% endblock %}\n   EOF\n   ```\n\n4. **Check templates_dir configuration:**\n   ```toml\n   [markata-go]\n   templates_dir = \"templates\"  # Must match your directory\n   ```\n\nSee the [[templates-guide|Templates Guide]] for template setup.\n\n---\n\n### Template Errors\n\n**Symptom:**\n```\nError: template error in post.html: unexpected tag \"endif\"\n```\nOr:\n```\nError: template error: variable \"post.title\" not found\n```\n\n**Cause:** Syntax error in template or incorrect variable access.\n\n**Solution:**\n\n1. **Check template syntax:**\n\n   **Wrong - mismatched tags:**\n   ```html\n   {% if post.Tags %}\n   \u003cul\u003e...\u003c/ul\u003e\n   {% end %}  \u003c!-- Wrong --\u003e\n   ```\n\n   **Correct:**\n   ```html\n   {% if post.Tags %}\n   \u003cul\u003e...\u003c/ul\u003e\n   {% endif %}\n   ```\n\n2. **Check variable names are correct (case-sensitive):**\n\n   **Wrong:**\n   ```html\n   {{ post.title }}  \u003c!-- Wrong case --\u003e\n   ```\n\n   **Correct:**\n   ```html\n   {{ post.Title }}  \u003c!-- Correct --\u003e\n   ```\n\n3. **Use safe filter for HTML content:**\n   ```html\n   {{ body|safe }}\n   {{ post.ArticleHTML|safe }}\n   ```\n\n4. **Handle missing values:**\n   ```html\n   {{ post.Description|default_if_none:\"No description\" }}\n   ```\n\n**Common template variables:**\n| Variable | Description |\n|----------|-------------|\n| `post.Title` | Post title |\n| `post.Slug` | URL slug |\n| `post.Href` | Relative URL path |\n| `post.Date` | Publication date |\n| `post.Tags` | List of tags |\n| `post.ArticleHTML` | Rendered HTML content |\n| `body` | Alias for ArticleHTML |\n| `config.Title` | Site title |\n| `config.URL` | Site URL |\n\n---\n\n### Slow Builds\n\n**Symptom:** Build takes much longer than expected.\n\n**Cause:** Too many files, inefficient configuration, or resource constraints.\n\n**Solution:**\n\n1. **Increase concurrency:**\n   ```toml\n   [markata-go]\n   concurrency = 8  # Adjust based on CPU cores\n   ```\n\n2. **Narrow glob patterns:**\n   ```toml\n   [markata-go.glob]\n   # Instead of:\n   # patterns = [\"**/*.md\"]\n\n   # Be more specific:\n   patterns = [\"posts/*.md\", \"pages/*.md\"]\n   ```\n\n3. **Enable gitignore filtering:**\n   ```toml\n   [markata-go.glob]\n   use_gitignore = true\n   ```\n\n4. **Profile the build:**\n   ```bash\n   time markata-go build -v\n   ```\n\n5. **Check for large files or images in content directories:**\n   ```bash\n   find posts/ -type f -size +1M\n   ```\n\n---\n\n## Feed Issues\n\n### RSS/Atom Not Generating\n\n**Symptom:** No `rss.xml` or `atom.xml` files in the output.\n\n**Cause:** Feed formats are not enabled in configuration.\n\n**Solution:**\n\n1. **Enable RSS/Atom formats:**\n   ```toml\n   [[markata-go.feeds]]\n   slug = \"blog\"\n   title = \"Blog\"\n   filter = \"published == True\"\n\n   [markata-go.feeds.formats]\n   html = true\n   rss = true\n   atom = true\n   ```\n\n2. **Or set defaults for all feeds:**\n   ```toml\n   [markata-go.feed_defaults.formats]\n   html = true\n   rss = true\n   atom = true\n   ```\n\n3. **Verify the feed is being generated:**\n   ```bash\n   markata-go build -v\n   ls -la output/blog/rss.xml output/blog/atom.xml\n   ```\n\nSee the [[feeds-guide|Feeds Guide]] for detailed feed configuration.\n\n---\n\n### Empty Feeds\n\n**Symptom:** RSS/Atom files are generated but contain no items.\n\n**Cause:** No posts match the feed filter, or posts lack required fields.\n\n**Solution:**\n\n1. **Check feed filter matches posts:**\n   ```toml\n   [[markata-go.feeds]]\n   slug = \"blog\"\n   filter = \"published == True\"  # Do posts have published: true?\n   ```\n\n2. **Verify posts have required frontmatter:**\n   ```yaml\n   ---\n   title: \"My Post\"        # Required for feed items\n   date: 2024-01-15        # Required for feed ordering\n   published: true         # Required to match filter\n   ---\n   ```\n\n3. **Check syndication settings:**\n   ```toml\n   [markata-go.feed_defaults.syndication]\n   max_items = 20          # Not set to 0\n   ```\n\n4. **Debug by removing the filter temporarily:**\n   ```toml\n   [[markata-go.feeds]]\n   slug = \"debug\"\n   filter = \"\"  # No filter - should include all posts\n   ```\n\n---\n\n### Missing Site URL\n\n**Symptom:**\n- Feed URLs show as relative paths or empty\n- Feed validators report \"missing link\" errors\n- Social sharing doesn't work\n\n**Cause:** The `url` configuration is not set.\n\n**Solution:**\n\n1. **Set the site URL in configuration:**\n   ```toml\n   [markata-go]\n   url = \"https://example.com\"\n   ```\n\n2. **Or set via environment variable:**\n   ```bash\n   MARKATA_GO_URL=https://example.com markata-go build\n   ```\n\n3. **Verify the URL is set:**\n   ```bash\n   markata-go config get url\n   ```\n\n---\n\n### Feed Validation Errors\n\n**Symptom:** Feed validators report errors like:\n- \"Missing required element\"\n- \"Invalid date format\"\n- \"URL must be absolute\"\n\n**Cause:** Missing configuration or invalid content.\n\n**Solution:**\n\n1. **Ensure site URL is set (required for valid feeds):**\n   ```toml\n   [markata-go]\n   url = \"https://example.com\"\n   ```\n\n2. **Ensure all posts have dates:**\n   ```yaml\n   ---\n   date: 2024-01-15\n   ---\n   ```\n\n3. **Validate generated feeds:**\n   ```bash\n   # RSS\n   xmllint --noout output/blog/rss.xml\n\n   # Atom  \n   xmllint --noout output/blog/atom.xml\n   ```\n\n4. **Use online validators:**\n   - [W3C Feed Validator](https://validator.w3.org/feed/)\n   - [Feed Validator](https://www.feedvalidator.org/)\n\n5. **Check feed templates if using custom ones:**\n   ```toml\n   [markata-go.feed_defaults.templates]\n   rss = \"rss.xml\"\n   atom = \"atom.xml\"\n   ```\n\n---\n\n## Serve Issues\n\n### Port Already in Use\n\n**Symptom:**\n```\nError: listen tcp :8000: bind: address already in use\n```\n\n**Cause:** Another process is using port 8000.\n\n**Solution:**\n\n1. **Use a different port:**\n   ```bash\n   markata-go serve -p 3000\n   markata-go serve -p 8080\n   ```\n\n2. **Find what's using the port:**\n   ```bash\n   # Linux/macOS\n   lsof -i :8000\n\n   # Windows\n   netstat -ano | findstr :8000\n   ```\n\n3. **Kill the process using the port:**\n   ```bash\n   # Linux/macOS\n   kill $(lsof -t -i :8000)\n\n   # Or force kill\n   kill -9 $(lsof -t -i :8000)\n   ```\n\n---\n\n### Live Reload Not Working\n\n**Symptom:** Changes to files don't trigger a browser refresh.\n\n**Cause:** File watcher not detecting changes, or browser cache.\n\n**Solution:**\n\n1. **Ensure file watching is enabled (default):**\n   ```bash\n   markata-go serve  # Watching is on by default\n\n   # NOT this:\n   markata-go serve --no-watch  # This disables watching\n   ```\n\n2. **Check for file system notification limits (Linux):**\n   ```bash\n   # Check current limit\n   cat /proc/sys/fs/inotify/max_user_watches\n\n   # Increase if needed\n   echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf\n   sudo sysctl -p\n   ```\n\n3. **Hard refresh your browser:**\n   - Chrome/Firefox: `Ctrl+Shift+R` (Windows/Linux) or `Cmd+Shift+R` (Mac)\n   - Or open in incognito/private mode\n\n4. **Check the terminal for rebuild messages:**\n   - The server should show \"Rebuilding...\" when files change\n   - If not, the file watcher isn't detecting changes\n\n5. **Try verbose mode:**\n   ```bash\n   markata-go serve -v\n   ```\n\n---\n\n### Changes Not Reflecting\n\n**Symptom:** You made changes but the browser shows old content.\n\n**Cause:** Browser caching, or changes to files outside watched directories.\n\n**Solution:**\n\n1. **Hard refresh the browser:**\n   - `Ctrl+Shift+R` or `Cmd+Shift+R`\n\n2. **Clear browser cache:**\n   - Developer Tools \u003e Application \u003e Clear Storage\n\n3. **Verify the file is in a watched directory:**\n   - Files must match glob patterns to be watched\n   - Check `patterns` in your config\n\n4. **Rebuild manually if needed:**\n   ```bash\n   # Stop the server and rebuild\n   markata-go build --clean\n   markata-go serve\n   ```\n\n5. **Check file permissions:**\n   ```bash\n   ls -la posts/my-post.md\n   # Ensure the file is readable\n   ```\n\n---\n\n## Deployment Issues\n\n### 404 Errors\n\n**Symptom:** Pages return 404 Not Found after deployment.\n\n**Cause:** Wrong base URL, incorrect paths, or server configuration.\n\n**Solution:**\n\n1. **Check base URL matches deployment:**\n   ```toml\n   [markata-go]\n   url = \"https://yourdomain.com\"  # Must match exactly\n   ```\n\n2. **For GitHub Pages with repo subdirectory:**\n   ```toml\n   # If deployed to https://username.github.io/repo-name/\n   [markata-go]\n   url = \"https://username.github.io/repo-name\"\n   ```\n\n3. **Verify files exist in output:**\n   ```bash\n   ls -la output/\n   ls -la output/my-post/index.html\n   ```\n\n4. **Check server is configured for clean URLs:**\n   - Ensure `/my-post/` serves `/my-post/index.html`\n   - Most static hosts handle this automatically\n\n5. **For custom servers (nginx), ensure proper config:**\n   ```nginx\n   location / {\n       try_files $uri $uri/ =404;\n   }\n   ```\n\n---\n\n### Broken Links\n\n**Symptom:** Links on the site lead to 404 pages.\n\n**Cause:** Internal links are incorrect or posts have moved/been deleted.\n\n**Solution:**\n\n1. **Validate links before deploying:**\n   ```bash\n   # Install linkinator\n   npm install -g linkinator\n\n   # Check for broken links\n   linkinator output --recurse\n   ```\n\n2. **Check wikilinks are correct:**\n   ```markdown\n   [[other-post]]           # Must match a slug exactly\n   [[other-post|Link Text]] # Custom link text\n   ```\n\n3. **Verify slug values:**\n   ```yaml\n   ---\n   slug: \"my-post\"  # Links should reference this exact slug\n   ---\n   ```\n\n4. **Add redirects for moved content:**\n\n   **Netlify (_redirects or netlify.toml):**\n   ```\n   /old-post  /new-post  301\n   ```\n\n   **Vercel (vercel.json):**\n   ```json\n   {\n     \"redirects\": [\n       { \"source\": \"/old-post\", \"destination\": \"/new-post\", \"permanent\": true }\n     ]\n   }\n   ```\n\n---\n\n### Missing Assets\n\n**Symptom:** CSS, JavaScript, or images don't load.\n\n**Cause:** Assets not copied to output, wrong paths, or base URL issues.\n\n**Solution:**\n\n1. **Check assets_dir is configured:**\n   ```toml\n   [markata-go]\n   assets_dir = \"static\"\n   ```\n\n2. **Verify assets are in the correct directory:**\n   ```bash\n   ls -la static/\n   # Should contain css/, js/, images/, etc.\n   ```\n\n3. **Check assets were copied to output:**\n   ```bash\n   ls -la output/static/\n   # or\n   ls -la output/css/\n   ```\n\n4. **Use correct paths in templates:**\n   ```html\n   \u003c!-- Absolute path (recommended) --\u003e\n   \u003clink rel=\"stylesheet\" href=\"/css/style.css\"\u003e\n\n   \u003c!-- NOT relative --\u003e\n   \u003clink rel=\"stylesheet\" href=\"css/style.css\"\u003e  \u003c!-- May break on subpages --\u003e\n   ```\n\n5. **For GitHub Pages subdirectory deployment:**\n   ```html\n   \u003c!-- If deployed to /repo-name/ --\u003e\n   \u003clink rel=\"stylesheet\" href=\"/repo-name/css/style.css\"\u003e\n   ```\n\n---\n\n### Wrong Base URL\n\n**Symptom:**\n- Absolute URLs point to wrong domain\n- RSS/Atom feeds have incorrect links\n- Social sharing shows wrong URLs\n\n**Cause:** The `url` config doesn't match the deployment URL.\n\n**Solution:**\n\n1. **Set the correct URL for each environment:**\n\n   **Production (config file):**\n   ```toml\n   [markata-go]\n   url = \"https://example.com\"\n   ```\n\n   **Staging (environment variable):**\n   ```bash\n   MARKATA_GO_URL=https://staging.example.com markata-go build\n   ```\n\n2. **For different deployment environments, use CI/CD variables:**\n\n   **GitHub Actions:**\n   ```yaml\n   - name: Build\n     run: markata-go build\n     env:\n       MARKATA_GO_URL: ${{ vars.SITE_URL }}\n   ```\n\n   **Netlify:**\n   ```toml\n   [context.production.environment]\n   MARKATA_GO_URL = \"https://example.com\"\n\n   [context.deploy-preview.environment]\n   MARKATA_GO_URL = \"\"  # Use relative URLs for previews\n   ```\n\n3. **Verify the URL is correct:**\n   ```bash\n   markata-go config get url\n   ```\n\n---\n\n## Plugin Issues\n\n### Plugin Not Loading\n\n**Symptom:**\n- Plugin features don't work\n- Warning about unknown plugin name\n\n**Cause:** Plugin not registered, typo in name, or disabled.\n\n**Solution:**\n\n1. **Check hooks configuration:**\n   ```toml\n   [markata-go]\n   hooks = [\"default\"]  # Loads all default plugins\n   ```\n\n2. **Check disabled_hooks doesn't include your plugin:**\n   ```toml\n   [markata-go]\n   disabled_hooks = []  # Make sure it's not listed here\n   ```\n\n3. **Verify the plugin name against the [[built-in-plugins|Plugin Reference]].**\n\n4. **For custom plugins, ensure they're registered properly:**\n   - See the [[plugin-development|Plugin Development Guide]]\n\n---\n\n### Plugin Errors\n\n**Symptom:**\n```\nError: plugin \"my_plugin\" failed: \u003cspecific error message\u003e\n```\n\n**Cause:** Plugin-specific issue, usually configuration or data related.\n\n**Solution:**\n\n1. **Check plugin configuration:**\n   ```toml\n   [markata-go]\n   # Plugin-specific options go under the main namespace\n   my_plugin_option = \"value\"\n   ```\n\n2. **Enable verbose output to see detailed errors:**\n   ```bash\n   markata-go build -v\n   ```\n\n3. **Check posts have required fields for the plugin:**\n   - Reading time plugin needs content\n   - Feed plugins need dates for sorting\n\n4. **Review the plugin documentation for requirements**\n\n5. **Try disabling the plugin to isolate the issue:**\n   ```toml\n   [markata-go]\n   disabled_hooks = [\"my_plugin\"]\n   ```\n\n---\n\n## Getting Help\n\nIf you can't resolve your issue with this guide:\n\n1. **Check existing issues:**\n   - [GitHub Issues](https://github.com/WaylonWalker/markata-go/issues)\n\n2. **Search the documentation:**\n   - [[getting-started|Getting Started]]\n   - [[configuration-guide|Configuration Guide]]\n   - [[feeds-guide|Feeds Guide]]\n   - [[templates-guide|Templates Guide]]\n\n3. **Create a minimal reproduction:**\n   - Create the smallest possible project that shows the issue\n   - Include your config file and a sample post\n\n4. **Open a new issue with:**\n   - markata-go version (`markata-go --version`)\n   - Go version (`go version`)\n   - Operating system\n   - Full error message\n   - Steps to reproduce\n   - Relevant configuration\n\n5. **Use verbose mode when reporting issues:**\n   ```bash\n   markata-go build -v 2\u003e\u00261 | tee build-output.txt\n   ```\n\n---\n\n## Quick Reference: Common Commands\n\n```bash\n# Validate configuration\nmarkata-go config validate\n\n# Show resolved configuration\nmarkata-go config show\n\n# Get a specific config value\nmarkata-go config get url\n\n# Build with verbose output\nmarkata-go build -v\n\n# Dry run (preview without writing)\nmarkata-go build --dry-run\n\n# Clean build\nmarkata-go build --clean\n\n# Serve on a different port\nmarkata-go serve -p 3000\n\n# Create a new post\nmarkata-go new \"My Post Title\"\n\n# Check version\nmarkata-go --version\n```\n\n## Agent-assisted troubleshooting\n\nRun `markata triage` to prepare a diagnostic prompt and choose an installed coding agent, clipboard, or stdout. See the [triage guide](/docs/guides/triage/).\n",
      "summary": "Solutions for common issues when working with markata-go",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "troubleshooting"
      ]
    },
    {
      "id": "https://markata.dev/docs/reference/plugins/",
      "url": "https://markata.dev/docs/reference/plugins/",
      "title": "Built-in Plugins",
      "content_html": "\u003ch2 id=\"built-in-plugins-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuilt-in Plugins Reference\u003c/span\u003e \u003ca href=\"#built-in-plugins-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis reference documents all built-in plugins that ship with markata-go. Plugins are organized by their lifecycle stage.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRelated guides:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e[[plugin-development|Plugin Development]] - Create your own plugins\u003c/li\u003e\n\u003cli\u003e[[configuration-guide|Configuration]] - Configure plugins\u003c/li\u003e\n\u003cli\u003e[[feeds-guide|Feeds]] - Feed plugins in detail\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"plugin-lifecycle-overview\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlugin Lifecycle Overview\u003c/span\u003e \u003ca href=\"#plugin-lifecycle-overview\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eConfigure -\u0026gt; Glob -\u0026gt; Load -\u0026gt; Transform -\u0026gt; Render -\u0026gt; Collect -\u0026gt; Write -\u0026gt; Cleanup\n\u003c/code\u003e\u003c/pre\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eStage\u003c/th\u003e\n\u003cth\u003ePurpose\u003c/th\u003e\n\u003cth\u003eExample Plugins\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eConfigure\u003c/td\u003e\n\u003ctd\u003eInitialize plugin settings\u003c/td\u003e\n\u003ctd\u003etemplates\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGlob\u003c/td\u003e\n\u003ctd\u003eDiscover content files\u003c/td\u003e\n\u003ctd\u003eglob\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLoad\u003c/td\u003e\n\u003ctd\u003eParse files into posts\u003c/td\u003e\n\u003ctd\u003eload, frontmatter\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTransform\u003c/td\u003e\n\u003ctd\u003ePre-render modifications\u003c/td\u003e\n\u003ctd\u003edescription, reading_time, stats, breadcrumbs, jinja_md, wikilinks, toc\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRender\u003c/td\u003e\n\u003ctd\u003eConvert content to HTML\u003c/td\u003e\n\u003ctd\u003erender_markdown, templates, admonitions, heading_anchors, link_collector, mermaid, glossary, csv_fence, youtube, webawesome\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eConfigure\u003c/td\u003e\n\u003ctd\u003eBuild-time tooling\u003c/td\u003e\n\u003ctd\u003etailwind, cdn_assets, pagefind\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCollect\u003c/td\u003e\n\u003ctd\u003eBuild collections/feeds\u003c/td\u003e\n\u003ctd\u003eseries, feeds, auto_feeds, prevnext, overwrite_check, static_file_conflicts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWrite\u003c/td\u003e\n\u003ctd\u003eOutput files to disk\u003c/td\u003e\n\u003ctd\u003epublish_html, random_post, publish_feeds, sitemap, content_index, images, rss, atom, jsonfeed, static_assets, redirects\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCleanup\u003c/td\u003e\n\u003ctd\u003ePost-build tasks\u003c/td\u003e\n\u003ctd\u003epagefind, diagnostics_artifact\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch3 id=\"icons\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eicons\u003c/span\u003e \u003ca href=\"#icons\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eicons\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Transform (after other source transforms, before Markdown rendering)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Resolve Zensical-style SVG shortcodes in Markdown.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eA release :lucide-rocket: ready to ship.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe icon is inlined as decorative SVG, with no icon-font or client-side\ndependency. The default pinned Lucide pack is vendored on first use, with\nproject-local SVGs under \u003ccode\u003e.icons/\u003c/code\u003e or \u003ccode\u003estatic/.icons/\u003c/code\u003e taking precedence.\nFor disconnected first-use builds, supply a cached/local pack or keep the\nliteral shortcode; there is no forced network request in offline mode.\u003c/p\u003e\n\u003cp\u003eThe default theme supports \u003ccode\u003emd-icon\u003c/code\u003e inside cards and \u003ccode\u003emd-feature\u003c/code\u003e with\n\u003ccode\u003emd-feature-icon\u003c/code\u003e/\u003ccode\u003emd-feature-body\u003c/code\u003e for icon-first feature rows, without\nchanging shortcode semantics. See \u003ca href=\"/docs/guides/icons/\"\u003eIcon Shortcodes\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"content_index\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003econtent_index\u003c/span\u003e \u003ca href=\"#content_index\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003econtent_index\u003c/code\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Write\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Writes an optional, compact, versioned JSON artifact containing\nresolved document metadata and feed membership. Private documents are included\nas safe metadata-only records.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent_index\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;content-index.json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eschema_version\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe output is disabled by default. Relative paths are below \u003ccode\u003eoutput_dir\u003c/code\u003e.\nV2 is the default and includes non-draft, non-skipped documents, including\nprivate documents as safe metadata-only records. Private titles and\ndescriptions are included only when explicitly authored; bodies, rendered HTML,\nencryption keys, private media, and derived biographies are excluded. Set\n\u003ccode\u003eschema_version = 1\u003c/code\u003e for the released public-only compatibility format. See the\n\u003ca href=\"/docs/guides/content-index/\"\u003eContent Index guide\u003c/a\u003e for the parser and\ncompatibility contract.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"images\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eimages\u003c/span\u003e \u003ca href=\"#images\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eimages\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Write\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Builds a public image and video inventory and a searchable authoring page.\u003c/p\u003e\n\u003cp\u003eThe plugin is enabled by default. It writes \u003ccode\u003eimages/index.html\u003c/code\u003e,\n\u003ccode\u003eimages/index.json\u003c/code\u003e, and the root-level \u003ccode\u003eimages.json\u003c/code\u003e below \u003ccode\u003eoutput_dir\u003c/code\u003e. See\nthe \u003ca href=\"/docs/guides/image-library/\"\u003eImage Library guide\u003c/a\u003e for configuration,\ndiscovery rules, and the template context.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eimages\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epath\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;images\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;images.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexport_json\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_unreferenced\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe inventory contains image metadata and public usage relationships. Usage\nrelationships include normalized figure captions when the source appears in a\n\u003ccode\u003e\u0026lt;figure\u0026gt;\u003c/code\u003e. Draft, private, skipped, and unpublished posts do not create usage\nrelationships. Private bodies are never scanned; only a published private\npost\u0026rsquo;s public-safe \u003ccode\u003ecover\u003c/code\u003e and \u003ccode\u003ecover_alt\u003c/code\u003e frontmatter may add a metadata-only\nrecord. Remote images are recorded without network requests. Trusted Dropper\nhosts use resized URLs only for page previews; canonical sources remain\nunchanged. Set \u003ccode\u003einclude_unreferenced = true\u003c/code\u003e explicitly when a local authoring\ninventory should enumerate every supported asset below \u003ccode\u003eassets_dir\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"glob-stage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGlob Stage\u003c/span\u003e \u003ca href=\"#glob-stage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"glob\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eglob\u003c/span\u003e \u003ca href=\"#glob\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eglob\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Glob\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Discovers content files using configurable glob patterns with gitignore support.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eglob_patterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Patterns to match\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003euse_gitignore\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Respect .gitignore patterns\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eMatches files against configured glob patterns (supports \u003ccode\u003e**\u003c/code\u003e recursive matching)\u003c/li\u003e\n\u003cli\u003eExcludes files matching \u003ccode\u003e.gitignore\u003c/code\u003e patterns if enabled\u003c/li\u003e\n\u003cli\u003eDeduplicates files matched by multiple patterns\u003c/li\u003e\n\u003cli\u003eReturns sorted list for deterministic builds\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eExample:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eglob_patterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;posts/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;pages/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;docs/**/*.md\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003euse_gitignore\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"load-stage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLoad Stage\u003c/span\u003e \u003ca href=\"#load-stage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"load\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eload\u003c/span\u003e \u003ca href=\"#load\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eload\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Load\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Reads discovered files and parses them into Post objects with frontmatter and content.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration:\u003c/strong\u003e Uses \u003ccode\u003e[markata-go.glob]\u003c/code\u003e for discovery and default slug behavior\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eReads each file as UTF-8\u003c/li\u003e\n\u003cli\u003eExtracts YAML frontmatter between \u003ccode\u003e---\u003c/code\u003e delimiters\u003c/li\u003e\n\u003cli\u003eCreates Post object with parsed metadata and content\u003c/li\u003e\n\u003cli\u003eGenerates slug from frontmatter or the configured slug mode (\u003ccode\u003eflat\u003c/code\u003e filename-based by default, optional \u003ccode\u003epath\u003c/code\u003e mode for nested content)\u003c/li\u003e\n\u003cli\u003eGenerates href as \u003ccode\u003e/{slug}/\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003ePost fields set:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epath\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSource file path\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econtent\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRaw markdown content (after frontmatter)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eslug\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eURL-friendly identifier\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehref\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eURL path (\u003ccode\u003e/{slug}/\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e*string\u003c/td\u003e\n\u003ctd\u003eFrom frontmatter\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edate\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e*time.Time\u003c/td\u003e\n\u003ctd\u003eFrom frontmatter\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epublished\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eFrom frontmatter (default: false)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edraft\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eFrom frontmatter (default: false)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eskip\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eFrom frontmatter (default: false)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003eFrom frontmatter\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edescription\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e*string\u003c/td\u003e\n\u003ctd\u003eFrom frontmatter\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etemplate\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eTemplate name from frontmatter\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eSupported date formats:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRFC3339: \u003ccode\u003e2024-01-15T10:30:00Z\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eISO datetime: \u003ccode\u003e2024-01-15T10:30:00\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eISO datetime with space: \u003ccode\u003e2024-01-15 10:30:00\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eISO date: \u003ccode\u003e2024-01-15\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUS format: \u003ccode\u003e01/15/2024\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eEuropean format: \u003ccode\u003e15-01-2024\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eLong format: \u003ccode\u003eJanuary 15, 2024\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eShort format: \u003ccode\u003eJan 15, 2024\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"python_docs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003epython_docs\u003c/span\u003e \u003ca href=\"#python_docs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003epython_docs\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Load\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Generates documentation posts directly from Python source files by extracting module, class, function, and method docstrings.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eStatus:\u003c/strong\u003e Built-in and disabled by default. It only runs when \u003ccode\u003epython_docs\u003c/code\u003e is listed in \u003ccode\u003ehooks\u003c/code\u003e and \u003ccode\u003e[markata-go.python_docs].enabled = true\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehooks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;python_docs\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epython_docs\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;src/**/*.py\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pkg/**/*.py\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug_prefix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;api\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docs\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_source\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_module_code\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epublished\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eDiscovers Python files using its own glob patterns so normal markdown content loading is unchanged.\u003c/li\u003e\n\u003cli\u003eParses source with Python\u0026rsquo;s AST via \u003ccode\u003epython3\u003c/code\u003e/\u003ccode\u003epython\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eCreates one post per module, with slug based on the module path.\u003c/li\u003e\n\u003cli\u003eRenders module docstrings as markdown and adds sections for classes, functions, and methods.\u003c/li\u003e\n\u003cli\u003eIncludes signatures, docstrings, collapsible implementation snippets, and import lists.\u003c/li\u003e\n\u003cli\u003eAdds internal links when imported modules or referenced symbols are also documented.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eGenerated post fields:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eextra.python_docs\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eAlways \u003ccode\u003etrue\u003c/code\u003e for generated source docs\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eextra.python_module\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eCanonical module name, e.g. \u003ccode\u003epkg.util\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eextra.source_path\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRelative source path\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eNotes:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003epython_docs\u003c/code\u003e must be explicitly listed in \u003ccode\u003e[markata-go].hooks\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eGenerated docs are unpublished by default, so they render as shadow pages unless \u003ccode\u003epublished = true\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003ePrivate \u003ccode\u003e_symbols\u003c/code\u003e are excluded unless \u003ccode\u003einclude_private = true\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eThis plugin is useful for API reference sites that want source-backed docs inside the normal markata-go template pipeline.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"frontmatter\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003efrontmatter\u003c/span\u003e \u003ca href=\"#frontmatter\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003efrontmatter\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Load (utility)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Parses YAML frontmatter from markdown files. Used internally by the \u003ccode\u003eload\u003c/code\u003e plugin.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eExtracts content between \u003ccode\u003e---\u003c/code\u003e delimiters\u003c/li\u003e\n\u003cli\u003eParses YAML into a map\u003c/li\u003e\n\u003cli\u003eHandles edge cases: no frontmatter, empty frontmatter, unclosed delimiters\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eExample frontmatter:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eMy Post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ego\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003eprogramming\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eA short description\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epost.html\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecustom_field\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecustom value\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"transform-stage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTransform Stage\u003c/span\u003e \u003ca href=\"#transform-stage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"auto_title\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eauto_title\u003c/span\u003e \u003ca href=\"#auto_title\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eauto_title\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Transform (first priority)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Auto-generates human-readable titles for posts that don\u0026rsquo;t have one by deriving them from filenames.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration:\u003c/strong\u003e None required.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eRuns with highest priority in Transform stage (before other transform plugins)\u003c/li\u003e\n\u003cli\u003eSkips posts that already have a title set\u003c/li\u003e\n\u003cli\u003eExtracts the filename without extension\u003c/li\u003e\n\u003cli\u003eReplaces hyphens and underscores with spaces\u003c/li\u003e\n\u003cli\u003eApplies title case (first letter of each word capitalized)\u003c/li\u003e\n\u003cli\u003eSets \u003ccode\u003epost.Title\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003ePost fields set:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e*string\u003c/td\u003e\n\u003ctd\u003eGenerated title (if not already set)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eExample transformations:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFilename\u003c/th\u003e\n\u003cth\u003eGenerated Title\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emy-first-post.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u0026ldquo;My First Post\u0026rdquo;\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egetting_started_guide.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u0026ldquo;Getting Started Guide\u0026rdquo;\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehello-world.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u0026ldquo;Hello World\u0026rdquo;\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e2024-01-15-release-notes.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u0026ldquo;2024 01 15 Release Notes\u0026rdquo;\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eWhen to use:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFor quick drafts where you want titles auto-derived\u003c/li\u003e\n\u003cli\u003eWhen filenames already describe the content well\u003c/li\u003e\n\u003cli\u003eFor sites with many posts where manual titling is tedious\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eLimitations:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDoes not extract titles from H1 headings in content (only uses filename)\u003c/li\u003e\n\u003cli\u003eNumeric prefixes in filenames (like dates) become part of the title\u003c/li\u003e\n\u003cli\u003eSpecial characters are kept as-is (not removed or transformed)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"description\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003edescription\u003c/span\u003e \u003ca href=\"#description\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003edescription\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Transform\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Auto-generates meta descriptions for posts that don\u0026rsquo;t have one by extracting the first paragraph.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription_max_length\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e160\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Maximum characters (default: 160)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eSkips posts that already have a description\u003c/li\u003e\n\u003cli\u003eExtracts first paragraph from content\u003c/li\u003e\n\u003cli\u003eStrips markdown formatting (links, images, code, emphasis, headers, HTML)\u003c/li\u003e\n\u003cli\u003eTruncates at word boundary with ellipsis\u003c/li\u003e\n\u003cli\u003eSets \u003ccode\u003epost.Description\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003ePost fields set:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edescription\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e*string\u003c/td\u003e\n\u003ctd\u003eGenerated description (if not already set)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eExample:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eMy Post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# No description - will be auto-generated\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis is my first paragraph that will become the description.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eIt continues here but will be truncated at 160 characters...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Second Section\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMore content here.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"reading_time\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ereading_time\u003c/span\u003e \u003ca href=\"#reading_time\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003ereading_time\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Transform\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Calculates the public word count and estimated reading time for each post.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewords_per_minute\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e200\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Average reading speed (default: 200)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003ereading_time\u003c/code\u003e reads \u003ccode\u003ewords_per_minute\u003c/code\u003e from the top-level \u003ccode\u003emarkata-go\u003c/code\u003e section.\n\u003ccode\u003ereading_time\u003c/code\u003e always excludes code. It shares its word-count and reading-time\ncalculator with the \u003ccode\u003estats\u003c/code\u003e plugin, but the two plugins keep separate\nconfiguration contracts.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCounts words in content (excludes code blocks, URLs, HTML)\u003c/li\u003e\n\u003cli\u003eCalculates reading time based on words per minute\u003c/li\u003e\n\u003cli\u003eRounds up to nearest minute (minimum 1 minute)\u003c/li\u003e\n\u003cli\u003eStores the public results in the post\u0026rsquo;s Extra map\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003ePost fields added (in \u003ccode\u003eExtra\u003c/code\u003e):\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eword_count\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eNumber of words\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ereading_time\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eMinutes to read\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ereading_time_text\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eFormatted string (e.g., \u0026ldquo;5 min read\u0026rdquo;)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eTemplate usage:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reading-time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Extra.reading_time_text }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;word-count\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Extra.word_count }} words\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"stats\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003estats\u003c/span\u003e \u003ca href=\"#stats\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003estats\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Transform, Collect\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Calculates comprehensive content statistics for posts and aggregates them at feed and site levels.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewords_per_minute\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e200\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Average reading speed (default: 200)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_code_in_count\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Include code blocks in word count (default: false)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etrack_code_blocks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Count lines of code in code blocks (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen both the top-level \u003ccode\u003ewords_per_minute\u003c/code\u003e value and the nested Stats value exist, the top-level value takes precedence.\nStats uses the nested value when the top-level compatibility value is absent.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003ereading_time\u003c/code\u003e and \u003ccode\u003estats\u003c/code\u003e plugins share one word-count, reading-time,\nand formatted-text calculator. Their configuration remains separate: in a\nnormal default build, \u003ccode\u003estats\u003c/code\u003e calculates and stores its own \u003ccode\u003ePostStats\u003c/code\u003e during\nthe early Transform stage, and \u003ccode\u003ereading_time\u003c/code\u003e later writes the public\n\u003ccode\u003eword_count\u003c/code\u003e, \u003ccode\u003ereading_time\u003c/code\u003e, and \u003ccode\u003ereading_time_text\u003c/code\u003e fields.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eTransform stage:\u003c/strong\u003e Calculates per-post statistics\n\u003cul\u003e\n\u003cli\u003eCalculates Stats\u0026rsquo; own \u003ccode\u003ePostStats\u003c/code\u003e using the Stats configuration\u003c/li\u003e\n\u003cli\u003eWrites the same reading-time fields when \u003ccode\u003estats\u003c/code\u003e runs alone\u003c/li\u003e\n\u003cli\u003eCharacter count (letters and digits only)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCollect stage:\u003c/strong\u003e Aggregates statistics\n\u003cul\u003e\n\u003cli\u003ePer-feed totals and averages derived from \u003ccode\u003ePostStats\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eSite-wide totals and averages derived from \u003ccode\u003ePostStats\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003ccode\u003einclude_code_in_count\u003c/code\u003e applies to Stats\u0026rsquo; \u003ccode\u003ePostStats\u003c/code\u003e and its feed/site\naggregates, including a normal default build. It does not change the public\nfields written by \u003ccode\u003ereading_time\u003c/code\u003e.\n\u003ccode\u003etrack_code_blocks\u003c/code\u003e controls the Stats code metrics independently. When it is\nfalse, \u003ccode\u003ePostStats.CodeBlocks\u003c/code\u003e and \u003ccode\u003ePostStats.CodeLines\u003c/code\u003e, and their feed/site\naggregate totals, are zero.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePost fields exposed (in \u003ccode\u003eExtra\u003c/code\u003e):\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eword_count\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eNumber of words\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003echar_count\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eNumber of characters (no whitespace)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ereading_time\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eMinutes to read\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ereading_time_text\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eFormatted (e.g., \u0026ldquo;5 min read\u0026rdquo;)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecode_lines\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eLines of code in code blocks\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecode_blocks\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eNumber of code blocks\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estats\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePostStats\u003c/td\u003e\n\u003ctd\u003eAll stats as structured object\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eFeed statistics (via cache):\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost_count\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eNumber of posts in feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etotal_words\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eSum of word counts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etotal_reading_time\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eSum of reading times\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etotal_reading_time_text\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eFormatted (e.g., \u0026ldquo;2 hours 30 min\u0026rdquo;)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eaverage_words\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eAverage word count\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eaverage_reading_time\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eAverage reading time\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etotal_code_lines\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eTotal lines of code\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etotal_code_blocks\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eTotal code blocks\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eSite statistics (in \u003ccode\u003econfig.Extra.site_stats\u003c/code\u003e):\u003c/strong\u003e\nSame fields as feed statistics, aggregated across all posts.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eTemplate usage:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# Post-level stats #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post-meta\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Extra.reading_time_text }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Extra.word_count }} words\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if post.Extra.code_blocks \u0026gt; 0 %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Extra.code_lines }} lines of code\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# Site-level stats #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;site-stats\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ config.Extra.site_stats.total_posts }} posts\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ config.Extra.site_stats.total_reading_time_text }} total reading time\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eUse cases:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDisplay \u0026ldquo;X min read\u0026rdquo; on post cards\u003c/li\u003e\n\u003cli\u003eShow word count for documentation pages\u003c/li\u003e\n\u003cli\u003eAggregate stats for feed index pages (\u0026ldquo;25 tutorials, ~8 hours\u0026rdquo;)\u003c/li\u003e\n\u003cli\u003eTrack content creation metrics\u003c/li\u003e\n\u003cli\u003eDisplay code-heavy post indicators\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"breadcrumbs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ebreadcrumbs\u003c/span\u003e \u003ca href=\"#breadcrumbs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003ebreadcrumbs\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Transform\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Generates breadcrumb navigation trails for posts based on URL path structure with JSON-LD structured data for SEO.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebreadcrumbs\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e           \u003cspan class=\"c\"\u003e# Enable/disable breadcrumbs globally\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_home\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e         \u003cspan class=\"c\"\u003e# Include \u0026#34;Home\u0026#34; as first breadcrumb\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehome_label\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Home\u0026#34;\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Label for home breadcrumb\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eseparator\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Visual separator between breadcrumbs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_depth\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e            \u003cspan class=\"c\"\u003e# Maximum depth (0 = unlimited)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estructured_data\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e   \u003cspan class=\"c\"\u003e# Generate JSON-LD for SEO\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Alternative: under components section\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebreadcrumbs\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_home\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eFrontmatter options:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Page\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Disable breadcrumbs for this page\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebreadcrumbs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Or customize per-page\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebreadcrumbs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eenabled\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eshow_home\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ehome_label\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Docs\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Manual breadcrumb trail (overrides auto-generation)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eitems\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003elabel\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Products\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/products/\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003elabel\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Widgets\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/products/widgets/\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePost fields set:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.breadcrumbs\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]Breadcrumb\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eArray of breadcrumb items\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.breadcrumb_separator\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConfigured separator character\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.breadcrumbs_jsonld\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eJSON-LD structured data\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eBreadcrumb item structure:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eBreadcrumb\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eLabel\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Display text\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eURL\u003c/span\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Link href\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eIsCurrent\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"c1\"\u003e// True for last item\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePosition\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 1-indexed position\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eAuto-generation behavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eParses post\u0026rsquo;s \u003ccode\u003ehref\u003c/code\u003e path (e.g., \u003ccode\u003e/docs/guides/getting-started/\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eCreates breadcrumb for each path segment\u003c/li\u003e\n\u003cli\u003eHumanizes segment names (e.g., \u003ccode\u003egetting-started\u003c/code\u003e → \u0026ldquo;Getting Started\u0026rdquo;)\u003c/li\u003e\n\u003cli\u003eUses post title for final segment if available\u003c/li\u003e\n\u003cli\u003eOptionally prepends \u0026ldquo;Home\u0026rdquo; breadcrumb\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eTemplate usage:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# Include the breadcrumbs component #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% include \u0026#34;components/breadcrumbs.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# Or manual rendering #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.breadcrumbs %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;breadcrumbs\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003earia-label\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Breadcrumb\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eol\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% for crumb in post.breadcrumbs %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {% if crumb.is_current %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003earia-current\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;page\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ crumb.label }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ crumb.url }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ crumb.label }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if not loop.last %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;separator\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.breadcrumb_separator }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eol\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# Add JSON-LD to head for SEO #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.breadcrumbs_jsonld %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/ld+json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebreadcrumbs_jsonld\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"nx\"\u003esafe\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eGenerated JSON-LD example:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;@context\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://schema.org\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;@type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;BreadcrumbList\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;itemListElement\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;@type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ListItem\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;position\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Home\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;item\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;@type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ListItem\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;position\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Docs\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;item\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/docs/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;@type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ListItem\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;position\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Getting Started\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eUse cases:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDocumentation sites with deep hierarchies\u003c/li\u003e\n\u003cli\u003eMulti-section websites (products, services, about)\u003c/li\u003e\n\u003cli\u003eBlog categories and subcategories\u003c/li\u003e\n\u003cli\u003eSEO improvement via structured data\u003c/li\u003e\n\u003cli\u003eImproved user navigation and orientation\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"jinja_md\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ejinja_md\u003c/span\u003e \u003ca href=\"#jinja_md\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003ejinja_md\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Transform\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Processes Jinja2 template expressions within markdown content before rendering.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration:\u003c/strong\u003e Requires \u003ccode\u003ejinja: true\u003c/code\u003e in post frontmatter.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eActivation:\u003c/strong\u003e\nPosts must explicitly enable Jinja processing:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDynamic Post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eTemplate context:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePost\u003c/td\u003e\n\u003ctd\u003eCurrent post object\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConfig\u003c/td\u003e\n\u003ctd\u003eSite configuration\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eposts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]Post\u003c/td\u003e\n\u003ctd\u003eAll posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecore\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eManager\u003c/td\u003e\n\u003ctd\u003eLifecycle manager for filtering\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efilter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003efunc\u003c/td\u003e\n\u003ctd\u003eFilter posts by expression\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emap\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003efunc\u003c/td\u003e\n\u003ctd\u003eMap field values from posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eExample content:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eRecent Posts Index\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Latest Posts\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in filter(\u0026#34;published == true\u0026#34;)[:5] %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ p.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ p.Href }}\u003c/span\u003e) - {{ p.Date.Format \u0026#34;Jan 2, 2006\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## All Tags\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for tag in map(\u0026#34;tags\u0026#34;, \u0026#34;published == true\u0026#34;, \u0026#34;date\u0026#34;, true) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e {{ tag }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"wikilinks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ewikilinks\u003c/span\u003e \u003ca href=\"#wikilinks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003ewikilinks\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Transform\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Transforms \u003ccode\u003e[[slug]]\u003c/code\u003e, \u003ccode\u003e[[slug|text]]\u003c/code\u003e, and \u003ccode\u003e[[slug#fragment]]\u003c/code\u003e wikilink syntax into HTML anchor tags.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewikilinks_warn_broken\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Warn about broken links (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eSyntax:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLink to another post: [[other-post-slug]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWith custom text: [[other-post-slug|Click here to read more]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLink to a section: [[other-post-slug\u003cspan class=\"ni\"\u003e#getting\u003c/span\u003e-started]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSection with custom text: [[other-post-slug\u003cspan class=\"ni\"\u003e#getting\u003c/span\u003e-started|See getting started]]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eFinds all \u003ccode\u003e[[...]]\u003c/code\u003e patterns in content\u003c/li\u003e\n\u003cli\u003eSplits the target on the first \u003ccode\u003e#\u003c/code\u003e to extract slug and optional fragment\u003c/li\u003e\n\u003cli\u003eLooks up target post by slug (case-insensitive), also checks aliases\u003c/li\u003e\n\u003cli\u003eIf found: converts to \u003ccode\u003e\u0026lt;a href=\u0026quot;/slug/#fragment\u0026quot;\u0026gt;Title\u0026lt;/a\u0026gt;\u003c/code\u003e (fragment omitted if empty)\u003c/li\u003e\n\u003cli\u003eIf not found: keeps original syntax, adds warning to post\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003ePost fields added (in \u003ccode\u003eExtra\u003c/code\u003e):\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewikilink_warnings\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003eList of broken wikilink warnings\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eExample:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCheck out my [[getting-started]] guide.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eYou might also like [[advanced-topics|the advanced guide]].\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJump to [[getting-started\u003cspan class=\"ni\"\u003e#installation\u003c/span\u003e]] for setup steps.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBecomes:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCheck out my \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/getting-started/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eGetting Started\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e guide.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eYou might also like \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/advanced-topics/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ethe advanced guide\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJump to \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/getting-started/#installation\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eGetting Started\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e for setup steps.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"toc\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003etoc\u003c/span\u003e \u003ca href=\"#toc\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003etoc\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Transform\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Extracts headings from markdown and builds a hierarchical table of contents.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etoc_min_level\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Minimum heading level (default: 2, h2)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etoc_max_level\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Maximum heading level (default: 4, h4)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eParses ATX-style headings (\u003ccode\u003e# Heading\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eGenerates URL-safe IDs from heading text\u003c/li\u003e\n\u003cli\u003eHandles duplicate IDs by appending numbers\u003c/li\u003e\n\u003cli\u003eBuilds hierarchical structure\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003ePost fields added (in \u003ccode\u003eExtra\u003c/code\u003e):\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etoc\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]TocEntry\u003c/td\u003e\n\u003ctd\u003eHierarchical table of contents\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eTocEntry structure:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eTocEntry\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eLevel\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e         \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Heading level (2-6)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eText\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Heading text\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eID\u003c/span\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Anchor ID\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eChildren\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eTocEntry\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Nested headings\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eTemplate usage:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.Extra.toc %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;toc\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eTable of Contents\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% for entry in post.Extra.toc %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#{{ entry.ID }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ entry.Text }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% if entry.Children %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% for child in entry.Children %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#{{ child.ID }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ child.Text }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"structured_data\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003estructured_data\u003c/span\u003e \u003ca href=\"#structured_data\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003estructured_data\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Transform\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Generates JSON-LD Schema.org markup, OpenGraph meta tags, and Twitter Cards for SEO and social media optimization.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eseo\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etwitter_handle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;yourusername\u0026#34;\u003c/span\u003e           \u003cspan class=\"c\"\u003e# Twitter/X handle (without @)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault_image\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/images/default-og.jpg\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Fallback social image\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elogo_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/images/logo.png\u0026#34;\u003c/span\u003e             \u003cspan class=\"c\"\u003e# Site logo for Schema.org\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eseo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estructured_data\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Enable/disable (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eseo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estructured_data\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefault_author\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Person\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Author Name\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/about\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eseo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estructured_data\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epublisher\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Organization\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Site Name\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elogo\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/images/logo.png\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eRuns during Transform stage for each published post\u003c/li\u003e\n\u003cli\u003eSkips posts without titles (required for structured data)\u003c/li\u003e\n\u003cli\u003eGenerates JSON-LD Schema.org BlogPosting markup\u003c/li\u003e\n\u003cli\u003eGenerates OpenGraph meta tags for social sharing\u003c/li\u003e\n\u003cli\u003eGenerates Twitter Card meta tags\u003c/li\u003e\n\u003cli\u003eStores all data in \u003ccode\u003epost.Extra[\u0026quot;structured_data\u0026quot;]\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003ePost fields set (in \u003ccode\u003eExtra\u003c/code\u003e):\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estructured_data\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e*StructuredData\u003c/td\u003e\n\u003ctd\u003eContainer for all SEO metadata\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eStructuredData contains:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eJSONLD\u003c/code\u003e - JSON-LD script content (string)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eOpenGraph\u003c/code\u003e - Array of \u003ccode\u003e{Property, Content}\u003c/code\u003e pairs\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eTwitter\u003c/code\u003e - Array of \u003ccode\u003e{Name, Content}\u003c/code\u003e pairs\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFrontmatter fields used:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Post Title\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e           \u003c/span\u003e\u003cspan class=\"c\"\u003e# Required\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Description\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# For meta description\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e             \u003c/span\u003e\u003cspan class=\"c\"\u003e# Publication date\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Author Name\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e         \u003c/span\u003e\u003cspan class=\"c\"\u003e# Override default author\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/images/post.jpg\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"c\"\u003e# Featured image\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003esocial_image\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/images/og.jpg\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Override for OG image\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etwitter\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;authorhandle\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"c\"\u003e# Author\u0026#39;s Twitter (without @)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emodified\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;2024-01-16\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c\"\u003e# Last modified date\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tag1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tag2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c\"\u003e# Become keywords\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eExample JSON-LD Output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;@context\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://schema.org\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;@type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;BlogPosting\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;headline\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Blog Post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;A description of my post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/my-post/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;datePublished\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2024-01-15T00:00:00Z\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;dateModified\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2024-01-16T00:00:00Z\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;author\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;@type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Person\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Author Name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/about\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;publisher\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;@type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Organization\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Site Name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;logo\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;@type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ImageObject\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/images/logo.png\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;image\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/images/post.jpg\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;keywords\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tag1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tag2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eExample OpenGraph Tags:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:title\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;My Blog Post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:description\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;A description of my post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:type\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;article\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:url\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com/my-post/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:site_name\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Site Name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:image\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com/images/post.jpg\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:image:width\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;1200\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:image:height\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;630\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:locale\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;en_US\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;article:published_time\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;2024-01-15T00:00:00Z\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;article:tag\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;tag1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;article:tag\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;tag2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eExample Twitter Card Tags:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;twitter:card\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;summary_large_image\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;twitter:site\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;@yourusername\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;twitter:creator\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;@authorhandle\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;twitter:title\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;My Blog Post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;twitter:description\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;A description of my post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;twitter:image\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com/images/post.jpg\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eTemplate usage:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# JSON-LD in head #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.structured_data.jsonld %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/ld+json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estructured_data\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ejsonld\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"nx\"\u003esafe\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# OpenGraph tags #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for meta in post.structured_data.opengraph %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ meta.property }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ meta.content }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# Twitter Card tags #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for meta in post.structured_data.twitter %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ meta.name }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ meta.content }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eImage priority:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003esocial_image\u003c/code\u003e from frontmatter (OG-specific override)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eimage\u003c/code\u003e from frontmatter\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edefault_image\u003c/code\u003e from SEO config\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eAuthor priority:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003eauthor\u003c/code\u003e field from frontmatter\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edefault_author\u003c/code\u003e from structured data config\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eauthor\u003c/code\u003e from site config\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eDisabling structured data:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eseo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estructured_data\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eTesting tools:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://search.google.com/test/rich-results\"\u003eGoogle Rich Results Test\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://developers.facebook.com/tools/debug/\"\u003eFacebook Sharing Debugger\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://cards-dev.twitter.com/validator\"\u003eTwitter Card Validator\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://validator.schema.org/\"\u003eSchema.org Validator\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eRelated:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e[[structured-data-guide|Structured Data Guide]] - Detailed user guide\u003c/li\u003e\n\u003cli\u003e[[\u003ca href=\"/tags/templates/\" class=\"hashtag-tag\" data-tag=\"templates\" data-count=5 data-reading-time=21 data-reading-time-text=\"21 minutes\"\u003e#templates\u003c/a\u003e|templates]] - Template integration\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"authors\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eauthors\u003c/span\u003e \u003ca href=\"#authors\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eauthors\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Transform\u003cbr\u003e\n\u003cstrong\u003ePriority:\u003c/strong\u003e \u003ccode\u003ePriorityFirst + 1\u003c/code\u003e (runs right after \u003ccode\u003eauto_title\u003c/code\u003e)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Resolves author IDs in post frontmatter against the site-wide authors configuration, populating rich author objects for templates.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eAuthors are defined in the site configuration under \u003ccode\u003e[markata-go.authors]\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egenerate_pages\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efeeds_enabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewaylon\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Waylon Walker\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erole\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;author\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eactive\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eguest\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Guest Writer\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erole\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;editor\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eguest\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eactive\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eReads the authors map from the site configuration\u003c/li\u003e\n\u003cli\u003eIdentifies the default author (the entry with \u003ccode\u003edefault = true\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eFor each post:\n\u003cul\u003e\n\u003cli\u003eReads author IDs from \u003ccode\u003eauthors\u003c/code\u003e array or \u003ccode\u003eauthor\u003c/code\u003e string in frontmatter\u003c/li\u003e\n\u003cli\u003eIf no authors specified, assigns the default author\u003c/li\u003e\n\u003cli\u003eResolves each author ID against the config map\u003c/li\u003e\n\u003cli\u003eApplies per-post role overrides (from extended frontmatter format)\u003c/li\u003e\n\u003cli\u003eApplies per-post details overrides (shown as hover tooltips in byline)\u003c/li\u003e\n\u003cli\u003ePopulates \u003ccode\u003epost.AuthorObjects\u003c/code\u003e with resolved Author structs\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eLogs a warning for unrecognized author IDs\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003ePost fields set:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eauthor_objects\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]Author\u003c/td\u003e\n\u003ctd\u003eResolved author structs (computed, not serialized)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eauthors\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003eAuthor IDs (may be set if default author assigned)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eTemplate access:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003epost.author_objects\u003c/code\u003e \u0026ndash; Array of author maps with all fields (name, role, avatar, url, details, etc.)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epost.authors\u003c/code\u003e \u0026ndash; Array of author ID strings\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eauthors\u003c/code\u003e \u0026ndash; Top-level map of all configured authors (ID to author map)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEach author object includes a \u003ccode\u003edetails\u003c/code\u003e field (when set via frontmatter) that provides a per-post description of the author\u0026rsquo;s contribution, displayed as a CSS tooltip on hover.\u003c/p\u003e\n\u003cp\u003eThe extended frontmatter format supports key aliases for convenience (\u003ccode\u003ename\u003c/code\u003e/\u003ccode\u003ehandle\u003c/code\u003e for \u003ccode\u003eid\u003c/code\u003e, \u003ccode\u003ejob\u003c/code\u003e/\u003ccode\u003eposition\u003c/code\u003e/\u003ccode\u003epart\u003c/code\u003e/\u003ccode\u003etitle\u003c/code\u003e for \u003ccode\u003erole\u003c/code\u003e, \u003ccode\u003edetail\u003c/code\u003e/\u003ccode\u003edescription\u003c/code\u003e for \u003ccode\u003edetails\u003c/code\u003e). See the \u003ca href=\"../guides/frontmatter.md#authors\"\u003eFrontmatter Guide\u003c/a\u003e for the full alias table.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRelated:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"../guides/configuration.md#authors-configuration\"\u003eAuthors Configuration\u003c/a\u003e \u0026ndash; Config setup guide\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"../guides/frontmatter.md\"\u003eFrontmatter Guide\u003c/a\u003e \u0026ndash; \u003ccode\u003eauthors\u003c/code\u003e and \u003ccode\u003eauthor\u003c/code\u003e fields\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"render-stage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRender Stage\u003c/span\u003e \u003ca href=\"#render-stage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"admonitions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eadmonitions\u003c/span\u003e \u003ca href=\"#admonitions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eadmonitions\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Render (goldmark extension)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Renders admonition blocks (notes, warnings, tips) from markdown.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSyntax:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! note \u0026#34;Optional Title\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Content of the note goes here.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Must be indented with 4 spaces.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! warning\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Default title will be \u0026#34;Warning\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! tip \u0026#34;Pro Tip\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Helpful information here.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBuilt-in types (examples):\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003enote\u003c/code\u003e - General information\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ewarning\u003c/code\u003e - Caution/warning\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etip\u003c/code\u003e - Helpful tips\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eimportant\u003c/code\u003e - Important information\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edanger\u003c/code\u003e - Dangerous/critical warnings\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecaution\u003c/code\u003e - Proceed with care\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eCustom types:\u003c/strong\u003e Any type name using letters, numbers, underscores, or hyphens\nis accepted, even if it is not built in. The type is included in the HTML class\n(for example, \u003ccode\u003eclass=\u0026quot;admonition scripture\u0026quot;\u003c/code\u003e), and its first letter is\ncapitalized for the default title. A quoted or unquoted title overrides it.\nCustom types can be styled with site CSS.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! scripture\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    A passage of scripture.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! background-thought \u0026#34;A side thought\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    More context.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e???+ source \u0026#34;Further reading\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Expanded by default.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eHTML output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;admonition note\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;admonition-title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eNote\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eContent of the note goes here.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCSS styling:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003epadding\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003emargin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eborder-left\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"kc\"\u003esolid\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eborder-radius\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003enote\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eborder-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#448aff\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#e3f2fd\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ewarning\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eborder-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ff9800\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#fff3e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003etip\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eborder-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#4caf50\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#e8f5e9\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003edanger\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eborder-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f44336\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ffebee\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition-title\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003efont-weight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ebold\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003emargin-bottom\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"render_markdown\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003erender_markdown\u003c/span\u003e \u003ca href=\"#render_markdown\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003erender_markdown\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Render\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Converts markdown content to HTML using goldmark with extensions.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eextensions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etypographer\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e       \u003cspan class=\"c\"\u003e# Smart quotes, dashes, ellipses (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefinition_list\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e   \u003cspan class=\"c\"\u003e# PHP Markdown Extra definition lists (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efootnote\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e          \u003cspan class=\"c\"\u003e# PHP Markdown Extra footnotes (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eEnabled extensions:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eGFM\u003c/strong\u003e - GitHub Flavored Markdown (tables, strikethrough, autolinks, task lists)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSyntax Highlighting\u003c/strong\u003e - Code block highlighting with Chroma\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAdmonitions\u003c/strong\u003e - Note/warning blocks\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAuto Heading IDs\u003c/strong\u003e - Generates IDs for headings (anchor links disabled by default; use \u003ccode\u003eheading_anchors\u003c/code\u003e plugin instead)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTypographer\u003c/strong\u003e - Smart quotes, dashes, ellipses\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDefinition Lists\u003c/strong\u003e - PHP Markdown Extra style definition lists\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFootnotes\u003c/strong\u003e - PHP Markdown Extra style footnotes\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eTakes \u003ccode\u003epost.Content\u003c/code\u003e (raw markdown)\u003c/li\u003e\n\u003cli\u003eConverts to HTML with all extensions\u003c/li\u003e\n\u003cli\u003eStores result in \u003ccode\u003epost.ArticleHTML\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003ePost fields set:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003earticle_html\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRendered HTML content\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eSupported markdown features:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Tables\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Header | Header |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|--------|--------|\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Cell   | Cell   |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Task Lists\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e- [x]\u003c/span\u003e Completed task\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e- [ ]\u003c/span\u003e Pending task\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Strikethrough\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e~~deleted text~~\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Code Blocks\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e```go\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efunc main() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    fmt.Println(\u0026#34;Syntax highlighted!\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"footnotes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFootnotes\u003c/span\u003e \u003ca href=\"#footnotes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere\u0026rsquo;s a sentence with a footnote.\u003csup id=\"fnref:1\"\u003e\u003ca href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\"\u003e1\u003c/a\u003e\u003c/sup\u003e\u003c/p\u003e\n\u003ch2 id=\"smart-quotes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSmart Quotes\u003c/span\u003e \u003ca href=\"#smart-quotes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u0026ldquo;Straight quotes\u0026rdquo; become curly.\u003c/p\u003e\n\u003ch2 id=\"definition-lists\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDefinition Lists\u003c/span\u003e \u003ca href=\"#definition-lists\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdl\u003e\n\u003cdt\u003eTerm\u003c/dt\u003e\n\u003cdd\u003eDefinition of the term.\u003c/dd\u003e\n\u003c/dl\u003e\n\u003cpre\u003e\u003ccode\u003e\n**Disabling extensions:**\n\nAll extensions are enabled by default. To disable any:\n\n```toml\n# Disable specific extensions\n[markdown.extensions]\ntypographer = false       # Use straight quotes instead\ndefinition_list = false   # Disable definition lists\nfootnote = false          # Disable footnotes\n\n# Or disable all three\n[markdown.extensions]\ntypographer = false\ndefinition_list = false\nfootnote = false\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch3 id=\"templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003etemplates\u003c/span\u003e \u003ca href=\"#templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003etemplates\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Render\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Wraps rendered markdown content in HTML templates with theme support.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplates_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;templates\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Templates directory (default: \u0026#34;templates\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e            \u003cspan class=\"c\"\u003e# Theme name (default: \u0026#34;default\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Or with theme options:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eLooks up template from \u003ccode\u003epost.Template\u003c/code\u003e (default: \u003ccode\u003epost.html\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eRenders template with post context\u003c/li\u003e\n\u003cli\u003eFalls back to raw \u003ccode\u003eArticleHTML\u003c/code\u003e if no template exists\u003c/li\u003e\n\u003cli\u003eStores result in \u003ccode\u003epost.HTML\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eTemplate context:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePost\u003c/td\u003e\n\u003ctd\u003eCurrent post\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebody\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epost.ArticleHTML\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConfig\u003c/td\u003e\n\u003ctd\u003eSite configuration\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecore\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eManager\u003c/td\u003e\n\u003ctd\u003eLifecycle manager\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003ePost fields set:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehtml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eFinal HTML (content + template)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eExample template (\u003ccode\u003etemplates/post.html\u003c/code\u003e):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u0026lt;!DOCTYPE html\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Title }} | {{ config.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Description }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Date.Format \u0026#34;January 2, 2006\u0026#34; }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;content\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ body | safe }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"heading_anchors\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eheading_anchors\u003c/span\u003e \u003ca href=\"#heading_anchors\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eheading_anchors\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Render (post_render)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Adds clickable anchor links to headings in rendered HTML for easy linking to sections.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eheading_anchors\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Enable/disable the plugin (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emin_level\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e         \u003cspan class=\"c\"\u003e# Minimum heading level to process (default: 2, h2)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_level\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e         \u003cspan class=\"c\"\u003e# Maximum heading level to process (default: 4, h4)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;end\u0026#34;\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Anchor position: \u0026#34;start\u0026#34; or \u0026#34;end\u0026#34; (default: \u0026#34;end\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esymbol\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#\u0026#34;\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Link text for the anchor (default: \u0026#34;#\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eclass\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;heading-anchor\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# CSS class for the anchor link (default: \u0026#34;heading-anchor\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eRuns after \u003ccode\u003erender_markdown\u003c/code\u003e to process \u003ccode\u003eArticleHTML\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eFinds all heading tags within the configured level range\u003c/li\u003e\n\u003cli\u003eSkips headings that already contain a goldmark anchor (\u003ccode\u003eclass=\u0026quot;anchor\u0026quot;\u003c/code\u003e) to prevent duplicate anchor links\u003c/li\u003e\n\u003cli\u003eExtracts existing IDs or generates URL-safe IDs from heading text\u003c/li\u003e\n\u003cli\u003eHandles duplicate IDs by appending numbers (e.g., \u003ccode\u003emy-heading\u003c/code\u003e, \u003ccode\u003emy-heading-1\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eInserts anchor link at the configured position (start or end of heading)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eNote:\u003c/strong\u003e The goldmark markdown renderer has its own anchor extension (\u003ccode\u003e[markdown.extensions] anchor\u003c/code\u003e), which is disabled by default. This plugin is the recommended way to add heading anchors because it offers more configuration (min/max level, position, symbol, CSS class). If the goldmark extension is re-enabled, this plugin detects and skips headings that already have goldmark anchors.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eHTML output example:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- Input (from render_markdown) --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;getting-started\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eGetting Started\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- Output (with default config, position=\u0026#34;end\u0026#34;) --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;getting-started\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eGetting Started \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#getting-started\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;heading-anchor\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e#\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- Output (with position=\u0026#34;start\u0026#34;) --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;getting-started\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#getting-started\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;heading-anchor\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e#\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e Getting Started\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCSS styling:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eheading-anchor\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eopacity\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003etext-decoration\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enone\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003emargin-left\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#666\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003ehover\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eheading-anchor\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003ehover\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eheading-anchor\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eh4\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003ehover\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eheading-anchor\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eopacity\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"md_video\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003emd_video\u003c/span\u003e \u003ca href=\"#md_video\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003emd_video\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Render (post_render)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Converts markdown image syntax for video files into HTML video elements with native controls and on-demand loading.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emd_video\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                    \u003cspan class=\"c\"\u003e# Enable the plugin (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003evideo_extensions\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;.mp4\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.webm\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.ogg\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.ogv\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.mov\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.m4v\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.avi\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.mkv\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Extensions to treat as video\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003evideo_class\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;md-video\u0026#34;\u003c/span\u003e          \u003cspan class=\"c\"\u003e# CSS class for video elements (default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtrols\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                   \u003cspan class=\"c\"\u003e# Show video controls (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eautoplay\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# Authored autoplay intent (default: false)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eloop\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                       \u003cspan class=\"c\"\u003e# Loop video continuously (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emuted\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                      \u003cspan class=\"c\"\u003e# Mute audio (default: true, required for autoplay)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eplaysinline\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                \u003cspan class=\"c\"\u003e# Play inline on mobile (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epreload\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;none\u0026#34;\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# Preload hint: \u0026#34;none\u0026#34;, \u0026#34;metadata\u0026#34;, \u0026#34;auto\u0026#34; (default: \u0026#34;none\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eAutoplay intent and loading policy\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eSet \u003ccode\u003eautoplay = true\u003c/code\u003e to author GIF-like Markdown playback. Generated HTML stores\nthat intent in \u003ccode\u003edata-authored-autoplay=\u0026quot;true\u0026quot;\u003c/code\u003e and keeps \u003ccode\u003epreload=\u0026quot;none\u0026quot;\u003c/code\u003e.\nFull Quality or already-confident fast Auto at page entry may start unrequested authored videos.\nSave Data, constrained Auto, reduced motion, and the no-JS baseline keep native\ninteraction. Raw HTML preserves its own autoplay intent; the Markdown setting\nnever adds autoplay to a raw video that omitted it. See\n\u003ca href=\"../adaptive-loading/\"\u003eAdaptive loading\u003c/a\u003e for policy and recovery behavior.\u003c/p\u003e\n\u003cp\u003eTo use traditional video behavior (click to play with sound):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emd_video\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eautoplay\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eloop\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emuted\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtrols\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eMarkdown usage:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003ekickflip down the 3 stair - fingerboarding\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://example.com/video.mp4\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eDemo of the feature\u003c/span\u003e](\u003cspan class=\"na\"\u003edemo.webm\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eScreen recording\u003c/span\u003e](\u003cspan class=\"na\"\u003escreen.mp4?width=500\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eScans \u003ccode\u003eArticleHTML\u003c/code\u003e for \u003ccode\u003e\u0026lt;img\u0026gt;\u003c/code\u003e tags after markdown rendering\u003c/li\u003e\n\u003cli\u003eChecks if the \u003ccode\u003esrc\u003c/code\u003e attribute ends with a video extension (handles query parameters)\u003c/li\u003e\n\u003cli\u003eReplaces matching \u003ccode\u003e\u0026lt;img\u0026gt;\u003c/code\u003e tags with \u003ccode\u003e\u0026lt;video\u0026gt;\u003c/code\u003e elements\u003c/li\u003e\n\u003cli\u003ePreserves the \u003ccode\u003ealt\u003c/code\u003e text as fallback content\u003c/li\u003e\n\u003cli\u003eAutomatically detects MIME type from file extension\u003c/li\u003e\n\u003cli\u003eDerives a \u003ccode\u003e.webp\u003c/code\u003e poster for trusted video URLs on every supported video format\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eHTML output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003evideo\u003c/span\u003e \u003cspan class=\"na\"\u003eloop\u003c/span\u003e \u003cspan class=\"na\"\u003emuted\u003c/span\u003e \u003cspan class=\"na\"\u003eplaysinline\u003c/span\u003e \u003cspan class=\"na\"\u003econtrols\u003c/span\u003e \u003cspan class=\"na\"\u003epreload\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;none\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;md-video\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;margin-inline:auto\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esource\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com/video.mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  kickflip down the 3 stair - fingerboarding\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003evideo\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eMIME type detection:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eExtension\u003c/th\u003e\n\u003cth\u003eMIME Type\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.mp4\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003evideo/mp4\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.webm\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003evideo/webm\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.ogg\u003c/code\u003e, \u003ccode\u003e.ogv\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003evideo/ogg\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.mov\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003evideo/quicktime\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.m4v\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003evideo/x-m4v\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.avi\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003evideo/x-msvideo\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.mkv\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003evideo/x-matroska\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eCSS styling:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003emd-video\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003emax-width\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"kt\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eheight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eauto\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eborder-radius\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"youtube\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eyoutube\u003c/span\u003e \u003ca href=\"#youtube\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eyoutube\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Render (post_render)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Converts YouTube URLs on their own line into responsive embedded iframes with privacy-enhanced mode by default.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eyoutube\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Enable the plugin (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eprivacy_enhanced\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e     \u003cspan class=\"c\"\u003e# Use youtube-nocookie.com (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtainer_class\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;youtube-embed\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# CSS class for container (default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elazy_load\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e            \u003cspan class=\"c\"\u003e# Enable lazy loading (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eMarkdown usage:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eSimply paste a YouTube URL on its own line:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCheck out this video:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehttps://www.youtube.com/watch?v=dQw4w9WgXcQ\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMore content below...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eSupported URL formats:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ehttps://www.youtube.com/watch?v=VIDEO_ID\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehttps://youtube.com/watch?v=VIDEO_ID\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehttps://m.youtube.com/watch?v=VIDEO_ID\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehttps://youtu.be/VIDEO_ID\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eURLs with extra parameters like \u003ccode\u003e\u0026amp;t=30\u003c/code\u003e (timestamp is ignored in embed)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eHTML output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;youtube-embed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eiframe\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://www.youtube-nocookie.com/embed/dQw4w9WgXcQ\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;YouTube video player\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003eframeborder\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003eallow\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003eallowfullscreen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eiframe\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePrivacy-enhanced mode:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eBy default, the plugin uses \u003ccode\u003eyoutube-nocookie.com\u003c/code\u003e which prevents YouTube from storing cookies on visitors\u0026rsquo; browsers until they play the video. Disable this for standard embeds:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eyoutube\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eprivacy_enhanced\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCSS styling (included in default theme):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eyoutube-embed\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eposition\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003erelative\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003epadding-bottom\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e56.25\u003c/span\u003e\u003cspan class=\"kt\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c\"\u003e/* 16:9 aspect ratio */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eheight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eoverflow\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ehidden\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003emax-width\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"kt\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003emargin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e1.5\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eborder-radius\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eyoutube-embed\u003c/span\u003e \u003cspan class=\"nt\"\u003eiframe\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eposition\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eabsolute\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003etop\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ewidth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"kt\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eheight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"kt\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eborder\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enone\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eborder-radius\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eScans \u003ccode\u003eArticleHTML\u003c/code\u003e for YouTube URLs in standalone \u003ccode\u003e\u0026lt;p\u0026gt;\u003c/code\u003e tags\u003c/li\u003e\n\u003cli\u003eURLs inside code blocks or inline with text are NOT converted\u003c/li\u003e\n\u003cli\u003eExtracts the 11-character video ID from the URL\u003c/li\u003e\n\u003cli\u003eGenerates responsive embed with configurable privacy mode\u003c/li\u003e\n\u003cli\u003eAdds lazy loading by default for better page performance\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eNotes:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eURLs must be on their own line (in their own \u003ccode\u003e\u0026lt;p\u0026gt;\u003c/code\u003e tag) to be converted\u003c/li\u003e\n\u003cli\u003eInline URLs like \u0026ldquo;Check out \u003ca href=\"https://youtube.com/watch?v=xyz%22\"\u003ehttps://youtube.com/watch?v=xyz\u0026quot;\u003c/a\u003e are preserved as text\u003c/li\u003e\n\u003cli\u003eInvalid video IDs (not exactly 11 characters) are ignored\u003c/li\u003e\n\u003cli\u003eoEmbed-based YouTube embeds (via the embeds plugin) render Lite YouTube by default\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"image_zoom\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eimage_zoom\u003c/span\u003e \u003ca href=\"#image_zoom\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eimage_zoom\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Render (post_render), Write\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Adds optional image zoom/lightbox functionality using GLightbox. Users can click/tap images to view them in a full-screen modal with support for touch gestures, keyboard navigation, and gallery mode.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eimage_zoom\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e           \u003cspan class=\"c\"\u003e# Enable the plugin (default: false)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elibrary\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;glightbox\u0026#34;\u003c/span\u003e     \u003cspan class=\"c\"\u003e# Lightbox library to use (default: \u0026#34;glightbox\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eselector\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.glightbox\u0026#34;\u003c/span\u003e   \u003cspan class=\"c\"\u003e# CSS selector for zoomable images (default: \u0026#34;.glightbox\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecdn\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                \u003cspan class=\"c\"\u003e# Legacy fallback when shared vendored assets are unavailable\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_all_images\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e   \u003cspan class=\"c\"\u003e# Make all images zoomable by default (default: false)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# GLightbox-specific options\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eopen_effect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;zoom\u0026#34;\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Effect when opening: \u0026#34;zoom\u0026#34;, \u0026#34;fade\u0026#34;, \u0026#34;none\u0026#34; (default: \u0026#34;zoom\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eclose_effect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;zoom\u0026#34;\u003c/span\u003e     \u003cspan class=\"c\"\u003e# Effect when closing: \u0026#34;zoom\u0026#34;, \u0026#34;fade\u0026#34;, \u0026#34;none\u0026#34; (default: \u0026#34;zoom\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslide_effect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;slide\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Effect when sliding: \u0026#34;slide\u0026#34;, \u0026#34;fade\u0026#34;, \u0026#34;zoom\u0026#34;, \u0026#34;none\u0026#34; (default: \u0026#34;slide\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etouch_navigation\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e   \u003cspan class=\"c\"\u003e# Enable touch/swipe gestures (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eloop\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Loop through images in gallery (default: false)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edraggable\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Enable dragging images to navigate (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eMarkdown syntax:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMark individual images as zoomable using attribute markers:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003ePhoto with zoom {data-zoomable}\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/photo.jpg\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eAlternative syntax {.zoomable}\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/sunset.jpg\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eRegular image without zoom\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/icon.png\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eFrontmatter option:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eEnable zoom for all images in a specific post:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Photo Gallery\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eimage_zoom\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eRuns after \u003ccode\u003erender_markdown\u003c/code\u003e to process \u003ccode\u003eArticleHTML\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eFinds images with \u003ccode\u003e{data-zoomable}\u003c/code\u003e or \u003ccode\u003e{.zoomable}\u003c/code\u003e markers\u003c/li\u003e\n\u003cli\u003eRemoves the markers from alt text\u003c/li\u003e\n\u003cli\u003eWraps images in anchor tags with GLightbox classes\u003c/li\u003e\n\u003cli\u003ePreserves explicit width/height when the source URL already carries media size hints\u003c/li\u003e\n\u003cli\u003eAdds \u003ccode\u003edata-glightbox\u003c/code\u003e attribute for the lightbox\u003c/li\u003e\n\u003cli\u003eTracks which posts need the lightbox library\u003c/li\u003e\n\u003cli\u003eIn Write stage, stores configuration for templates to inject JS/CSS\u003c/li\u003e\n\u003cli\u003ePrefers shared vendored GLightbox assets from \u003ccode\u003e[markata-go.assets]\u003c/code\u003e when available, otherwise falls back to the legacy \u003ccode\u003ecdn\u003c/code\u003e toggle\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eHTML output:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eInput:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eBeautiful sunset {data-zoomable}\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/sunset.jpg\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOutput:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/sunset.jpg\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;glightbox-link\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/sunset.jpg\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Beautiful sunset\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;glightbox\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;1200\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;675\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       \u003cspan class=\"na\"\u003edata-glightbox\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;description: Beautiful sunset\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePost fields set (in \u003ccode\u003eExtra\u003c/code\u003e):\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eneeds_image_zoom\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eTrue if post has zoomable images\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eConfig fields set (in \u003ccode\u003eExtra\u003c/code\u003e):\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eglightbox_enabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eTrue if any posts need GLightbox\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eglightbox_cdn\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eWhether templates should fall back to CDN after checking shared vendored asset URLs\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eglightbox_options\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003emap\u003c/td\u003e\n\u003ctd\u003eGLightbox initialization options\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eTemplate usage:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eThe base template automatically includes GLightbox when needed:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if config.Extra.glightbox_enabled %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- CSS in head --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;stylesheet\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/css/glightbox.min.css\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- JS before closing body --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/js/glightbox.min.js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;DOMContentLoaded\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eGLightbox\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e \u003cspan class=\"nx\"\u003eselector\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;.glightbox\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen \u003ccode\u003e[markata-go.assets].mode\u003c/code\u003e is \u003ccode\u003eself-hosted\u003c/code\u003e or \u003ccode\u003eauto\u003c/code\u003e, the base templates prefer the shared \u003ccode\u003easset_urls\u003c/code\u003e mappings generated by \u003ccode\u003ecdn_assets\u003c/code\u003e. In that setup, \u003ccode\u003emarkata-go assets download\u003c/code\u003e will vendor GLightbox alongside the other third-party assets.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eKeyboard shortcuts:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eKey\u003c/th\u003e\n\u003cth\u003eAction\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eEscape\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eClose lightbox\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e→\u003c/code\u003e / \u003ccode\u003eArrowRight\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNext image\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e←\u003c/code\u003e / \u003ccode\u003eArrowLeft\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePrevious image\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eTouch gestures:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eGesture\u003c/th\u003e\n\u003cth\u003eAction\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eSwipe left/right\u003c/td\u003e\n\u003ctd\u003eNavigate images\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePinch\u003c/td\u003e\n\u003ctd\u003eZoom in/out\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDrag\u003c/td\u003e\n\u003ctd\u003ePan zoomed image\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch3 id=\"image_optimization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eimage_optimization\u003c/span\u003e \u003ca href=\"#image_optimization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eimage_optimization\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Render (post_render), Write\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Generates AVIF/WebP variants for local images and rewrites HTML to use \u003ccode\u003e\u0026lt;picture\u0026gt;\u003c/code\u003e with stable fallbacks.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eimage_optimization\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avif\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;webp\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003equality\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eavif_quality\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewebp_quality\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewidths\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e480\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e768\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1200\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esizes\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;100vw\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.markata/image-cache\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eavifenc_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecwebp_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eConfiguration fields:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWhether the plugin is active\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eformats\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[\u0026quot;avif\u0026quot;,\u0026quot;webp\u0026quot;]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFormats to generate\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003equality\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e80\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault quality for all formats\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eavif_quality\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e80\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAVIF quality override\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewebp_quality\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e80\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWebP quality override\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewidths\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]int\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[480,768,1200]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eResponsive widths to generate\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esizes\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;100vw\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSizes attribute for responsive sources\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecache_dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.markata/image-cache\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCache directory for encode metadata\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eavifenc_path\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePath to \u003ccode\u003eavifenc\u003c/code\u003e (auto-detect if empty)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecwebp_path\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePath to \u003ccode\u003ecwebp\u003c/code\u003e (auto-detect if empty)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eScans \u003ccode\u003eArticleHTML\u003c/code\u003e for local \u003ccode\u003e\u0026lt;img\u0026gt;\u003c/code\u003e tags and skips external URLs or data URIs.\u003c/li\u003e\n\u003cli\u003eWraps each local image in \u003ccode\u003e\u0026lt;picture\u0026gt;\u003c/code\u003e with AVIF/WebP sources and \u003ccode\u003esrcset\u003c/code\u003e widths.\u003c/li\u003e\n\u003cli\u003eWrites optimized variants next to the original output file using width suffixes.\u003c/li\u003e\n\u003cli\u003eUses a cache key (path, mod time, size, quality, encoder) to skip re-encoding.\u003c/li\u003e\n\u003cli\u003eMissing encoders emit warnings and skip the format without failing the build.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eHTML output:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eInput:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eCat\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/cat.jpg\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOutput:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003epicture\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esource\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;image/avif\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003esrcset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/cat-480w.avif 480w, /images/cat-768w.avif 768w\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003esizes\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;100vw\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esource\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;image/webp\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003esrcset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/cat-480w.webp 480w, /images/cat-768w.webp 768w\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003esizes\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;100vw\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/cat.jpg\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Cat\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003epicture\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e| Tap outside | Close lightbox |\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCSS customization:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eglightbox-link\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003einline-block\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ecursor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ezoom-in\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eglightbox-link\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003ehover\u003c/span\u003e \u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eopacity\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.9\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003etransform\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003escale\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mf\"\u003e1.02\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003etransition\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eall\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.2\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e \u003cspan class=\"kc\"\u003eease\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePerformance notes:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eGLightbox JS/CSS only loaded on pages with zoomable images\u003c/li\u003e\n\u003cli\u003eLibrary is ~11KB gzipped when using CDN\u003c/li\u003e\n\u003cli\u003eFiles loaded asynchronously to avoid blocking page render\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"link_collector\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003elink_collector\u003c/span\u003e \u003ca href=\"#link_collector\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003elink_collector\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Render (post_render)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Collects all hyperlinks from posts and tracks inlinks (pages linking TO a post) and outlinks (pages a post links TO).\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elink_collector\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_feeds\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Include feed pages in inlinks (default: false)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_index\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Include index page in inlinks (default: false)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eNote:\u003c/strong\u003e The plugin also reads \u003ccode\u003eurl\u003c/code\u003e from \u003ccode\u003econfig.Extra\u003c/code\u003e to determine internal vs external links.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eRuns after \u003ccode\u003erender_markdown\u003c/code\u003e to process \u003ccode\u003eArticleHTML\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eExtracts all \u003ccode\u003e\u0026lt;a href=\u0026quot;...\u0026quot;\u0026gt;\u003c/code\u003e links from each post\u003c/li\u003e\n\u003cli\u003eResolves relative URLs against the post\u0026rsquo;s URL\u003c/li\u003e\n\u003cli\u003eDistinguishes internal links (same domain) from external links\u003c/li\u003e\n\u003cli\u003eLooks up target posts for internal links\u003c/li\u003e\n\u003cli\u003ePopulates \u003ccode\u003eInlinks\u003c/code\u003e and \u003ccode\u003eOutlinks\u003c/code\u003e on each post\u003c/li\u003e\n\u003cli\u003eStores all links in cache for use by other plugins\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003ePerformance:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCaches href extraction per post using a hash of \u003ccode\u003eArticleHTML\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eReuses cached hrefs on unchanged posts, while still rebuilding link objects\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003ePost fields set:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehrefs\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003eAll href values found in the post\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einlinks\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]map\u003c/td\u003e\n\u003ctd\u003eLinks from other posts pointing to this post (template-friendly)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eoutlinks\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]map\u003c/td\u003e\n\u003ctd\u003eLinks from this post to other pages (template-friendly)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eLink structure:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eLink\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eSourceURL\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Full URL of the source page\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eSourcePost\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003ePost\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Source post object (if internal)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTargetPost\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003ePost\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Target post object (if internal)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eRawTarget\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Original href value\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTargetURL\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Resolved full URL\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTargetDomain\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Domain of target URL\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eIsInternal\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// True if same domain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eIsSelf\u003c/span\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// True if self-link\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eSourceText\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Link text from source\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTargetText\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Title of target post (if internal)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eTemplate usage:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.inlinks %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003easide\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;backlinks\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ePages that link here\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% for link in post.inlinks %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ link.source_post.href }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ link.source_post.title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003easide\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.outlinks %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003easide\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;outlinks\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eLinks from this page\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% for link in post.outlinks %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ link.target_url }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                {% if link.is_internal %}{{ link.target_text }}{% else %}{{ link.target_domain }}{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% if not link.is_internal %}\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;external\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e↗\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003easide\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"chartjs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003echartjs\u003c/span\u003e \u003ca href=\"#chartjs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003echartjs\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Render (after render_markdown)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Converts \u003ccode\u003echartjs\u003c/code\u003e code blocks into interactive Chart.js charts.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eStatus:\u003c/strong\u003e Enabled by default. Set \u003ccode\u003eenabled = false\u003c/code\u003e to disable.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003echartjs\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                                         \u003cspan class=\"c\"\u003e# Enabled by default; set to false to disable\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecdn_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/assets/vendor/chartjs/chart.min.js\u0026#34;\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Chart.js URL (local by default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtainer_class\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;chartjs-container\u0026#34;\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# CSS class for wrapper div\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOptions:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable/disable the plugin\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecdn_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/assets/vendor/chartjs/chart.min.js\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChart.js URL (local by default)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econtainer_class\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003echartjs-container\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCSS class for wrapper div\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edata_display\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eopen\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInitial fallback disclosure state: \u003ccode\u003eopen\u003c/code\u003e or \u003ccode\u003ecollapsed\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eOptional top-level JSON strings \u003ccode\u003etitle\u003c/code\u003e and \u003ccode\u003ecaption\u003c/code\u003e create a semantic,\naccessible figure card without adding a TOC heading. Top-level \u003ccode\u003edata_display\u003c/code\u003e\noverrides the site default per chart. All three keys are stripped before Chart.js\ninitialization. See \u003ca href=\"../guides/markdown-chart-fallback.md\"\u003echart figures and fallbacks\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMarkdown syntax:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```chartjs\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;type\u0026#34;: \u0026#34;bar\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;data\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;labels\u0026#34;: [\u0026#34;Red\u0026#34;, \u0026#34;Blue\u0026#34;, \u0026#34;Yellow\u0026#34;],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;datasets\u0026#34;: [{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026#34;label\u0026#34;: \u0026#34;My Dataset\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026#34;data\u0026#34;: [12, 19, 3],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026#34;backgroundColor\u0026#34;: [\u0026#34;#ff6384\u0026#34;, \u0026#34;#36a2eb\u0026#34;, \u0026#34;#ffce56\u0026#34;]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eHTML output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;chartjs-container\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ecanvas\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;chart-abc123\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ecanvas\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003ectx\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetElementById\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;chart-abc123\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003egetContext\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;2d\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eChart\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ectx\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;bar\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;data\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\u003cspan class=\"p\"\u003e{...}});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e})();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eSupported chart types:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ebar\u003c/code\u003e, \u003ccode\u003eline\u003c/code\u003e, \u003ccode\u003epie\u003c/code\u003e, \u003ccode\u003edoughnut\u003c/code\u003e, \u003ccode\u003eradar\u003c/code\u003e, \u003ccode\u003epolarArea\u003c/code\u003e, \u003ccode\u003ebubble\u003c/code\u003e, \u003ccode\u003escatter\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eTemplate requirements:\u003c/strong\u003e\nInclude Chart.js in your base template:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/assets/vendor/chartjs/chart.min.js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"bar-chart-monthly-sales-data\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBar Chart - Monthly Sales Data\u003c/span\u003e \u003ca href=\"#bar-chart-monthly-sales-data\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eA simple bar chart showing monthly sales performance:\u003c/p\u003e\n\u003cdiv class=\"chartjs-container\"\u003e\n  \u003ccanvas id=\"chartjs-3\" hidden role=\"img\" aria-label=\"Chart visualization; expand Chart data for exact values\"\u003e\u003c/canvas\u003e\n  \u003cdiv id=\"chartjs-3-data\"\u003e\u003cdetails class=\"chartjs-data\" open\u003e\u003csummary\u003eChart data\u003c/summary\u003e\u003ctable\u003e\u003ccaption\u003eChart data\u003c/caption\u003e\u003cthead\u003e\u003ctr\u003e\u003cth scope=\"col\"\u003eLabel\u003c/th\u003e\u003cth scope=\"col\"\u003eMonthly Sales ($)\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eJanuary\u003c/th\u003e\u003ctd\u003e12500\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eFebruary\u003c/th\u003e\u003ctd\u003e19200\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eMarch\u003c/th\u003e\u003ctd\u003e15800\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eApril\u003c/th\u003e\u003ctd\u003e22400\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eMay\u003c/th\u003e\u003ctd\u003e18900\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eJune\u003c/th\u003e\u003ctd\u003e25600\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/details\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003ch4 id=\"line-chart-website-traffic-over-time\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLine Chart - Website Traffic Over Time\u003c/span\u003e \u003ca href=\"#line-chart-website-traffic-over-time\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eTrack trends with a line chart showing page views and unique visitors:\u003c/p\u003e\n\u003cdiv class=\"chartjs-container\"\u003e\n  \u003ccanvas id=\"chartjs-4\" hidden role=\"img\" aria-label=\"Chart visualization; expand Chart data for exact values\"\u003e\u003c/canvas\u003e\n  \u003cdiv id=\"chartjs-4-data\"\u003e\u003cdetails class=\"chartjs-data\" open\u003e\u003csummary\u003eChart data\u003c/summary\u003e\u003ctable\u003e\u003ccaption\u003eChart data\u003c/caption\u003e\u003cthead\u003e\u003ctr\u003e\u003cth scope=\"col\"\u003eLabel\u003c/th\u003e\u003cth scope=\"col\"\u003ePage Views\u003c/th\u003e\u003cth scope=\"col\"\u003eUnique Visitors\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eWeek 1\u003c/th\u003e\u003ctd\u003e2400\u003c/td\u003e\u003ctd\u003e1200\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eWeek 2\u003c/th\u003e\u003ctd\u003e3100\u003c/td\u003e\u003ctd\u003e1500\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eWeek 3\u003c/th\u003e\u003ctd\u003e2800\u003c/td\u003e\u003ctd\u003e1400\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eWeek 4\u003c/th\u003e\u003ctd\u003e4200\u003c/td\u003e\u003ctd\u003e2100\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eWeek 5\u003c/th\u003e\u003ctd\u003e3900\u003c/td\u003e\u003ctd\u003e1950\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eWeek 6\u003c/th\u003e\u003ctd\u003e5100\u003c/td\u003e\u003ctd\u003e2600\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/details\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003ch4 id=\"pie-chart-content-distribution\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePie Chart - Content Distribution\u003c/span\u003e \u003ca href=\"#pie-chart-content-distribution\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eVisualize proportions with a pie chart showing content by category:\u003c/p\u003e\n\u003cdiv class=\"chartjs-container\"\u003e\n  \u003ccanvas id=\"chartjs-5\" hidden role=\"img\" aria-label=\"Chart visualization; expand Chart data for exact values\"\u003e\u003c/canvas\u003e\n  \u003cdiv id=\"chartjs-5-data\"\u003e\u003cdetails class=\"chartjs-data\" open\u003e\u003csummary\u003eChart data\u003c/summary\u003e\u003ctable\u003e\u003ccaption\u003eChart data\u003c/caption\u003e\u003cthead\u003e\u003ctr\u003e\u003cth scope=\"col\"\u003eLabel\u003c/th\u003e\u003cth scope=\"col\"\u003eSeries 1\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eTutorials\u003c/th\u003e\u003ctd\u003e35\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eHow-To Guides\u003c/th\u003e\u003ctd\u003e25\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eReference Docs\u003c/th\u003e\u003ctd\u003e20\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eBlog Posts\u003c/th\u003e\u003ctd\u003e15\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eCase Studies\u003c/th\u003e\u003ctd\u003e5\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/details\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003ch4 id=\"doughnut-chart-with-center-text\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDoughnut Chart with Center Text\u003c/span\u003e \u003ca href=\"#doughnut-chart-with-center-text\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eA doughnut chart is useful for showing a primary metric with breakdown:\u003c/p\u003e\n\u003cdiv class=\"chartjs-container\"\u003e\n  \u003ccanvas id=\"chartjs-6\" hidden role=\"img\" aria-label=\"Chart visualization; expand Chart data for exact values\"\u003e\u003c/canvas\u003e\n  \u003cdiv id=\"chartjs-6-data\"\u003e\u003cdetails class=\"chartjs-data\" open\u003e\u003csummary\u003eChart data\u003c/summary\u003e\u003ctable\u003e\u003ccaption\u003eChart data\u003c/caption\u003e\u003cthead\u003e\u003ctr\u003e\u003cth scope=\"col\"\u003eLabel\u003c/th\u003e\u003cth scope=\"col\"\u003eSeries 1\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eCompleted\u003c/th\u003e\u003ctd\u003e68\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eIn Progress\u003c/th\u003e\u003ctd\u003e22\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eNot Started\u003c/th\u003e\u003ctd\u003e10\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/details\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003chr\u003e\n\u003ch3 id=\"contribution_graph\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003econtribution_graph\u003c/span\u003e \u003ca href=\"#contribution_graph\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003econtribution_graph\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Render (after render_markdown)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Renders GitHub-style calendar heatmaps showing activity over time using Cal-Heatmap.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econtribution_graph\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecdn_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/assets/vendor/cal-heatmap\u0026#34;\u003c/span\u003e                \u003cspan class=\"c\"\u003e# Cal-Heatmap base URL (local by default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtainer_class\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;contribution-graph-container\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;light\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escale_max_percentile\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOptions:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable/disable the plugin\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecdn_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/assets/vendor/cal-heatmap\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCal-Heatmap base URL (local by default)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econtainer_class\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003econtribution-graph-container\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCSS class for wrapper div\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etheme\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003elight\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eColor theme (light, dark)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003escale_max_percentile\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e0\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGlobal percentile cap for contribution graph color scaling\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eMarkdown syntax:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e``\u003cspan class=\"sb\"\u003e`contribution-graph\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  \u0026#34;data\u0026#34;: [\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;2024-01-01\u0026#34;, \u0026#34;value\u0026#34;: 5},\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;2024-01-02\u0026#34;, \u0026#34;value\u0026#34;: 3},\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;2024-01-03\u0026#34;, \u0026#34;value\u0026#34;: 8}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  ],\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  \u0026#34;options\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    \u0026#34;domain\u0026#34;: \u0026#34;year\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    \u0026#34;subDomain\u0026#34;: \u0026#34;day\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    \u0026#34;cellSize\u0026#34;: 12\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e`\u003c/span\u003e``\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eHTML output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;contribution-graph-container\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;contribution-graph-1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;stylesheet\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/assets/vendor/cal-heatmap/cal-heatmap.css\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/assets/vendor/cal-heatmap/cal-heatmap.min.js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;DOMContentLoaded\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003ecal\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eCalHeatmap\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003ecal\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epaint\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eitemSelector\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;#contribution-graph-1\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003esource\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[...],\u003c/span\u003e \u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;date\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;value\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003edomain\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;year\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003esubDomain\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;day\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eData format:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003edate\u003c/code\u003e: ISO date string (YYYY-MM-DD)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evalue\u003c/code\u003e: Numeric value (affects cell color intensity)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eOptions:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edomain\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eyear\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTime domain: year, month, week, day\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esubDomain\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eday\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSub-domain: day, hour, minute\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecellSize\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003enumber\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e10\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCell size in pixels\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erange\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003enumber\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNumber of domain units to display\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emaxValue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003enumber\u003c/td\u003e\n\u003ctd\u003eunset\u003c/td\u003e\n\u003ctd\u003eExplicit color-scale maximum\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emaxPercentile\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003enumber\u003c/td\u003e\n\u003ctd\u003eunset\u003c/td\u003e\n\u003ctd\u003ePer-graph percentile cap for the color scale\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe plugin also fits rendered graphs to narrow content columns automatically, so pages do not need custom resize JavaScript in markdown.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eUse cases:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBlog post publishing frequency\u003c/li\u003e\n\u003cli\u003eContribution tracking\u003c/li\u003e\n\u003cli\u003eHabit tracking displays\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eRelated:\u003c/strong\u003e [[analytics|Analytics Guide]]\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"one_line_link\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eone_line_link\u003c/span\u003e \u003ca href=\"#one_line_link\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eone_line_link\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Render (after render_markdown)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Expands standalone URLs in paragraphs into styled link preview cards.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eone_line_link\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecard_class\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;link-card\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efallback_title\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Link\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etimeout\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude_patterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;^https://twitter\\\\.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^https://x\\\\.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOptions:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable/disable the plugin\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecard_class\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003elink-card\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCSS class for the link card\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efallback_title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eLink\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTitle when metadata unavailable\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etimeout\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e5\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHTTP timeout in seconds\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexclude_patterns\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRegex patterns for URLs to skip\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eFinds paragraphs containing only a URL (\u003ccode\u003e\u0026lt;p\u0026gt;https://...\u0026lt;/p\u0026gt;\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eExtracts the domain from the URL\u003c/li\u003e\n\u003cli\u003eConverts to a styled link card\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eBefore:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ehttps://example.com/article\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eAfter:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com/article\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;link-card\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etarget\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;_blank\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;noopener noreferrer\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;link-card-content\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;link-card-title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eLink\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;link-card-url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eexample.com\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCSS example:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003elink-card\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eblock\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003epadding\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eborder\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"kc\"\u003esolid\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eborder\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eborder-radius\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003etext-decoration\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enone\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003etransition\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\u003ebox-shadow\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.2\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003elink-card\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003ehover\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ebox-shadow\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"nb\"\u003ergba\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003elink-card-title\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003efont-weight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ebold\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"kc\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003elink-card-url\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003efont-size\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.875\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"kc\"\u003etext\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003emuted\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"external_link_hover\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eexternal_link_hover\u003c/span\u003e \u003ca href=\"#external_link_hover\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eexternal_link_hover\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Render (after glossary, before templates)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Adds preview data to links that point to other sites, so the\ndefault theme shows a hover card with the page title, description, image, and\nsite icon.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eStatus:\u003c/strong\u003e Disabled by default. Set \u003ccode\u003eenabled = true\u003c/code\u003e to turn it on.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eexternal_link_hover\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efetch\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e           \u003cspan class=\"c\"\u003e# true: look up URLs missing from the embeds cache\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_image\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e    \u003cspan class=\"c\"\u003e# add the page\u0026#39;s preview image\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efavicon_service\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# e.g. \u0026#34;https://icons.duckduckgo.com/ip3/{host}.ico\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eignore_domains\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;localhost\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOptions:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable/disable the plugin\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efetch\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFetch oEmbed/Open Graph metadata for URLs that aren\u0026rsquo;t cached. When \u003ccode\u003efalse\u003c/code\u003e the plugin makes no network requests.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einclude_image\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAdd \u003ccode\u003edata-link-image\u003c/code\u003e when metadata has an image\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efavicon_service\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eURL template for a site icon; \u003ccode\u003e{host}\u003c/code\u003e and \u003ccode\u003e{origin}\u003c/code\u003e are replaced. Empty disables icons.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eignore_domains\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHosts (and their subdomains) that never get cards\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eWhere the data comes from\u003c/strong\u003e (first match wins per field):\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eThe embeds metadata cache (\u003ccode\u003e[embeds] cache_dir\u003c/code\u003e, default \u003ccode\u003e.cache/embeds\u003c/code\u003e):\noEmbed first, then Open Graph. With \u003ccode\u003efetch = true\u003c/code\u003e, missing URLs are\nfetched once per build using the embeds \u003ccode\u003eresolution_strategy\u003c/code\u003e, \u003ccode\u003etimeout\u003c/code\u003e,\nand cache settings, and the result is cached for later builds.\u003c/li\u003e\n\u003cli\u003eYour \u003ccode\u003e[[markata-go.blogroll.feeds]]\u003c/code\u003e entries, matched by host: \u003ccode\u003etitle\u003c/code\u003e,\n\u003ccode\u003edescription\u003c/code\u003e, and \u003ccode\u003eimage_url\u003c/code\u003e. This works even when blogroll is disabled.\u003c/li\u003e\n\u003cli\u003eThe link\u0026rsquo;s Markdown title (\u003ccode\u003e[text](url \u0026quot;title\u0026quot;)\u003c/code\u003e), used as the description.\u003c/li\u003e\n\u003cli\u003eThe host name, so every external link gets at least a small card.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eSkipped links:\u003c/strong\u003e links to your own site (\u003ccode\u003eurl\u003c/code\u003e), relative links, private\nposts, posts with \u003ccode\u003eskip: true\u003c/code\u003e, ignored domains, links that already have\nhover data (\u003ccode\u003edata-hover-*\u003c/code\u003e, \u003ccode\u003edata-link-preview\u003c/code\u003e), links with\n\u003ccode\u003edata-no-preview\u003c/code\u003e, and links created by other features (wikilinks, mentions,\nglossary terms, heading anchors, embed and link cards).\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eData attributes added:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAttribute\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edata-link-preview\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMarks the link for the hover card\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edata-link-host\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHost name (always set)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edata-link-title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePage title (max 140 characters)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edata-link-description\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePage description (max 280 characters)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edata-link-site\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite or provider name\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edata-link-image\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePreview image URL (if \u003ccode\u003einclude_image\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edata-link-icon\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite icon URL (if \u003ccode\u003efavicon_service\u003c/code\u003e is set)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eBefore:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://github.com/WaylonWalker/markata-go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003emarkata-go repo\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eAfter:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://github.com/WaylonWalker/markata-go\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003edata-link-preview\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"na\"\u003edata-link-host\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;github.com\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003edata-link-title\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;GitHub - WaylonWalker/markata-go\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"na\"\u003edata-link-description\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Contribute to WaylonWalker/markata-go development...\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"na\"\u003edata-link-site\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;GitHub\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003edata-link-image\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://opengraph.githubassets.com/...\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003emarkata-go repo\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePrivacy:\u003c/strong\u003e With the defaults, the build makes no requests, and readers'\nbrowsers only load a preview image when they hover a link. Setting\n\u003ccode\u003efavicon_service\u003c/code\u003e makes browsers request icons from that service as the card\nopens, and \u003ccode\u003efetch = true\u003c/code\u003e makes the build request each linked page once.\u003c/p\u003e\n\u003cp\u003eSee \u003ca href=\"/docs/guides/markdown/#external-link-cards\"\u003eHover Cards\u003c/a\u003e for how the card\nlooks and how to style it.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"wikilink_hover\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ewikilink_hover\u003c/span\u003e \u003ca href=\"#wikilink_hover\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003ewikilink_hover\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Render (after wikilinks)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Adds hover preview data attributes to wikilinks for tooltip/popup previews.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eStatus:\u003c/strong\u003e Enabled by default. Set \u003ccode\u003eenabled = false\u003c/code\u003e to disable.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewikilink_hover\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e           \u003cspan class=\"c\"\u003e# Enabled by default; set to false to disable\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epreview_length\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e200\u003c/span\u003e     \u003cspan class=\"c\"\u003e# Max characters for preview text\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_image\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e     \u003cspan class=\"c\"\u003e# Add preview image if available\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escreenshot_service\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Optional: \u0026#34;https://screenshot.example.com/capture?url=\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOptions:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable/disable the plugin\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epreview_length\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e200\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMax characters for preview text\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einclude_image\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAdd preview image if available\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003escreenshot_service\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eURL prefix for screenshot service\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eFinds \u003ccode\u003e\u0026lt;a class=\u0026quot;wikilink\u0026quot;\u0026gt;\u003c/code\u003e tags created by the wikilinks plugin\u003c/li\u003e\n\u003cli\u003eLooks up the target post by href\u003c/li\u003e\n\u003cli\u003eAdds data attributes for hover previews\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eData attributes added:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAttribute\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edata-preview\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTruncated description or content\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edata-preview-image\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFeatured image URL (if available)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edata-preview-screenshot\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eScreenshot service URL (if configured)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eBefore:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/my-post/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;wikilink\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eMy Post\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eAfter:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/my-post/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;wikilink\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"na\"\u003edata-preview\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;This is a description of the post...\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"na\"\u003edata-preview-image\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/featured.jpg\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eMy Post\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eHover display:\u003c/strong\u003e The default theme\u0026rsquo;s \u003ccode\u003ejs/tooltips.js\u003c/code\u003e renders the card for\nevery wikilink with a \u003ccode\u003edata-title\u003c/code\u003e (added by the \u003ccode\u003ewikilinks\u003c/code\u003e plugin), falling\nback to \u003ccode\u003edata-preview\u003c/code\u003e when the target has no description. You don\u0026rsquo;t need to\nwrite any JavaScript. See \u003ca href=\"/docs/guides/markdown/#hover-cards\"\u003eHover Cards\u003c/a\u003e for\nstyling and for adding cards to glossary terms or your own elements.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eImage field lookup order:\u003c/strong\u003e\nThe plugin checks these Extra fields for images:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003eimage\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efeatured_image\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecover_image\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eog_image\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ethumbnail\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"examples-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"basic-wikilink-with-hover-preview\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Wikilink with Hover Preview\u003c/span\u003e \u003ca href=\"#basic-wikilink-with-hover-preview\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eWhen you link to another post using wikilink syntax, the hover plugin automatically adds preview data:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMarkdown input:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLearn more about [[getting-started|getting started with markata-go]].\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFor advanced users, check out [[plugin-development]].\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eRendered HTML (with hover data):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/getting-started/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;wikilink\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"na\"\u003edata-preview\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;A comprehensive guide to installing and configuring markata-go for your first static site project.\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"na\"\u003edata-preview-image\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/getting-started-hero.jpg\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003egetting started with markata-go\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/plugin-development/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;wikilink\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"na\"\u003edata-preview\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Learn how to extend markata-go with custom plugins that hook into the build lifecycle.\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ePlugin Development\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"styling-hover-previews\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStyling Hover Previews\u003c/span\u003e \u003ca href=\"#styling-hover-previews\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eThe built-in card uses the \u003ccode\u003ehover-card\u003c/code\u003e and \u003ccode\u003ewikilink-tooltip\u003c/code\u003e classes and\nfollows the active palette. Override them in your site CSS:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehover-card\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ewikilink-tooltip\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003emax-width\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e26\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehover-card\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003etooltip-path\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enone\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"using-screenshot-service-for-external-previews\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing Screenshot Service for External Previews\u003c/span\u003e \u003ca href=\"#using-screenshot-service-for-external-previews\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eConfigure a screenshot service for richer previews:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewikilink_hover\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epreview_length\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e200\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_image\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escreenshot_service\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://api.microlink.io/?screenshot=true\u0026amp;url=\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis adds a \u003ccode\u003edata-preview-screenshot\u003c/code\u003e attribute for external screenshot generation:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/complex-diagrams/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;wikilink\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"na\"\u003edata-preview\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Learn to create complex diagrams with Mermaid.js\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"na\"\u003edata-preview-screenshot\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://api.microlink.io/?screenshot=true\u0026amp;url=https://mysite.com/complex-diagrams/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   Complex Diagrams\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"encryption\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eencryption\u003c/span\u003e \u003ca href=\"#encryption\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eencryption\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Render (priority 50 \u0026ndash; after markdown rendering, before templates)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Encrypts content for private posts using AES-256-GCM client-side encryption.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eStatus:\u003c/strong\u003e Enabled by default with \u003ccode\u003edefault_key = \u0026quot;default\u0026quot;\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eencryption\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault_key\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edecryption_hint\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Contact me for access\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eencryption\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprivate_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ediary\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;personal\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eApplies \u003ccode\u003eprivate_tags\u003c/code\u003e config \u0026ndash; posts with matching tags are marked \u003ccode\u003eprivate: true\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eValidates that every private post has an available encryption key\u003c/li\u003e\n\u003cli\u003eIf any private post has no key, returns a \u003cstrong\u003eCriticalError\u003c/strong\u003e that halts the build\u003c/li\u003e\n\u003cli\u003eEncrypts \u003ccode\u003eArticleHTML\u003c/code\u003e of each private post with the resolved key\u003c/li\u003e\n\u003cli\u003eReplaces content with an encrypted wrapper containing a password prompt\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eEncryption keys\u003c/strong\u003e are loaded from environment variables:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_KEY_DEFAULT\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003epassword\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_KEY_PERSONAL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003eanother-password\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePost fields read:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ePrivate\u003c/code\u003e \u0026ndash; whether the post is private\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eSecretKey\u003c/code\u003e \u0026ndash; which encryption key to use (set via \u003ccode\u003esecret_key\u003c/code\u003e, \u003ccode\u003eprivate_key\u003c/code\u003e, or \u003ccode\u003eencryption_key\u003c/code\u003e frontmatter)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eTags\u003c/code\u003e \u0026ndash; checked against \u003ccode\u003eprivate_tags\u003c/code\u003e config\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eArticleHTML\u003c/code\u003e \u0026ndash; the content to encrypt\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003ePost fields set:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eArticleHTML\u003c/code\u003e \u0026ndash; replaced with encrypted wrapper HTML\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eExtra[\u0026quot;has_encrypted_content\u0026quot;]\u003c/code\u003e \u0026ndash; \u003ccode\u003etrue\u003c/code\u003e (for template script inclusion)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eExtra[\u0026quot;encryption_key_name\u0026quot;]\u003c/code\u003e \u0026ndash; the key name used\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eRelated:\u003c/strong\u003e See the \u003ca href=\"/docs/guides/encryption/\"\u003eEncryption Guide\u003c/a\u003e for complete usage documentation.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"collect-stage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCollect Stage\u003c/span\u003e \u003ca href=\"#collect-stage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"overwrite_check\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eoverwrite_check\u003c/span\u003e \u003ca href=\"#overwrite_check\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eoverwrite_check\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Collect (early priority)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Detects when multiple posts or feeds would write to the same output path, preventing accidental content overwrites and catching slug conflicts early in the build.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration:\u003c/strong\u003e No user-facing configuration required. The plugin runs automatically.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eRuns early in the Collect stage (before feeds plugin)\u003c/li\u003e\n\u003cli\u003eChecks all post output paths (\u003ccode\u003e{output_dir}/{slug}/index.html\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eChecks all feed output paths (HTML, RSS, Atom, JSON)\u003c/li\u003e\n\u003cli\u003eDetects conflicts where multiple sources would write to the same file\u003c/li\u003e\n\u003cli\u003eFails the build with detailed error messages\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eError Output Example:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003edetected 2 output path conflict(s):\n  - markout/about/index.html: post:content/about.md, feed:about\n  - markout/blog/index.html: post:content/blog.md, post:content/blog-page.md\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eCommon Conflict Scenarios:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003ePost and feed with same slug:\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# content/about.md\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;about\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# markata-go.toml - conflicts!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;about\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e\u003cstrong\u003eTwo posts with same slug:\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# content/post-a.md\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;my-page\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# content/post-b.md\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;my-page\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Conflict!\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eResolution strategies:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRename one of the conflicting slugs\u003c/li\u003e\n\u003cli\u003eUse different paths for feeds vs content\u003c/li\u003e\n\u003cli\u003eRemove duplicate content\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFiles checked for conflicts:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSource\u003c/th\u003e\n\u003cth\u003eOutput Path\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003ePost\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{output_dir}/{slug}/index.html\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFeed HTML\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{output_dir}/{feed_slug}/index.html\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFeed RSS\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{output_dir}/{feed_slug}/rss.xml\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFeed Atom\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{output_dir}/{feed_slug}/atom.xml\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFeed JSON\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{output_dir}/{feed_slug}/index.json\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch3 id=\"static_file_conflicts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003estatic_file_conflicts\u003c/span\u003e \u003ca href=\"#static_file_conflicts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003estatic_file_conflicts\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Collect (late priority)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Detects when static files in the \u003ccode\u003estatic/\u003c/code\u003e directory would silently clobber generated content, causing unexpected behavior like private posts not being added to robots.txt.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estatic_file_conflicts\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Enable/disable the lint rule (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estatic_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;static\u0026#34;\u003c/span\u003e \u003cspan class=\"c\"\u003e# Static files directory (default: \u0026#34;static\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eRuns late in the Collect stage (after content is processed)\u003c/li\u003e\n\u003cli\u003eScans the \u003ccode\u003estatic/\u003c/code\u003e directory for files\u003c/li\u003e\n\u003cli\u003eChecks for posts that would generate root-level files (robots.md → robots.txt)\u003c/li\u003e\n\u003cli\u003eChecks for feed output paths (rss.xml, atom.xml, sitemap.xml)\u003c/li\u003e\n\u003cli\u003eReports warnings when conflicts are detected\u003c/li\u003e\n\u003cli\u003eContinues the build (non-blocking warning)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eWarning Output Example:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eWARNING: 2 static file conflict(s) detected\nStatic files will override generated content.\n\n  Conflicting /robots.txt:\n    Generated: pages/robots.md → /robots.txt\n    Static:    static/robots.txt → /robots.txt\n    The static file will override the generated one.\n\n  Conflicting /sitemap.xml:\n    Generated: sitemap → /sitemap.xml\n    Static:    static/sitemap.xml → /sitemap.xml\n    The static file will override the generated one.\n\nTo fix:\n  - Remove the static file if you want the generated version\n  - Remove or rename the source file if you want the static version\n  - Disable the static_file_conflicts lint rule in config if intentional\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eCommon Conflict Scenarios:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003erobots.txt conflict:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epages/robots.md     → generates /robots.txt (with private posts excluded)\nstatic/robots.txt   → copied to /robots.txt (overwrites generated)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eImpact:\u003c/strong\u003e Private posts may NOT be added to robots.txt Disallow rules.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003esitemap.xml conflict:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eSitemap plugin      → generates /sitemap.xml\nstatic/sitemap.xml  → overwrites with static version\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eImpact:\u003c/strong\u003e New posts won\u0026rsquo;t appear in the sitemap for search engines.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eFeed conflicts:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eRSS plugin          → generates /rss.xml\nstatic/rss.xml      → overwrites with static version\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eChecked file patterns:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eGenerated Source\u003c/th\u003e\n\u003cth\u003eChecks For Static File\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erobots.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estatic/robots.txt\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esitemap.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estatic/sitemap.xml\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehumans.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estatic/humans.txt\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esecurity.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estatic/security.txt\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emanifest.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estatic/manifest.json\u003c/code\u003e, \u003ccode\u003estatic/manifest.webmanifest\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRSS feed\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estatic/rss.xml\u003c/code\u003e, \u003ccode\u003estatic/feed.xml\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAtom feed\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estatic/atom.xml\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJSON feed\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estatic/index.json\u003c/code\u003e, \u003ccode\u003estatic/feed.json\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eDisabling the lint rule:\u003c/strong\u003e\nIf the conflict is intentional (you specifically want the static file to override):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estatic_file_conflicts\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eRelated:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e[[#overwrite_check|overwrite_check]] - Detects conflicts between generated files\u003c/li\u003e\n\u003cli\u003e[[#static_assets|static_assets]] - Copies static files to output\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"series\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eseries\u003c/span\u003e \u003ca href=\"#series\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eseries\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Collect (PriorityEarly)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Scans posts for \u003ccode\u003eseries\u003c/code\u003e frontmatter and auto-generates series feed configs with prev/next navigation for sequential reading.\u003c/p\u003e\n\u003cp\u003ePosts declare series membership with \u003ccode\u003eseries: \u0026quot;series-name\u0026quot;\u003c/code\u003e in frontmatter. The plugin groups posts by series, sorts them (by \u003ccode\u003eseries_order\u003c/code\u003e or date ascending), sets prev/next navigation, and injects series \u003ccode\u003eFeedConfig\u003c/code\u003e entries so the feeds plugin renders them.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFrontmatter:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Part 1: Getting Started\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Building a CLI in Go\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries_order\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# optional, defaults to date-ascending order\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug_prefix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;series\u0026#34;\u003c/span\u003e     \u003cspan class=\"c\"\u003e# URL prefix (default: \u0026#34;series\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_sidebar\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Auto-enable feed sidebar (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefaults\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e         \u003cspan class=\"c\"\u003e# No pagination by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e             \u003cspan class=\"c\"\u003e# Show sidebar on series posts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Per-series overrides (keyed by series name)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eoverrides\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;building-a-cli-in-go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Building a CLI in Go\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;A step-by-step guide to building CLIs with Go and Cobra\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePosts can belong to only one series\u003c/li\u003e\n\u003cli\u003eSeries feeds are created at \u003ccode\u003e/{slug_prefix}/{series-slug}/\u003c/code\u003e (e.g., \u003ccode\u003e/series/building-a-cli-in-go/\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003ePosts within a series get Prev/Next navigation and position indicators (\u0026ldquo;Part X of Y\u0026rdquo;)\u003c/li\u003e\n\u003cli\u003eSeries feeds automatically show in the feed sidebar, taking precedence over other feeds\u003c/li\u003e\n\u003cli\u003eFeed type is set to \u003ccode\u003eFeedTypeSeries\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eRuns before the \u003ccode\u003efeeds\u003c/code\u003e plugin so generated configs are available for processing\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eRelated:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e[[series-guide|Series Guide]] - Complete usage documentation\u003c/li\u003e\n\u003cli\u003e[[\u003ca href=\"/tags/feeds/\" class=\"hashtag-tag\" data-tag=\"feeds\" data-count=9 data-reading-time=51 data-reading-time-text=\"51 minutes\"\u003e#feeds\u003c/a\u003e|feeds]] - Processes the feed configs generated by this plugin\u003c/li\u003e\n\u003cli\u003e[[#prevnext|prevnext]] - Calculates prev/next from feeds and series\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003efeeds\u003c/span\u003e \u003ca href=\"#feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003efeeds\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Collect\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Processes configured feed definitions, filtering, sorting, and paginating posts.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog Posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;All blog posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == true and not draft\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tags contains \u0026#39;tutorial\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eFeed configuration options:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eslug\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003erequired\u003c/td\u003e\n\u003ctd\u003eURL path for the feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u0026quot;\u0026rdquo;\u003c/td\u003e\n\u003ctd\u003eFeed title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edescription\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u0026quot;\u0026quot;\u003c/td\u003e\n\u003ctd\u003eFeed description\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efilter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u0026quot;\u0026quot;\u003c/td\u003e\n\u003ctd\u003eFilter expression\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esort\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u0026ldquo;date\u0026rdquo;\u003c/td\u003e\n\u003ctd\u003eSort field\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ereverse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003etrue\u003c/td\u003e\n\u003ctd\u003eReverse sort order\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eitems_per_page\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e10\u003c/td\u003e\n\u003ctd\u003ePosts per page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eformats\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003evaries\u003c/td\u003e\n\u003ctd\u003eOutput formats\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eFilter expression syntax:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Equality\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == true\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;category == \u0026#39;news\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Contains (for arrays)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tags contains \u0026#39;go\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Boolean combinations\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == true and not draft\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tags contains \u0026#39;go\u0026#39; or tags contains \u0026#39;python\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Comparisons\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date \u0026gt;= \u0026#39;2024-01-01\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSee [[feeds-guide|Feeds Guide]] for complete filter syntax.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"auto_feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eauto_feeds\u003c/span\u003e \u003ca href=\"#auto_feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eauto_feeds\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Collect\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Automatically generates feeds for tags, categories, and date archives.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauto_feeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug_prefix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tags\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Results in /tags/python/, /tags/go/, etc.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauto_feeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauto_feeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecategories\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug_prefix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;categories\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauto_feeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecategories\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauto_feeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003earchives\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug_prefix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;archive\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eyearly_feeds\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e   \u003cspan class=\"c\"\u003e# /archive/2024/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emonthly_feeds\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e \u003cspan class=\"c\"\u003e# /archive/2024/01/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauto_feeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003earchives\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eGenerated feeds:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eFor tags:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/tags/python/\u003c/code\u003e - Posts tagged \u0026ldquo;python\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/tags/go/\u003c/code\u003e - Posts tagged \u0026ldquo;go\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFor categories (uses \u003ccode\u003ecategory\u003c/code\u003e field from post Extra):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/categories/tutorials/\u003c/code\u003e - Posts in tutorials category\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFor archives:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/archive/2024/\u003c/code\u003e - All posts from 2024\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/archive/2024/01/\u003c/code\u003e - All posts from January 2024 (if monthly enabled)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"prevnext\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eprevnext\u003c/span\u003e \u003ca href=\"#prevnext\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eprevnext\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Collect\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Calculates previous/next post links for navigation based on feed ordering.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprevnext\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e           \u003cspan class=\"c\"\u003e# Enable/disable the plugin (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estrategy\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;first_feed\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Strategy for determining navigation context\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault_feed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Default feed slug (for \u0026#34;explicit_feed\u0026#34; strategy)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eStrategy options:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eStrategy\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efirst_feed\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUse the first feed that contains the post (default)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexplicit_feed\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAlways use the feed specified in \u003ccode\u003edefault_feed\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eseries\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUse \u003ccode\u003eseries\u003c/code\u003e frontmatter field, fall back to \u003ccode\u003efirst_feed\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efrontmatter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUse \u003ccode\u003eprevnext_feed\u003c/code\u003e frontmatter field, fall back to \u003ccode\u003efirst_feed\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eRuns after the \u003ccode\u003efeeds\u003c/code\u003e plugin to access feed data\u003c/li\u003e\n\u003cli\u003eFor each post, determines which feed to use based on strategy\u003c/li\u003e\n\u003cli\u003eFinds the post\u0026rsquo;s position within that feed\u003c/li\u003e\n\u003cli\u003eSets \u003ccode\u003ePrev\u003c/code\u003e and \u003ccode\u003eNext\u003c/code\u003e post references\u003c/li\u003e\n\u003cli\u003eSets \u003ccode\u003ePrevNextContext\u003c/code\u003e with additional navigation metadata\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003ePost fields set:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eprev\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e*Post\u003c/td\u003e\n\u003ctd\u003ePrevious post in sequence (nil if first)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enext\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e*Post\u003c/td\u003e\n\u003ctd\u003eNext post in sequence (nil if last)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eprev_next_feed\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eFeed slug used for navigation\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eprev_next_context\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e*PrevNextContext\u003c/td\u003e\n\u003ctd\u003eFull navigation context\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003ePrevNextContext structure:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ePrevNextContext\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eFeedSlug\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Slug of the feed used\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eFeedTitle\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Title of the feed\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePosition\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 1-indexed position in feed\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTotal\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Total posts in feed\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePrev\u003c/span\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003ePost\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Previous post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eNext\u003c/span\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003ePost\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Next post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eTemplate usage:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.Prev or post.Next %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post-navigation\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if post.Prev %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Prev.Href }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;nav-prev\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;nav-label\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ePrevious\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;nav-title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Prev.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if post.Next %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Next.Href }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;nav-next\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;nav-label\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eNext\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;nav-title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Next.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- With context --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.PrevNextContext %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;series-progress\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Post {{ post.PrevNextContext.Position }} of {{ post.PrevNextContext.Total }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    in {{ post.PrevNextContext.FeedTitle }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eUsing series for tutorials:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Part 2: Advanced Topics\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;go-tutorial\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprevnext\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estrategy\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;series\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"write-stage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWrite Stage\u003c/span\u003e \u003ca href=\"#write-stage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"publish_html\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003epublish_html\u003c/span\u003e \u003ca href=\"#publish_html\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003epublish_html\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Write\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Writes individual post HTML files to the output directory.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration:\u003c/strong\u003e Uses \u003ccode\u003eoutput_dir\u003c/code\u003e from main config.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eSkips posts marked as skip, unpublished, or draft\u003c/li\u003e\n\u003cli\u003eCreates directory: \u003ccode\u003e{output_dir}/{slug}/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eWrites \u003ccode\u003eindex.html\u003c/code\u003e with post\u0026rsquo;s HTML content\u003c/li\u003e\n\u003cli\u003eUses \u003ccode\u003epost.HTML\u003c/code\u003e if available, otherwise wraps \u003ccode\u003eArticleHTML\u003c/code\u003e in basic template\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eOutput structure:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eoutput/\n  getting-started/\n    index.html\n  advanced-topics/\n    index.html\n  my-first-post/\n    index.html\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch3 id=\"random_post\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003erandom_post\u003c/span\u003e \u003ca href=\"#random_post\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003erandom_post\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Write\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Writes a static \u003ccode\u003e/random/\u003c/code\u003e page that picks a random eligible post in the browser.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erandom_post\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epath\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;random\u0026#34;\u003c/span\u003e               \u003cspan class=\"c\"\u003e# default: \u0026#34;random\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude_tags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;draft\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e      \u003cspan class=\"c\"\u003e# optional\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eemit_posts_json\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e        \u003cspan class=\"c\"\u003e# optional\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutputs:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/{path}/index.html\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/{path}/posts.json\u003c/code\u003e (optional)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eEligibility (defaults):\u003c/strong\u003e published, not draft/private/skip, and not tagged with any \u003ccode\u003eexclude_tags\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eWarm builds replace a page previously generated by this plugin. A real post at\n\u003ccode\u003e/{path}/\u003c/code\u003e remains a route collision; the homepage \u003ccode\u003e/\u003c/code\u003e is not one.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"well_known\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ewell_known\u003c/span\u003e \u003ca href=\"#well_known\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003ewell_known\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Write\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Generates \u003ccode\u003e.well-known\u003c/code\u003e endpoints from site metadata.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration:\u003c/strong\u003e \u003ccode\u003emarkata-go.well_known\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eResolves enabled entries from \u003ccode\u003eauto_generate\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eRenders templates in \u003ccode\u003etemplates/well-known/\u003c/code\u003e if present\u003c/li\u003e\n\u003cli\u003eWrites files into \u003ccode\u003eoutput/.well-known/\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eGenerated files (defaults):\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/host-meta\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/host-meta.json\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/webfinger\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/nodeinfo\u003c/code\u003e and \u003ccode\u003e/nodeinfo/2.0\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/time\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/links\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/internal-links\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/external-links/index.html\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/internal-links/index.html\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eOptional files:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/sshfp\u003c/code\u003e (when \u003ccode\u003essh_fingerprint\u003c/code\u003e is set)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/.well-known/keybase.txt\u003c/code\u003e (when \u003ccode\u003ekeybase_username\u003c/code\u003e is set)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eTemplate overrides \u0026amp; context:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTemplates in \u003ccode\u003etemplates/well-known/\u003c/code\u003e override the built-in host discovery responses.\u003c/li\u003e\n\u003cli\u003eThemes or sites can provide \u003ccode\u003etemplates/external-links.html\u003c/code\u003e (for \u003ccode\u003e/external-links/\u003c/code\u003e) and \u003ccode\u003etemplates/internal-links.html\u003c/code\u003e (for \u003ccode\u003e/internal-links/\u003c/code\u003e).\u003c/li\u003e\n\u003cli\u003eWhen rendering the link pages, the context includes \u003ccode\u003ewell_known_links\u003c/code\u003e (outbound domain buckets) and \u003ccode\u003ewell_known_internal_links\u003c/code\u003e (internal target buckets) in addition to \u003ccode\u003ewell_known\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eTemplate context additions:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ewell_known_links\u003c/code\u003e: list of \u003ccode\u003e{domain, count, links}\u003c/code\u003e objects describing outbound destinations.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ewell_known_internal_links\u003c/code\u003e: list of \u003ccode\u003e{targetUrl, count, links}\u003c/code\u003e objects describing grouped internal targets.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"publish_feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003epublish_feeds\u003c/span\u003e \u003ca href=\"#publish_feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003epublish_feeds\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Write\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Writes feed output files in all configured formats (HTML, RSS, Atom, JSON, Markdown, Text).\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\nFor each feed, generates enabled formats:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFormat\u003c/th\u003e\n\u003cth\u003eFile\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eHTML\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eindex.html\u003c/code\u003e, \u003ccode\u003epage/2/index.html\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePaginated HTML pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRSS\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003erss.xml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRSS 2.0 feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAtom\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eatom.xml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAtom 1.0 feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJSON\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efeed.json\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eJSON Feed 1.1\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMarkdown\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eslug.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMarkdown listing\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eText\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eslug.txt\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePlain text listing\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eOutput structure:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eoutput/\n  blog/\n    index.html      # Page 1\n    page/\n      2/\n        index.html  # Page 2\n      3/\n        index.html  # Page 3\n    rss.xml\n    atom.xml\n    feed.json\n  tags/\n    python/\n      index.html\n      rss.xml\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch3 id=\"llms_txt\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ellms_txt\u003c/span\u003e \u003ca href=\"#llms_txt\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003ellms_txt\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Write (last priority)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Automatically generate a concise v2-style \u003ccode\u003e/llms.txt\u003c/code\u003e index\nfor AI agents from public site metadata and selected published pages.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration:\u003c/strong\u003e \u003ccode\u003e[markata-go.llms_txt]\u003c/code\u003e with \u003ccode\u003eenabled = true\u003c/code\u003e and\n\u003ccode\u003emax_pages = 30\u003c/code\u003e defaults. Caps output at 100 entries. Drafts, private,\nskipped, unpublished, and \u003ccode\u003enoindex\u003c/code\u003e posts are excluded. The generator\nuses \u003ccode\u003e.md\u003c/code\u003e links when Markdown post output is enabled.\u003c/p\u003e\n\u003cp\u003eA published \u003ccode\u003ellms.md\u003c/code\u003e or project static \u003ccode\u003ellms.txt\u003c/code\u003e wins over auto\ngeneration; existing manual output is also preserved. Disabling only\ndeletes content identified as automatically generated. Excluded from\nsingle-page builds.\u003c/p\u003e\n\u003ch3 id=\"sitemap\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003esitemap\u003c/span\u003e \u003ca href=\"#sitemap\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003esitemap\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Write\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Generates a sitemap.xml file listing all published posts and feed pages.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration:\u003c/strong\u003e None (uses \u003ccode\u003eurl\u003c/code\u003e from main config for absolute URLs)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eAdds home page with highest priority\u003c/li\u003e\n\u003cli\u003eAdds all published posts with their dates\u003c/li\u003e\n\u003cli\u003eAdds feed index pages\u003c/li\u003e\n\u003cli\u003eWrites to \u003ccode\u003e{output_dir}/sitemap.xml\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eOutput example:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;urlset\u003c/span\u003e \u003cspan class=\"na\"\u003exmlns=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;http://www.sitemaps.org/schemas/sitemap/0.9\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;url\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;loc\u0026gt;\u003c/span\u003ehttps://example.com/\u003cspan class=\"nt\"\u003e\u0026lt;/loc\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;lastmod\u0026gt;\u003c/span\u003e2024-01-15\u003cspan class=\"nt\"\u003e\u0026lt;/lastmod\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;changefreq\u0026gt;\u003c/span\u003edaily\u003cspan class=\"nt\"\u003e\u0026lt;/changefreq\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;priority\u0026gt;\u003c/span\u003e1.0\u003cspan class=\"nt\"\u003e\u0026lt;/priority\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;/url\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;url\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;loc\u0026gt;\u003c/span\u003ehttps://example.com/my-post/\u003cspan class=\"nt\"\u003e\u0026lt;/loc\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;lastmod\u0026gt;\u003c/span\u003e2024-01-15\u003cspan class=\"nt\"\u003e\u0026lt;/lastmod\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;changefreq\u0026gt;\u003c/span\u003eweekly\u003cspan class=\"nt\"\u003e\u0026lt;/changefreq\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;priority\u0026gt;\u003c/span\u003e0.8\u003cspan class=\"nt\"\u003e\u0026lt;/priority\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;/url\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;/urlset\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"rss\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003erss\u003c/span\u003e \u003ca href=\"#rss\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003erss\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Write (utility)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Generates RSS 2.0 feeds. Used by \u003ccode\u003epublish_feeds\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput format:\u003c/strong\u003e RSS 2.0 with Atom namespace for self-reference.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eExample output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;rss\u003c/span\u003e \u003cspan class=\"na\"\u003eversion=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;2.0\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003exmlns:atom=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;http://www.w3.org/2005/Atom\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;channel\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003eMy Blog\u003cspan class=\"nt\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;link\u0026gt;\u003c/span\u003ehttps://example.com\u003cspan class=\"nt\"\u003e\u0026lt;/link\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;description\u0026gt;\u003c/span\u003eA blog about things\u003cspan class=\"nt\"\u003e\u0026lt;/description\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;language\u0026gt;\u003c/span\u003een-us\u003cspan class=\"nt\"\u003e\u0026lt;/language\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;lastBuildDate\u0026gt;\u003c/span\u003eMon, 15 Jan 2024 10:00:00 +0000\u003cspan class=\"nt\"\u003e\u0026lt;/lastBuildDate\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;atom:link\u003c/span\u003e \u003cspan class=\"na\"\u003ehref=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com/blog/rss.xml\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;self\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/rss+xml\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;item\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003eMy First Post\u003cspan class=\"nt\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026lt;link\u0026gt;\u003c/span\u003ehttps://example.com/my-first-post/\u003cspan class=\"nt\"\u003e\u0026lt;/link\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026lt;description\u0026gt;\u003c/span\u003ePost description or excerpt...\u003cspan class=\"nt\"\u003e\u0026lt;/description\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026lt;pubDate\u0026gt;\u003c/span\u003eMon, 15 Jan 2024 10:00:00 +0000\u003cspan class=\"nt\"\u003e\u0026lt;/pubDate\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026lt;guid\u003c/span\u003e \u003cspan class=\"na\"\u003eisPermaLink=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003ehttps://example.com/my-first-post/\u003cspan class=\"nt\"\u003e\u0026lt;/guid\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;/item\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;/channel\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;/rss\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"atom\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eatom\u003c/span\u003e \u003ca href=\"#atom\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eatom\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Write (utility)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Generates Atom 1.0 feeds. Used by \u003ccode\u003epublish_feeds\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput format:\u003c/strong\u003e Atom 1.0\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eExample output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;feed\u003c/span\u003e \u003cspan class=\"na\"\u003exmlns=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;http://www.w3.org/2005/Atom\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003eMy Blog\u003cspan class=\"nt\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;id\u0026gt;\u003c/span\u003ehttps://example.com/blog/atom.xml\u003cspan class=\"nt\"\u003e\u0026lt;/id\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;updated\u0026gt;\u003c/span\u003e2024-01-15T10:00:00Z\u003cspan class=\"nt\"\u003e\u0026lt;/updated\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;link\u003c/span\u003e \u003cspan class=\"na\"\u003ehref=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text/html\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;link\u003c/span\u003e \u003cspan class=\"na\"\u003ehref=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com/blog/atom.xml\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;self\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/atom+xml\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;author\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;name\u0026gt;\u003c/span\u003eAuthor Name\u003cspan class=\"nt\"\u003e\u0026lt;/name\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;/author\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;entry\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003eMy First Post\u003cspan class=\"nt\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;id\u0026gt;\u003c/span\u003ehttps://example.com/my-first-post/\u003cspan class=\"nt\"\u003e\u0026lt;/id\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;updated\u0026gt;\u003c/span\u003e2024-01-15T10:00:00Z\u003cspan class=\"nt\"\u003e\u0026lt;/updated\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;published\u0026gt;\u003c/span\u003e2024-01-15T10:00:00Z\u003cspan class=\"nt\"\u003e\u0026lt;/published\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;link\u003c/span\u003e \u003cspan class=\"na\"\u003ehref=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com/my-first-post/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text/html\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;summary\u003c/span\u003e \u003cspan class=\"na\"\u003etype=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003ePost description\u003cspan class=\"nt\"\u003e\u0026lt;/summary\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;content\u003c/span\u003e \u003cspan class=\"na\"\u003etype=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;html\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003eFull HTML content...\u003cspan class=\"nt\"\u003e\u0026lt;/content\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;/entry\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;/feed\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"jsonfeed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ejsonfeed\u003c/span\u003e \u003ca href=\"#jsonfeed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003ejsonfeed\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Write (utility)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Generates JSON Feed 1.1 documents. Used by \u003ccode\u003epublish_feeds\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput format:\u003c/strong\u003e \u003ca href=\"https://jsonfeed.org/version/1.1\"\u003eJSON Feed 1.1\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eExample output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://jsonfeed.org/version/1.1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Blog\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;home_page_url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;feed_url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/blog/feed.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;A blog about things\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;language\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;en\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;authors\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Author Name\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;items\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/my-first-post/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/my-first-post/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My First Post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;content_html\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026lt;p\u0026gt;Full HTML content...\u0026lt;/p\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;content_text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Plain text content...\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;summary\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Post description\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;date_published\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2024-01-15T10:00:00Z\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;tags\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;programming\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"static_assets\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003estatic_assets\u003c/span\u003e \u003ca href=\"#static_assets\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003estatic_assets\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Write\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Copies static assets from theme and project directories to output.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Theme name for theme static files\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCopies theme static files from \u003ccode\u003ethemes/{theme}/static/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eCopies project static files from \u003ccode\u003estatic/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eProject files override theme files (local customization)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eDirectory structure:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emysite/\n  themes/\n    default/\n      static/\n        css/\n          theme.css\n        js/\n          theme.js\n  static/\n    css/\n      custom.css    # Overrides or adds to theme\n    images/\n      logo.png\n  output/\n    css/\n      theme.css     # From theme\n      custom.css    # From project\n    js/\n      theme.js      # From theme\n    images/\n      logo.png      # From project\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch3 id=\"palette_css\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003epalette_css\u003c/span\u003e \u003ca href=\"#palette_css\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003epalette_css\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Write (after static_assets)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Generates CSS custom properties from the configured color palette, enabling theme customization without modifying CSS files directly.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;nord\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Palette name (built-in or custom)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBuilt-in palettes:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecatppuccin-latte\u003c/code\u003e - Light pastel theme\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecatppuccin-mocha\u003c/code\u003e - Dark pastel theme\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edracula\u003c/code\u003e - Dark purple/pink theme\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egruvbox-dark\u003c/code\u003e - Dark retro groove theme\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egruvbox-light\u003c/code\u003e - Light retro groove theme\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enord\u003c/code\u003e - Arctic, north-bluish color palette\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eone-dark\u003c/code\u003e - Atom One Dark inspired\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erose-pine\u003c/code\u003e - All-natural pine, faux fur, and soho vibes\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esolarized-dark\u003c/code\u003e - Precision dark theme\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esolarized-light\u003c/code\u003e - Precision light theme\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etokyo-night\u003c/code\u003e - Dark theme inspired by Tokyo night lights\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eReads palette name from \u003ccode\u003econfig.Extra[\u0026quot;theme\u0026quot;][\u0026quot;palette\u0026quot;]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eLoads the palette definition (built-in or from \u003ccode\u003epalettes/\u003c/code\u003e directory)\u003c/li\u003e\n\u003cli\u003eMaps palette semantic colors to theme CSS variable names\u003c/li\u003e\n\u003cli\u003eGenerates \u003ccode\u003ecss/variables.css\u003c/code\u003e with CSS custom properties\u003c/li\u003e\n\u003cli\u003eIncludes default font families, spacing, and layout values\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eGenerated CSS structure:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* CSS Custom Properties - Nord Theme */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003eroot\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--color-primary\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#88c0d0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--color-primary-light\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#8fbcbb\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--color-primary-dark\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#8fbcbb\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c\"\u003e/* Semantic colors */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--color-text\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#eceff4\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--color-text-muted\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#d8dee9\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--color-background\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#2e3440\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--color-surface\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#3b4252\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--color-border\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#4c566a\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c\"\u003e/* Status colors */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--color-success\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#a3be8c\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--color-warning\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ebcb8b\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--color-error\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#bf616a\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--color-info\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#81a1c1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c\"\u003e/* Font families */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--font-body\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003esystem-ui\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eapple-system\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--font-heading\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003efont\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--font-mono\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eui-monospace\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c\"\u003e/* Font sizes, spacing, layout... */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCustom palettes:\u003c/strong\u003e\nCreate a TOML file in the \u003ccode\u003epalettes/\u003c/code\u003e directory:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# palettes/my-palette.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Custom Palette\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dark\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# or \u0026#34;light\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ecolors\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eaccent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#ff6b6b\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eaccent-hover\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#ee5a5a\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext-primary\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#f8f8f2\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext-muted\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#b0b0b0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebg-primary\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#1a1a2e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebg-surface\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#16213e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eborder\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#2d3a5a\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esuccess\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#50fa7b\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewarning\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#f1fa8c\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eerror\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#ff5555\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einfo\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#8be9fd\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eTemplate usage:\u003c/strong\u003e\nVariables are automatically available in your CSS:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003emy-component\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003esurface\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"kc\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eborder\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"kc\"\u003esolid\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eborder\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ebutton-primary\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eprimary\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eWhy use palettes?\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSwitch themes by changing one config value\u003c/li\u003e\n\u003cli\u003eConsistent colors across your entire site\u003c/li\u003e\n\u003cli\u003eBuilt-in palettes tested for accessibility\u003c/li\u003e\n\u003cli\u003eEasy to create and share custom themes\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"chroma_css\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003echroma_css\u003c/span\u003e \u003ca href=\"#chroma_css\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003echroma_css\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Configure + Write\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Generates \u003ccode\u003ecss/chroma.css\u003c/code\u003e for syntax-highlighted code blocks. By default it styles Chroma token classes from the active palette\u0026rsquo;s \u003ccode\u003ecode-*\u003c/code\u003e colors; with \u003ccode\u003emarkdown.highlight.theme\u003c/code\u003e it uses an explicit Chroma theme override.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Explicit theme setting\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehighlight\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;github-dark\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Chroma theme name\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr use palette-native syntax colors:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-mocha\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Uses the palette\u0026#39;s code-* component colors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eDuring Configure: Reads \u003ccode\u003emarkdown.highlight.theme\u003c/code\u003e if explicitly set\u003c/li\u003e\n\u003cli\u003eWithout an explicit theme, emits palette-native CSS using \u003ccode\u003e--color-code-*\u003c/code\u003e variables\u003c/li\u003e\n\u003cli\u003eDuring Write: Generates \u003ccode\u003e{output_dir}/css/chroma.css\u003c/code\u003e with syntax highlighting styles\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eAvailable Chroma Themes:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eLight themes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egithub\u003c/code\u003e, \u003ccode\u003egruvbox-light\u003c/code\u003e, \u003ccode\u003esolarized-light\u003c/code\u003e, \u003ccode\u003ecatppuccin-latte\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erose-pine-dawn\u003c/code\u003e, \u003ccode\u003excode\u003c/code\u003e, \u003ccode\u003evs\u003c/code\u003e, \u003ccode\u003efriendly\u003c/code\u003e, \u003ccode\u003etango\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDark themes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egithub-dark\u003c/code\u003e, \u003ccode\u003egruvbox\u003c/code\u003e, \u003ccode\u003esolarized-dark\u003c/code\u003e, \u003ccode\u003ecatppuccin-mocha\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edracula\u003c/code\u003e, \u003ccode\u003emonokai\u003c/code\u003e, \u003ccode\u003enord\u003c/code\u003e, \u003ccode\u003eonedark\u003c/code\u003e, \u003ccode\u003erose-pine\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etokyo-night\u003c/code\u003e, \u003ccode\u003evim\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eExample CSS Output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Syntax highlighting - generated from Chroma theme: github-dark */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003echroma\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#e6edf3\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#0d1117\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003echroma\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eerr\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f85149\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003echroma\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003elntd\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003evertical-align\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etop\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003epadding\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003emargin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003eborder\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003echroma\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003elntable\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eborder-spacing\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003epadding\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003emargin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003eborder\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003echroma\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehl\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#2d333b\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003echroma\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eln\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#6e7681\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003echroma\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ek\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ff7b72\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e  \u003cspan class=\"c\"\u003e/* Keyword */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003echroma\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ekc\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#79c0ff\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e  \u003cspan class=\"c\"\u003e/* KeywordConstant */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003echroma\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ekd\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ff7b72\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e  \u003cspan class=\"c\"\u003e/* KeywordDeclaration */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* ... additional token styles ... */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eTemplate usage:\u003c/strong\u003e\nInclude the generated CSS in your base template:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;stylesheet\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/css/chroma.css\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePalette-native roles used by default:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecode-bg\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecode-text\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecode-comment\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecode-keyword\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecode-string\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecode-number\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecode-function\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecode-type\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecode-operator\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eRelated plugins:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e[[#render_markdown|render_markdown]] - Uses CSS classes for syntax highlighting\u003c/li\u003e\n\u003cli\u003e[[#palette_css|palette_css]] - Generates theme color variables\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"redirects\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eredirects\u003c/span\u003e \u003ca href=\"#redirects\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eredirects\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Write\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Generates HTML redirect pages from a \u003ccode\u003e_redirects\u003c/code\u003e file for URL migration and link preservation.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eredirects\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eredirects_file\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;static/_redirects\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Path to redirects file (default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eredirect_template\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# Custom template path (optional)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eRedirects file format (\u003ccode\u003estatic/_redirects\u003c/code\u003e):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e# Comments start with #\n# Format: /old-path /new-path\n\n/old-post/          /new-post/\n/blog/2020/hello/   /posts/hello-world/\n/about-me/          /about/\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eReads the \u003ccode\u003e_redirects\u003c/code\u003e file (skips silently if not found)\u003c/li\u003e\n\u003cli\u003eParses redirect rules (ignores comments, empty lines, wildcards)\u003c/li\u003e\n\u003cli\u003eFor each rule, creates \u003ccode\u003e{output_dir}/{old-path}/index.html\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUses HTML meta refresh and canonical link for SEO-friendly redirects\u003c/li\u003e\n\u003cli\u003eCaches results to avoid regeneration on unchanged content\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eSupported redirect syntax:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSimple redirects: \u003ccode\u003e/old /new\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePaths must start with \u003ccode\u003e/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eWildcards (\u003ccode\u003e*\u003c/code\u003e) are ignored (not supported for static generation)\u003c/li\u003e\n\u003cli\u003eStatus codes in the file are ignored (always uses meta refresh)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eGenerated HTML:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u0026lt;!DOCTYPE html\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehtml\u003c/span\u003e \u003cspan class=\"na\"\u003elang\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;en\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ehttp-equiv\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Refresh\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;0; url=\u0026#39;/new-path/\u0026#39;\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;canonical\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/new-path/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/old-path/ has been moved to /new-path/.\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e/old-path/ has been moved to /new-path/\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ePage Moved\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e/old-path/\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e has moved to \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/new-path/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e/new-path/\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCustom template:\u003c/strong\u003e\nCreate a custom template with these available variables:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- templates/redirect.html --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u0026lt;!DOCTYPE html\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ehttp-equiv\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Refresh\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;0; url=\u0026#39;{{ .New }}\u0026#39;\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;canonical\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ .New }}\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eRedirecting...\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eRedirecting from {{ .Original }} to \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ .New }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ .New }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eredirects\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eredirect_template\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;templates/redirect.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eTemplate variables:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.Original\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSource path (e.g., \u003ccode\u003e/old-post/\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.New\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eDestination path (e.g., \u003ccode\u003e/new-post/\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.Config\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e*Config\u003c/td\u003e\n\u003ctd\u003eSite configuration object\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch3 id=\"qrcode\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eqrcode\u003c/span\u003e \u003ca href=\"#qrcode\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eqrcode\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Write\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Generates QR code images for each post\u0026rsquo;s URL, useful for print materials or sharing.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eqrcode\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;svg\u0026#34;\u003c/span\u003e              \u003cspan class=\"c\"\u003e# \u0026#34;svg\u0026#34; or \u0026#34;png\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esize\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e200\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# Size in pixels\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;qrcodes\u0026#34;\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Subdirectory in output\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eerror_correction\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;M\u0026#34;\u003c/span\u003e      \u003cspan class=\"c\"\u003e# L, M, Q, H\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eforeground\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#000000\u0026#34;\u003c/span\u003e      \u003cspan class=\"c\"\u003e# QR code color\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebackground\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#ffffff\u0026#34;\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Background color\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOptions:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable/disable QR code generation\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eformat\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003esvg\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOutput format: \u003ccode\u003esvg\u003c/code\u003e or \u003ccode\u003epng\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esize\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e200\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eImage size in pixels\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eoutput_dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eqrcodes\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOutput subdirectory name\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eerror_correction\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eM\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eError correction level\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eforeground\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e#000000\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eQR code foreground color\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebackground\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e#ffffff\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eQR code background color\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eError correction levels:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eLevel\u003c/th\u003e\n\u003cth\u003eRecovery\u003c/th\u003e\n\u003cth\u003eUse Case\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e~7%\u003c/td\u003e\n\u003ctd\u003eClean environments\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eM\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e~15%\u003c/td\u003e\n\u003ctd\u003eStandard use (default)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eQ\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e~25%\u003c/td\u003e\n\u003ctd\u003eIndustrial/outdoor\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eH\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e~30%\u003c/td\u003e\n\u003ctd\u003eMaximum durability\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eFor each non-skipped post, builds the absolute URL\u003c/li\u003e\n\u003cli\u003eGenerates QR code in the configured format\u003c/li\u003e\n\u003cli\u003eSaves to \u003ccode\u003e{output_dir}/{qrcode_output_dir}/{slug}.{format}\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAdds \u003ccode\u003eqrcode_url\u003c/code\u003e to post\u0026rsquo;s Extra map\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eOutput structure:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eoutput/\n  qrcodes/\n    hello-world.svg\n    my-first-post.svg\n    another-article.svg\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003ePost field set:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eqrcode_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRelative URL to QR code image\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eTemplate usage:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.qrcode_url %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;qr-code\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.qrcode_url }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;QR Code for {{ post.Title }}\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eScan to visit this page\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePrint stylesheet example:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003emedia\u003c/span\u003e \u003cspan class=\"nt\"\u003eprint\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eqr-code\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eblock\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003epage-break-inside\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eavoid\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003etext-align\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ecenter\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003emargin-top\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eqr-code\u003c/span\u003e \u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ewidth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e150\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eheight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e150\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003emedia\u003c/span\u003e \u003cspan class=\"nt\"\u003escreen\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eqr-code\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enone\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Hide on screen, show in print */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCustom colors example:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eqrcode\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eforeground\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#2e3440\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Nord dark\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebackground\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#eceff4\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Nord light\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"default-plugin-order\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDefault Plugin Order\u003c/span\u003e \u003ca href=\"#default-plugin-order\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen using \u003ccode\u003eDefaultPlugins()\u003c/code\u003e, plugins execute in this order:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Glob stage\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewGlobPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Load stage\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewLoadPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Transform stage (in order)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewAutoTitlePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Auto-generate titles from filenames\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewDescriptionPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Auto-generate descriptions early\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewReadingTimePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Calculate reading time\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewStructuredDataPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Generate SEO metadata\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewWikilinksPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Process wikilinks\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewTocPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Extract TOC\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewJinjaMdPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Process Jinja templates\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Render stage\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewRenderMarkdownPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewHeadingAnchorsPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Add anchor links to headings\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewChartJSPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Convert Chart.js code blocks to charts\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewCSVFencePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Convert CSV code blocks to tables\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewMermaidPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Convert Mermaid code blocks to diagrams\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewGlossaryPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Auto-link glossary terms\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewWikilinkHoverPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Add hover data to wikilinks\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewLinkCollectorPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Track inlinks/outlinks\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewTemplatesPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Collect stage\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewOverwriteCheckPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Check for output path conflicts (early)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewFeedsPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewAutoFeedsPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewPrevNextPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Calculate prev/next navigation\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Write stage\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewStaticAssetsPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Copy static assets first\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewChromaCSSPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Generate syntax highlighting CSS\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewPublishFeedsPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewPublishHTMLPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewSitemapPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewRedirectsPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Generate redirect pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"optional-plugins\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOptional Plugins\u003c/span\u003e \u003ca href=\"#optional-plugins\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe following plugins are not enabled by default and must be explicitly configured. They provide specialized functionality that may not be needed for all sites.\u003c/p\u003e\n\u003ch3 id=\"webmentions_fetch\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ewebmentions_fetch\u003c/span\u003e \u003ca href=\"#webmentions_fetch\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003ewebmentions_fetch\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Transform\u003cbr\u003e\n\u003cstrong\u003ePriority:\u003c/strong\u003e First (-200, runs before jinja_md)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Fetches incoming webmentions from webmention.io and attaches them to posts.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebmentions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewebmention_io_token\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;your_token_here\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Or use WEBMENTION_IO_TOKEN env var\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.cache/webmentions\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etimeout\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;30s\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003euser_agent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;markata-go/1.0 (WebMention)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eReads cached webmentions from \u003ccode\u003e{cache_dir}/received_mentions.json\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eGroups mentions by target URL\u003c/li\u003e\n\u003cli\u003eFor each post, matches webmentions to the post\u0026rsquo;s URL (with various URL format normalizations)\u003c/li\u003e\n\u003cli\u003eAttaches matched webmentions to \u003ccode\u003epost.Extra[\u0026quot;webmentions\u0026quot;]\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eIncremental builds:\u003c/strong\u003e\nWhen build cache is enabled, the plugin skips re-attaching webmentions if no posts are scheduled to rebuild.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFetching webmentions:\u003c/strong\u003e\nThe plugin loads from cache during builds. To fetch fresh webmentions from webmention.io:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go webmentions fetch\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis fetches all webmentions for your domain and saves them to the cache.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePost fields set (in \u003ccode\u003eExtra\u003c/code\u003e):\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewebmentions\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]ReceivedWebMention\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eArray of webmentions for this post\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eReceivedWebMention structure:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eReceivedWebMention\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eSource\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Source URL\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTarget\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Target URL (your post)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eWMProperty\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Type: \u0026#34;like-of\u0026#34;, \u0026#34;repost-of\u0026#34;, \u0026#34;in-reply-to\u0026#34;, \u0026#34;bookmark-of\u0026#34;, \u0026#34;mention-of\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eAuthor\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"nx\"\u003eAuthor\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Author info (name, photo, url)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eContent\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eContent\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Content (text, html)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePublished\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nx\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTime\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// When the mention was published\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eTemplate usage:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.Extra.webmentions %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;webmentions\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% set likes = post.Extra.webmentions|selectattr(\u0026#34;WMProperty\u0026#34;, \u0026#34;equalto\u0026#34;, \u0026#34;like-of\u0026#34;)|list %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% set reposts = post.Extra.webmentions|selectattr(\u0026#34;WMProperty\u0026#34;, \u0026#34;equalto\u0026#34;, \u0026#34;repost-of\u0026#34;)|list %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% set replies = post.Extra.webmentions|selectattr(\u0026#34;WMProperty\u0026#34;, \u0026#34;equalto\u0026#34;, \u0026#34;in-reply-to\u0026#34;)|list %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% if likes %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;likes\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh4\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ likes|length }} Likes\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh4\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;facepile\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {% for mention in likes %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ mention.Author.URL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ mention.Author.Name }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ mention.Author.Photo }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ mention.Author.Name }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eURL matching:\u003c/strong\u003e\nThe plugin tries multiple URL variants to match webmentions:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eExact URL match\u003c/li\u003e\n\u003cli\u003eWith/without trailing slash\u003c/li\u003e\n\u003cli\u003eLegacy \u003ccode\u003e/blog/\u003c/code\u003e prefix (for migrated sites)\u003c/li\u003e\n\u003cli\u003eDouble-slash normalization (common in webmention.io data)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eRelated:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e[[webmentions|WebMentions Guide]] - Complete webmentions documentation\u003c/li\u003e\n\u003cli\u003e[[#webmentions_leaderboard|webmentions_leaderboard]] - Engagement statistics\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"webmentions_leaderboard\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ewebmentions_leaderboard\u003c/span\u003e \u003ca href=\"#webmentions_leaderboard\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003ewebmentions_leaderboard\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Transform\u003cbr\u003e\n\u003cstrong\u003ePriority:\u003c/strong\u003e -150 (after webmentions_fetch, before jinja_md)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Calculates top posts by webmention engagement and provides leaderboard data for templates.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration:\u003c/strong\u003e None required. Automatically processes webmentions attached by \u003ccode\u003ewebmentions_fetch\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eIterates through all posts with webmentions\u003c/li\u003e\n\u003cli\u003eCounts mentions by type (likes, reposts, replies, bookmarks, mentions)\u003c/li\u003e\n\u003cli\u003eCreates sorted leaderboards (top 20 posts each)\u003c/li\u003e\n\u003cli\u003eStores results in \u003ccode\u003econfig.Extra[\u0026quot;webmention_leaderboard\u0026quot;]\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eConfig fields set (in \u003ccode\u003eExtra\u003c/code\u003e):\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewebmention_leaderboard\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eWebmentionLeaderboard\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLeaderboard data structure\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eWebmentionLeaderboard structure:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eWebmentionLeaderboard\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTopLiked\u003c/span\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"nx\"\u003eLeaderboardEntry\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Top 20 by likes\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTopReposted\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"nx\"\u003eLeaderboardEntry\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Top 20 by reposts\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTopReplied\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"nx\"\u003eLeaderboardEntry\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Top 20 by replies\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTopTotal\u003c/span\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"nx\"\u003eLeaderboardEntry\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Top 20 by total engagement\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTotalLikes\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e                 \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Site-wide total likes\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTotalReposts\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e                 \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Site-wide total reposts\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTotalReplies\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e                 \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Site-wide total replies\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTotalMentions\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e                 \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Site-wide total mentions\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eLeaderboardEntry\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePost\u003c/span\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003ePost\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Reference to the post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eHref\u003c/span\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Post URL\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTitle\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Post title\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eLikes\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Number of likes\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eReposts\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Number of reposts\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eReplies\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Number of replies\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eBookmarks\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Number of bookmarks\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eMentions\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Number of mentions\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTotal\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Total engagement\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eTemplate usage (in Jinja-enabled pages):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Analytics\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Webmention Leaderboard\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if config.Extra.webmention_leaderboard %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Most Liked Posts\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Likes | Post |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|------:|------|\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for entry in config.Extra.webmention_leaderboard.TopLiked %}| {{ entry.Likes }} | [\u003cspan class=\"nt\"\u003e{{ entry.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ entry.Href }}\u003c/span\u003e) |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Most Discussed Posts\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Replies | Post |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|--------:|------|\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for entry in config.Extra.webmention_leaderboard.TopReplied %}| {{ entry.Replies }} | [\u003cspan class=\"nt\"\u003e{{ entry.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ entry.Href }}\u003c/span\u003e) |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Site Totals\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e **Total Likes:** {{ config.Extra.webmention_leaderboard.TotalLikes }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e **Total Reposts:** {{ config.Extra.webmention_leaderboard.TotalReposts }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e **Total Replies:** {{ config.Extra.webmention_leaderboard.TotalReplies }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eUse cases:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAnalytics dashboards showing top-performing content\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;Popular posts\u0026rdquo; widgets based on social engagement\u003c/li\u003e\n\u003cli\u003eContent performance tracking\u003c/li\u003e\n\u003cli\u003eGamification/motivation for content creators\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eRelated:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e[[webmentions|WebMentions Guide]] - Complete webmentions documentation\u003c/li\u003e\n\u003cli\u003e[[#webmentions_fetch|webmentions_fetch]] - Fetches webmentions\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"mermaid\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003emermaid\u003c/span\u003e \u003ca href=\"#mermaid\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003emermaid\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Render (post_render)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Converts Mermaid code blocks into rendered diagrams. Supports client-side rendering (default), CLI-based pre-rendering via mmdc, or headless Chromium pre-rendering.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eStatus:\u003c/strong\u003e Enabled by default. Set \u003ccode\u003eenabled = false\u003c/code\u003e to disable.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emermaid\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                                              \u003cspan class=\"c\"\u003e# Enabled by default; set to false to disable\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;client\u0026#34;\u003c/span\u003e                                             \u003cspan class=\"c\"\u003e# \u0026#34;client\u0026#34;, \u0026#34;cli\u0026#34;, or \u0026#34;chromium\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecdn_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/assets/vendor/mermaid/mermaid.min.js\u0026#34;\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Mermaid URL (client mode, local by default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e                                           \u003cspan class=\"c\"\u003e# Mermaid theme (default, dark, forest, neutral)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003euse_css_variables\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                                    \u003cspan class=\"c\"\u003e# Derive diagram colors from site CSS palette (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elightbox\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                                             \u003cspan class=\"c\"\u003e# Click diagrams to open in lightbox with pan/zoom (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elightbox_selector\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.glightbox-mermaid\u0026#34;\u003c/span\u003e                    \u003cspan class=\"c\"\u003e# CSS selector for lightbox links (default: \u0026#34;.glightbox-mermaid\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# CLI mode settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emermaid\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecli\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emmdc_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e                                              \u003cspan class=\"c\"\u003e# Auto-detect if empty\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eextra_args\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e                                             \u003cspan class=\"c\"\u003e# Additional mmdc arguments\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Chromium mode settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emermaid\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003echromium\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebrowser_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e                                           \u003cspan class=\"c\"\u003e# Auto-detect if empty\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etimeout\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e30\u003c/span\u003e                                                \u003cspan class=\"c\"\u003e# Seconds per diagram\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_concurrent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e                                          \u003cspan class=\"c\"\u003e# Parallel diagram renderers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eno_sandbox\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e                                          \u003cspan class=\"c\"\u003e# Required in containers (Docker, etc.)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWhether mermaid processing is active\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emode\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;client\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRendering mode: \u003ccode\u003eclient\u003c/code\u003e (browser-side JS), \u003ccode\u003ecli\u003c/code\u003e (mmdc), or \u003ccode\u003echromium\u003c/code\u003e (headless Chrome)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecdn_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/assets/vendor/mermaid/mermaid.min.js\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMermaid URL (client mode, local by default)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etheme\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;default\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMermaid theme: default, dark, forest, neutral. Ignored when \u003ccode\u003euse_css_variables\u003c/code\u003e is true.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003euse_css_variables\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUse \u003ccode\u003e--color-surface\u003c/code\u003e for node fills and edge-label backgrounds, \u003ccode\u003e--color-text\u003c/code\u003e for labels, \u003ccode\u003e--color-border\u003c/code\u003e (falling back to \u003ccode\u003e--color-primary\u003c/code\u003e) for borders and edges, and \u003ccode\u003e--color-background\u003c/code\u003e for cluster fills.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elightbox\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable click-to-zoom lightbox overlay with interactive pan and zoom via svg-pan-zoom.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elightbox_selector\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;.glightbox-mermaid\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCSS selector for mermaid lightbox links. Retained for backward compatibility; the programmatic GLightbox API does not use it.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003echromium.no_sandbox\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDisable Chromium sandbox. Required when running inside Docker, Distrobox, or other containerized environments.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003echromium.timeout\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e30\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMaximum seconds to wait for a single diagram to render.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003echromium.max_concurrent\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e4\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMaximum number of diagrams to render in parallel.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eFinds code blocks with \u003ccode\u003elanguage-mermaid\u003c/code\u003e class in \u003ccode\u003eArticleHTML\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eIn \u003cstrong\u003eclient\u003c/strong\u003e mode: converts to \u003ccode\u003e\u0026lt;pre class=\u0026quot;mermaid\u0026quot;\u0026gt;\u003c/code\u003e blocks and injects Mermaid.js initialization script\u003c/li\u003e\n\u003cli\u003eIn \u003cstrong\u003ecli/chromium\u003c/strong\u003e modes: pre-renders diagrams to static SVGs embedded directly in HTML\u003c/li\u003e\n\u003cli\u003eOnly injects the script once per post (even with multiple diagrams)\u003c/li\u003e\n\u003cli\u003eWhen \u003ccode\u003euse_css_variables\u003c/code\u003e is true, reads site CSS custom properties and passes them to \u003ccode\u003emermaid.initialize()\u003c/code\u003e so diagrams match the site palette automatically\u003c/li\u003e\n\u003cli\u003eClient mode retains each diagram\u0026rsquo;s source and rerenders its SVG when the site theme, palette, or color mode changes. Chromium mode uses the same palette colors when it pre-renders SVGs. CLI mode follows Mermaid CLI theme and configuration.\u003c/li\u003e\n\u003cli\u003eWhen \u003ccode\u003elightbox\u003c/code\u003e is true, attaches click handlers to each rendered SVG. Clicking opens a programmatic GLightbox overlay with svg-pan-zoom for interactive pan and zoom. svg-pan-zoom (~29KB) is lazy-loaded from vendor assets by default.\u003c/li\u003e\n\u003cli\u003eIn chromium mode, the MermaidJS library is cached at \u003ccode\u003e~/.cache/markata-go/mermaid/\u003c/code\u003e to avoid re-downloading on each build\u003c/li\u003e\n\u003cli\u003eIn cli/chromium modes, rendered SVGs are cached in the build cache and reused when the diagram source and rendering inputs are unchanged\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eMarkdown usage:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```mermaid\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egraph TD\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    A[Start] --\u0026gt; B{Is it working?}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    B --\u0026gt;|Yes| C[Great!]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    B --\u0026gt;|No| D[Debug]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    D --\u0026gt; B\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eSupported diagram types:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFlowcharts (\u003ccode\u003egraph TD\u003c/code\u003e, \u003ccode\u003egraph LR\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eSequence diagrams\u003c/li\u003e\n\u003cli\u003eClass diagrams\u003c/li\u003e\n\u003cli\u003eState diagrams\u003c/li\u003e\n\u003cli\u003eEntity Relationship diagrams\u003c/li\u003e\n\u003cli\u003eGantt charts\u003c/li\u003e\n\u003cli\u003ePie charts\u003c/li\u003e\n\u003cli\u003eGit graphs\u003c/li\u003e\n\u003cli\u003eAnd more (see \u003ca href=\"https://mermaid.js.org/\"\u003eMermaid docs\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eHTML output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003epre\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mermaid\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egraph TD\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    A[Start] --\u0026gt; B{Is it working?}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    B --\u0026gt;|Yes| C[Great!]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    B --\u0026gt;|No| D[Debug]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    D --\u0026gt; B\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003epre\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;module\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e// Loads the vendored UMD bundle (/assets/vendor/mermaid/mermaid.min.js)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e// and binds it to `mermaid`; ESM URLs are imported directly instead.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003emermaid\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003einitialize\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e \u003cspan class=\"nx\"\u003estartOnLoad\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;default\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kr\"\u003eawait\u003c/span\u003e \u003cspan class=\"nx\"\u003emermaid\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003ecdn_url\u003c/code\u003e accepts either bundle style. URLs ending in \u003ccode\u003e.mjs\u003c/code\u003e (or containing\n\u003ccode\u003e.esm.\u003c/code\u003e) are loaded with an ES module \u003ccode\u003eimport\u003c/code\u003e; anything else is loaded as a\nclassic script and read from \u003ccode\u003ewindow.mermaid\u003c/code\u003e. The default is the vendored,\nself-contained UMD build. The ESM build lazily fetches per-diagram chunks from\nthe same directory, so only point \u003ccode\u003ecdn_url\u003c/code\u003e at an \u003ccode\u003e.mjs\u003c/code\u003e file when the full\n\u003ccode\u003edist/\u003c/code\u003e directory is served alongside it (for example a CDN URL).\u003c/p\u003e\n\u003cp\u003eWhen \u003ccode\u003elightbox\u003c/code\u003e is enabled, each rendered SVG also gets a click handler that opens a GLightbox overlay. The lightbox contains a toolbar with Fit / + / - controls and supports mouse wheel zoom and click-drag panning via svg-pan-zoom.\u003c/p\u003e\n\u003ch4 id=\"lightbox-pan-zoom-for-diagrams\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLightbox / Pan-Zoom for Diagrams\u003c/span\u003e \u003ca href=\"#lightbox-pan-zoom-for-diagrams\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eWhen \u003ccode\u003elightbox = true\u003c/code\u003e (the default), clicking any rendered mermaid diagram opens a full-screen overlay with interactive pan and zoom.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eHow it works:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eA separate GLightbox instance (\u003ccode\u003eselector: false\u003c/code\u003e) is created for mermaid diagrams to avoid conflicts with image lightbox\u003c/li\u003e\n\u003cli\u003esvg-pan-zoom v3.6.2 is lazy-loaded from CDN on first click (zero cost for pages without interaction)\u003c/li\u003e\n\u003cli\u003eGLightbox \u003ccode\u003edraggable\u003c/code\u003e is set to \u003ccode\u003efalse\u003c/code\u003e to prevent conflict with svg-pan-zoom panning\u003c/li\u003e\n\u003cli\u003eOn lightbox open, \u003ccode\u003erequestAnimationFrame\u003c/code\u003e is used to \u003ccode\u003eresize()\u003c/code\u003e + \u003ccode\u003efit()\u003c/code\u003e + \u003ccode\u003ecenter()\u003c/code\u003e the diagram for reliable initial positioning\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eInteraction:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAction\u003c/th\u003e\n\u003cth\u003eResult\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eClick diagram\u003c/td\u003e\n\u003ctd\u003eOpen lightbox with full-size diagram\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMouse wheel / pinch\u003c/td\u003e\n\u003ctd\u003eZoom in / out\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eClick + drag\u003c/td\u003e\n\u003ctd\u003ePan the diagram\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFit button\u003c/td\u003e\n\u003ctd\u003eReset zoom to fit diagram in viewport\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e+ / - buttons\u003c/td\u003e\n\u003ctd\u003eZoom in / out incrementally\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eEscape / click overlay\u003c/td\u003e\n\u003ctd\u003eClose lightbox\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eCSS classes:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eClass\u003c/th\u003e\n\u003cth\u003ePurpose\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.mermaid-lightbox-wrap\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eContainer inside lightbox (100% width, 90vh height, overflow hidden)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.mermaid-lightbox-toolbar\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAbsolute-positioned button toolbar (top-right)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.mermaid-pz-btn\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThemed control buttons using \u003ccode\u003evar(--color-surface)\u003c/code\u003e, \u003ccode\u003evar(--color-border)\u003c/code\u003e, \u003ccode\u003evar(--color-text)\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.svg-pan-zoom_viewport\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAdded by svg-pan-zoom; styled with \u003ccode\u003ecursor: grab\u003c/code\u003e / \u003ccode\u003ecursor: grabbing\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eGLightbox theming:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eThe lightbox overlay is themed to match the site\u0026rsquo;s dark palette. CSS overrides in \u003ccode\u003ecomponents.css\u003c/code\u003e apply to:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e.goverlay\u003c/code\u003e \u0026ndash; dark background overlay\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.ginlined-content\u003c/code\u003e \u0026ndash; content container\u003c/li\u003e\n\u003cli\u003eNavigation buttons and description area\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003ePerformance:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003esvg-pan-zoom JS (~29KB, BSD-2 license) is only loaded on first diagram click\u003c/li\u003e\n\u003cli\u003eGLightbox CSS/JS is loaded with the page (shared with image_zoom if enabled)\u003c/li\u003e\n\u003cli\u003ePan-zoom instance is destroyed on lightbox close to prevent memory leaks\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"tailwind\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003etailwind\u003c/span\u003e \u003ca href=\"#tailwind\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003etailwind\u003c/code\u003e  \u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Configure + Cleanup  \u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Runs the Tailwind standalone CLI during builds and optionally injects\ncompiled CSS or the Tailwind CDN JS script into your site.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eStatus:\u003c/strong\u003e Enabled by default (via \u003ccode\u003ehooks = [\u0026quot;default\u0026quot;]\u003c/code\u003e). Set \u003ccode\u003ebuild = false\u003c/code\u003e or\n\u003ccode\u003einclude = false\u003c/code\u003e to disable parts of the behavior.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etailwind\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;css\u0026#34;\u003c/span\u003e                \u003cspan class=\"c\"\u003e# \u0026#34;css\u0026#34;, \u0026#34;js\u0026#34;, or false (default: \u0026#34;css\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epreflight\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e               \u003cspan class=\"c\"\u003e# Enable Tailwind Preflight reset styles (default: false)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einput\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tailwind.css\u0026#34;\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Input CSS (relative to assets_dir)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;markata-tailwind.css\u0026#34;\u003c/span\u003e \u003cspan class=\"c\"\u003e# Output CSS (relative to assets_dir)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econfig_file\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e                \u003cspan class=\"c\"\u003e# Optional tailwind.config.js path\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebuild\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                     \u003cspan class=\"c\"\u003e# Run Tailwind CLI during build\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eminify\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                    \u003cspan class=\"c\"\u003e# Pass --minify to Tailwind CLI\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_install\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Auto-download Tailwind CLI (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eversion\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;v3.4.19\u0026#34;\u003c/span\u003e             \u003cspan class=\"c\"\u003e# Managed Tailwind CLI version tag\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# Cache dir for Tailwind CLI\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebinary\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e                     \u003cspan class=\"c\"\u003e# Optional path to tailwindcss binary\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eextra_args\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# Optional extra CLI arguments\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003everbose\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# Verbose installer/build logs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einclude\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring | bool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;css\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLoad the compiled CSS (\u003ccode\u003e\u0026quot;css\u0026quot;\u003c/code\u003e), inject the CDN JS (\u003ccode\u003e\u0026quot;js\u0026quot;\u003c/code\u003e), or disable auto-inclusion (\u003ccode\u003efalse\u003c/code\u003e).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epreflight\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable Tailwind Preflight reset styles in markata-go\u0026rsquo;s generated Tailwind config.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einput\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;tailwind.css\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTailwind input CSS (relative to \u003ccode\u003eassets_dir\u003c/code\u003e).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eoutput\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;markata-tailwind.css\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOutput CSS path (relative to \u003ccode\u003eassets_dir\u003c/code\u003e).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig_file\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOptional path to \u003ccode\u003etailwind.config.js\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebuild\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRun Tailwind CLI during build.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eminify\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAdd \u003ccode\u003e--minify\u003c/code\u003e to the Tailwind CLI.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eauto_install\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUse the managed Tailwind CLI download instead of relying on \u003ccode\u003ePATH\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eversion\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;v3.4.19\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eManaged Tailwind CLI version tag.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecache_dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCache directory for the Tailwind CLI binary.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebinary\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOptional explicit \u003ccode\u003etailwindcss\u003c/code\u003e binary path.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eextra_args\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring[]\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eExtra CLI arguments appended to the command.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003everbose\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eVerbose install/build output.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eInjects Tailwind includes during Configure, then rebuilds CSS during Cleanup only when the effective utility manifest changes.\u003c/li\u003e\n\u003cli\u003eResolves \u003ccode\u003einput\u003c/code\u003e/\u003ccode\u003eoutput\u003c/code\u003e relative to \u003ccode\u003eassets_dir\u003c/code\u003e (absolute paths are respected).\u003c/li\u003e\n\u003cli\u003eIf \u003ccode\u003einput\u003c/code\u003e is missing, generates a default Tailwind entry CSS file automatically.\u003c/li\u003e\n\u003cli\u003eIf \u003ccode\u003eextra_args\u003c/code\u003e is empty and \u003ccode\u003econfig_file\u003c/code\u003e is unset, generates a temporary Tailwind config from a cached token manifest derived from rendered HTML plus local JS/template sources, with \u003ccode\u003ecorePlugins.preflight\u003c/code\u003e controlled by \u003ccode\u003etailwind.preflight\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einclude = \u0026quot;css\u0026quot;\u003c/code\u003e sets \u003ccode\u003etheme.custom_css\u003c/code\u003e to the output if it\u0026rsquo;s empty.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einclude = \u0026quot;js\u0026quot;\u003c/code\u003e injects the Tailwind CDN script and respects assets mode for vendoring.\u003c/li\u003e\n\u003cli\u003eFast mode skips Tailwind rebuilds when the compiled asset already exists.\u003c/li\u003e\n\u003cli\u003eWhen \u003ccode\u003einclude = \u0026quot;css\u0026quot;\u003c/code\u003e and CSS purge is disabled, a validation warning is emitted.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eNotes:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTailwind CLI is downloaded with checksum verification (versioned per platform).\u003c/li\u003e\n\u003cli\u003eWith default settings, markata-go prefers the managed Tailwind binary for consistency.\u003c/li\u003e\n\u003cli\u003ePreflight defaults to off in markata-go-managed configs so utility classes can be layered onto the built-in theme without resetting post typography.\u003c/li\u003e\n\u003cli\u003eIf \u003ccode\u003eauto_install = false\u003c/code\u003e, the plugin uses \u003ccode\u003ebinary\u003c/code\u003e or searches \u003ccode\u003ePATH\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"examples-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"flowchart-build-process\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFlowchart - Build Process\u003c/span\u003e \u003ca href=\"#flowchart-build-process\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eVisualize processes and decision trees with flowcharts:\u003c/p\u003e\n\u003cpre class=\"mermaid\"\u003e\nflowchart TD\n    A[Start Build] --\u003e B{Config Found?}\n    B --\u003e|Yes| C[Load Configuration]\n    B --\u003e|No| D[Use Defaults]\n    C --\u003e E[Discover Content]\n    D --\u003e E\n    E --\u003e F[Parse Frontmatter]\n    F --\u003e G[Transform Content]\n    G --\u003e H[Render Markdown]\n    H --\u003e I[Apply Templates]\n    I --\u003e J[Write Output]\n    J --\u003e K[Generate Feeds]\n    K --\u003e L{Search Enabled?}\n    L --\u003e|Yes| M[Build Search Index]\n    L --\u003e|No| N[Complete]\n    M --\u003e N\n\u003c/pre\u003e\n\u003ch4 id=\"sequence-diagram-api-request-flow\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSequence Diagram - API Request Flow\u003c/span\u003e \u003ca href=\"#sequence-diagram-api-request-flow\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eShow interactions between components over time:\u003c/p\u003e\n\u003cpre class=\"mermaid\"\u003e\nsequenceDiagram\n    participant Browser\n    participant Server\n    participant Cache\n    participant Database\n\n    Browser-\u003e\u003eServer: GET /api/posts\n    Server-\u003e\u003eCache: Check cache\n    alt Cache hit\n        Cache--\u003e\u003eServer: Return cached data\n    else Cache miss\n        Server-\u003e\u003eDatabase: Query posts\n        Database--\u003e\u003eServer: Return posts\n        Server-\u003e\u003eCache: Store in cache\n    end\n    Server--\u003e\u003eBrowser: JSON response\n\n    Note over Browser,Server: Response includes ETag header\n\n    Browser-\u003e\u003eServer: GET /api/posts (with If-None-Match)\n    Server--\u003e\u003eBrowser: 304 Not Modified\n\u003c/pre\u003e\n\u003ch4 id=\"class-diagram-plugin-architecture\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eClass Diagram - Plugin Architecture\u003c/span\u003e \u003ca href=\"#class-diagram-plugin-architecture\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eDocument code structure and relationships:\u003c/p\u003e\n\u003cpre class=\"mermaid\"\u003e\nclassDiagram\n    class Plugin {\n        \u003c\u003cinterface\u003e\u003e\n        +Name() string\n    }\n\n    class ConfigurePlugin {\n        \u003c\u003cinterface\u003e\u003e\n        +Configure(m *Manager) error\n    }\n\n    class TransformPlugin {\n        \u003c\u003cinterface\u003e\u003e\n        +Transform(m *Manager) error\n    }\n\n    class RenderPlugin {\n        \u003c\u003cinterface\u003e\u003e\n        +Render(m *Manager) error\n    }\n\n    class Manager {\n        -config *Config\n        -posts []*Post\n        -plugins []Plugin\n        +RunStage(stage Stage) error\n        +Posts() []*Post\n        +ProcessPostsConcurrently(fn func) error\n    }\n\n    class Post {\n        +Path string\n        +Title *string\n        +Content string\n        +ArticleHTML string\n        +Slug string\n        +Tags []string\n    }\n\n    Plugin \u003c|-- ConfigurePlugin\n    Plugin \u003c|-- TransformPlugin\n    Plugin \u003c|-- RenderPlugin\n    Manager --\u003e Plugin : uses\n    Manager --\u003e Post : manages\n\u003c/pre\u003e\n\u003ch4 id=\"state-diagram-post-lifecycle\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eState Diagram - Post Lifecycle\u003c/span\u003e \u003ca href=\"#state-diagram-post-lifecycle\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eShow state transitions for content:\u003c/p\u003e\n\u003cpre class=\"mermaid\"\u003e\nstateDiagram-v2\n    [*] --\u003e Draft: Create post\n\n    Draft --\u003e Review: Submit for review\n    Draft --\u003e Draft: Edit\n\n    Review --\u003e Draft: Request changes\n    Review --\u003e Scheduled: Approve\n\n    Scheduled --\u003e Published: Publish date reached\n    Scheduled --\u003e Draft: Cancel\n\n    Published --\u003e Archived: Archive\n    Published --\u003e Published: Update\n\n    Archived --\u003e Published: Restore\n    Archived --\u003e [*]: Delete\n\u003c/pre\u003e\n\u003ch4 id=\"entity-relationship-diagram-content-model\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEntity Relationship Diagram - Content Model\u003c/span\u003e \u003ca href=\"#entity-relationship-diagram-content-model\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eDocument data relationships:\u003c/p\u003e\n\u003cpre class=\"mermaid\"\u003e\nerDiagram\n    POST ||--o{ TAG : has\n    POST ||--o| AUTHOR : written_by\n    POST ||--o{ FEED : belongs_to\n    POST ||--o{ LINK : contains\n    FEED ||--o{ POST : contains\n    AUTHOR ||--o{ POST : writes\n\n    POST {\n        string slug PK\n        string title\n        string content\n        datetime date\n        boolean published\n    }\n\n    TAG {\n        string name PK\n        string slug\n    }\n\n    AUTHOR {\n        string id PK\n        string name\n        string email\n    }\n\n    FEED {\n        string slug PK\n        string title\n        string filter\n    }\n\n    LINK {\n        string source FK\n        string target\n        boolean internal\n    }\n\u003c/pre\u003e\n\u003ch4 id=\"gantt-chart-project-timeline\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGantt Chart - Project Timeline\u003c/span\u003e \u003ca href=\"#gantt-chart-project-timeline\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003ePlan and visualize project schedules:\u003c/p\u003e\n\u003cpre class=\"mermaid\"\u003e\ngantt\n    title Site Redesign Project\n    dateFormat YYYY-MM-DD\n    section Planning\n        Requirements gathering    :a1, 2024-01-01, 7d\n        Design mockups           :a2, after a1, 10d\n        Technical planning       :a3, after a1, 5d\n    section Development\n        Theme development        :b1, after a2, 14d\n        Plugin customization     :b2, after a3, 10d\n        Content migration        :b3, after b1, 7d\n    section Testing\n        QA testing              :c1, after b3, 5d\n        Performance testing     :c2, after c1, 3d\n    section Launch\n        Soft launch             :milestone, after c2, 0d\n        Full launch             :d1, after c2, 2d\n\u003c/pre\u003e\n\u003ch4 id=\"git-graph-branch-history\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGit Graph - Branch History\u003c/span\u003e \u003ca href=\"#git-graph-branch-history\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eVisualize git workflows:\u003c/p\u003e\n\u003cpre class=\"mermaid\"\u003e\ngitGraph\n    commit id: \"Initial commit\"\n    commit id: \"Add base theme\"\n    branch feature/blog\n    checkout feature/blog\n    commit id: \"Add blog layout\"\n    commit id: \"Add post template\"\n    checkout main\n    branch feature/search\n    checkout feature/search\n    commit id: \"Add Pagefind\"\n    checkout main\n    merge feature/blog id: \"Merge blog feature\"\n    checkout feature/search\n    commit id: \"Style search UI\"\n    checkout main\n    merge feature/search id: \"Merge search\"\n    commit id: \"v1.0.0 release\" tag: \"v1.0.0\"\n\u003c/pre\u003e\n\u003chr\u003e\n\u003ch3 id=\"webawesome\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ewebawesome\u003c/span\u003e \u003ca href=\"#webawesome\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003ewebawesome\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Configure (register shared vendor asset) + Render (after render_markdown)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Converts Web Awesome Markdown containers into custom elements and loads Web Awesome assets when needed.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eStatus:\u003c/strong\u003e Built-in. Add \u003ccode\u003ewebawesome\u003c/code\u003e to \u003ccode\u003ehooks\u003c/code\u003e to use it explicitly.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehooks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;webawesome\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebawesome\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esource\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;vendor\u0026#34;\u003c/span\u003e \u003cspan class=\"c\"\u003e# \u0026#34;vendor\u0026#34; (default) or \u0026#34;cdn\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eversion\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;3.5.0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebrand\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blue\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen \u003ccode\u003esource = \u0026quot;vendor\u0026quot;\u003c/code\u003e, the plugin downloads Web Awesome through the shared \u003ccode\u003e[markata-go.assets]\u003c/code\u003e vendor pipeline and serves it from \u003ccode\u003e/assets/vendor/webawesome/...\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMarkdown syntax:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: wa-comparison {position=42 caption=\u0026#34;Before and after\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eBefore\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/before.webp\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eAfter\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/after.webp\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe longer \u003ccode\u003e::: webawesome comparison\u003c/code\u003e alias is also supported. Web Awesome classes can be combined with other container classes; detection treats \u003ccode\u003ewa-*\u003c/code\u003e or \u003ccode\u003ewebawesome \u0026lt;component\u0026gt;\u003c/code\u003e as class tokens rather than requiring them to appear first.\u003c/p\u003e\n\u003cp\u003eSee the [[webawesome-components|Web Awesome Components]] guide for demos and self-hosting details.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"glossary\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eglossary\u003c/span\u003e \u003ca href=\"#glossary\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003eglossary\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Render (post_render) + Write\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Automatically links glossary terms in post content and exports a glossary JSON file.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eStatus:\u003c/strong\u003e Enabled by default. Set \u003ccode\u003eenabled = false\u003c/code\u003e to disable.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglossary\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Enabled by default; set to false to disable\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elink_class\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;glossary-term\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# CSS class for glossary links (default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecase_sensitive\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Case-sensitive term matching (default: false)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etooltip\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Show the definition in a hover card (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_links_per_term\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Max times to link each term (0 = all, default: 1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude_tags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;glossary\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"c\"\u003e# Tags to exclude from linking (default: [\u0026#34;glossary\u0026#34;])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexport_json\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Export glossary.json file (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eglossary_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;glossary\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Path prefix for glossary posts (default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplate_key\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;glossary\u0026#34;\u003c/span\u003e   \u003cspan class=\"c\"\u003e# Frontmatter key to identify glossary posts (default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eGlossary post format:\u003c/strong\u003e\nCreate posts in the \u003ccode\u003eglossary/\u003c/code\u003e directory (or set \u003ccode\u003eglossary_path\u003c/code\u003e):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;API\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Application Programming Interface - a set of protocols for building software\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplateKey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eglossary\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ealiases\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;APIs\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;Application Programming Interface\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003eAn **API** (Application Programming Interface) is a set of protocols,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003eroutines, and tools for building software applications...\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eScans posts to identify glossary definitions (by path or \u003ccode\u003etemplateKey\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eBuilds a lookup table of terms and aliases\u003c/li\u003e\n\u003cli\u003eIn non-glossary posts, finds term occurrences and wraps them in links\u003c/li\u003e\n\u003cli\u003eProtects content inside \u003ccode\u003e\u0026lt;a\u0026gt;\u003c/code\u003e, \u003ccode\u003e\u0026lt;code\u0026gt;\u003c/code\u003e, and \u003ccode\u003e\u0026lt;pre\u0026gt;\u003c/code\u003e tags from linking\u003c/li\u003e\n\u003cli\u003eRespects \u003ccode\u003emax_links_per_term\u003c/code\u003e to avoid over-linking\u003c/li\u003e\n\u003cli\u003eExports \u003ccode\u003eglossary.json\u003c/code\u003e to the output directory\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eLonger terms are matched first. Equal-length terms and aliases are matched in\nlexical order (after case normalization), so aliases sharing a link limit select\nthe same occurrence on every build. Updating from the older unordered behavior\nrefreshes glossary results once; it does not require deleting your caches.\nNested protected content, such as a link inside a code block, is preserved\nwithout leaking internal placeholder markers into pages or feeds.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eHTML output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- Before --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eYou can use the API to fetch data.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- After --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eYou can use the \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/glossary/api/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;glossary-term\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Application Programming Interface - a set of protocols for building software\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAPI\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e to fetch data.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eExported glossary.json:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;terms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;term\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;API\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;slug\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;api\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Application Programming Interface - a set of protocols for building software\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;aliases\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;APIs\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Application Programming Interface\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;href\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/glossary/api/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCSS styling:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eglossary-term\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003etext-decoration\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eunderline\u003c/span\u003e \u003cspan class=\"kc\"\u003edotted\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003etext-underline-offset\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ecursor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ehelp\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eglossary-term\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003ehover\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003etext-decoration\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eunderline\u003c/span\u003e \u003cspan class=\"kc\"\u003esolid\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"csv_fence\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ecsv_fence\u003c/span\u003e \u003ca href=\"#csv_fence\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003ecsv_fence\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Render (post_render)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Converts CSV code blocks into HTML tables for easy data display.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eStatus:\u003c/strong\u003e Enabled by default. Set \u003ccode\u003eenabled = false\u003c/code\u003e to disable.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecsv_fence\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Enabled by default; set to false to disable\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etable_class\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;csv-table\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# CSS class for generated tables (default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehas_header\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e       \u003cspan class=\"c\"\u003e# Treat first row as header (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edelimiter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;,\u0026#34;\u003c/span\u003e         \u003cspan class=\"c\"\u003e# CSV field delimiter (default: \u0026#34;,\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eMarkdown usage:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```csv\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003eAge\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003eCity\u003c/span\u003e\u003cspan class=\"p\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003eAlice\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003e30\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003eNew York\u003c/span\u003e\u003cspan class=\"p\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003eBob\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003e25\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003eLos Angeles\u003c/span\u003e\u003cspan class=\"p\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003eCharlie\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003e35\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003eChicago\u003c/span\u003e\u003cspan class=\"p\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePer-block options:\u003c/strong\u003e\nYou can override global settings per code block:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e``\u003cspan class=\"sb\"\u003e`csv delimiter=\u0026#34;;\u0026#34; has_header=\u0026#34;false\u0026#34; table_class=\u0026#34;data-table\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003eAlice;30;New York\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003eBob;25;Los Angeles\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e`\u003c/span\u003e``\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eFinds code blocks with \u003ccode\u003elanguage-csv\u003c/code\u003e class in \u003ccode\u003eArticleHTML\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eParses the CSV content with the configured delimiter\u003c/li\u003e\n\u003cli\u003eGenerates an HTML table with \u003ccode\u003e\u0026lt;thead\u0026gt;\u003c/code\u003e (if \u003ccode\u003ehas_header\u003c/code\u003e) and \u003ccode\u003e\u0026lt;tbody\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eProperly escapes all cell content for HTML safety\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eHTML output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etable\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;csv-table\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ethead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eName\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAge\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eCity\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ethead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etbody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAlice\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e30\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eNew York\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eBob\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e25\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eLos Angeles\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eCharlie\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e35\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eChicago\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etbody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etable\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCSS styling:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ecsv-table\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eborder-collapse\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ecollapse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ewidth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"kt\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003emargin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ecsv-table\u003c/span\u003e \u003cspan class=\"nt\"\u003eth\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ecsv-table\u003c/span\u003e \u003cspan class=\"nt\"\u003etd\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eborder\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"kc\"\u003esolid\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ddd\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003epadding\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003etext-align\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ecsv-table\u003c/span\u003e \u003cspan class=\"nt\"\u003eth\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f5f5f5\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efont-weight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ebold\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ecsv-table\u003c/span\u003e \u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003enth-child\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003eeven\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#fafafa\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eMarkdown usage:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```csv\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003eAge\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003eCity\u003c/span\u003e\u003cspan class=\"p\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003eAlice\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003e30\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003eNew York\u003c/span\u003e\u003cspan class=\"p\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003eBob\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003e25\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003eLos Angeles\u003c/span\u003e\u003cspan class=\"p\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003eCharlie\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003e35\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003eChicago\u003c/span\u003e\u003cspan class=\"p\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePer-block options:\u003c/strong\u003e\nYou can override global settings per code block:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e``\u003cspan class=\"sb\"\u003e`csv delimiter=\u0026#34;;\u0026#34; has_header=\u0026#34;false\u0026#34; table_class=\u0026#34;data-table\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003eAlice;30;New York\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003eBob;25;Los Angeles\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e`\u003c/span\u003e``\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eFinds code blocks with \u003ccode\u003elanguage-csv\u003c/code\u003e class in \u003ccode\u003eArticleHTML\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eParses the CSV content with the configured delimiter\u003c/li\u003e\n\u003cli\u003eGenerates an HTML table with \u003ccode\u003e\u0026lt;thead\u0026gt;\u003c/code\u003e (if \u003ccode\u003ehas_header\u003c/code\u003e) and \u003ccode\u003e\u0026lt;tbody\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eProperly escapes all cell content for HTML safety\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eHTML output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etable\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;csv-table\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ethead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eName\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAge\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eCity\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ethead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etbody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAlice\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e30\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eNew York\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eBob\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e25\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eLos Angeles\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eCharlie\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e35\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eChicago\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etbody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etable\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCSS styling:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ecsv-table\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eborder-collapse\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ecollapse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ewidth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"kt\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003emargin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ecsv-table\u003c/span\u003e \u003cspan class=\"nt\"\u003eth\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ecsv-table\u003c/span\u003e \u003cspan class=\"nt\"\u003etd\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eborder\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"kc\"\u003esolid\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ddd\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003epadding\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003etext-align\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ecsv-table\u003c/span\u003e \u003cspan class=\"nt\"\u003eth\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f5f5f5\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efont-weight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ebold\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ecsv-table\u003c/span\u003e \u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003enth-child\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003eeven\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#fafafa\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eEnabling the plugin:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eDefaultPlugins\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewCSVFencePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr by name:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epluginList\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePluginsByNames\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// ... default plugins ...\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;csv_fence\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"cleanup-stage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCleanup Stage\u003c/span\u003e \u003ca href=\"#cleanup-stage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"pagefind\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003epagefind\u003c/span\u003e \u003ca href=\"#pagefind\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003epagefind\u003c/code\u003e\u003cbr\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Cleanup\u003cbr\u003e\n\u003cstrong\u003ePriority:\u003c/strong\u003e Last (runs after all files are written)\u003cbr\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Generates a full-text search index using \u003ca href=\"https://pagefind.app/\"\u003ePagefind\u003c/a\u003e after the site is built.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Enable/disable search (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;navbar\u0026#34;\u003c/span\u003e         \u003cspan class=\"c\"\u003e# Search UI position: navbar, sidebar, footer, custom\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eplaceholder\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Search...\u0026#34;\u003c/span\u003e   \u003cspan class=\"c\"\u003e# Search input placeholder text\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_images\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Show thumbnails in results (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexcerpt_length\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e200\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Characters for result excerpts (default: 200)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epagefind\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebundle_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;_pagefind\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Output directory for search index (default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eroot_selector\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e          \u003cspan class=\"c\"\u003e# CSS selector for searchable content (optional)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude_selectors\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e      \u003cspan class=\"c\"\u003e# CSS selectors to exclude from indexing\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOptions:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable/disable search functionality\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eposition\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;navbar\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWhere to show search UI\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eplaceholder\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;Search...\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSearch input placeholder\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshow_images\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow thumbnails in results\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexcerpt_length\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e200\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCharacters for result excerpts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epagefind.bundle_dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;_pagefind\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOutput directory for index\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epagefind.root_selector\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCSS selector for searchable content\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epagefind.exclude_selectors\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eElements to exclude from indexing\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eRequirements:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePagefind CLI must be installed (standalone binary from \u003ca href=\"https://github.com/Pagefind/pagefind/releases\"\u003eGitHub releases\u003c/a\u003e, or via \u003ccode\u003eauto_install = true\u003c/code\u003e in config)\u003c/li\u003e\n\u003cli\u003eIf not installed, the plugin logs a warning but does not fail the build\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eRuns in Cleanup stage with \u003ccode\u003ePriorityLast\u003c/code\u003e (after all HTML files are written)\u003c/li\u003e\n\u003cli\u003eChecks if search is enabled in configuration\u003c/li\u003e\n\u003cli\u003eChecks if \u003ccode\u003epagefind\u003c/code\u003e CLI is available in PATH\u003c/li\u003e\n\u003cli\u003eHashes the searchable corpus and skips Pagefind when indexed content is unchanged\u003c/li\u003e\n\u003cli\u003eExecutes \u003ccode\u003epagefind --site {output_dir}\u003c/code\u003e with configured options when a refresh is needed\u003c/li\u003e\n\u003cli\u003eGenerates search index in \u003ccode\u003e{output_dir}/_pagefind/\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eGenerated files:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eoutput/\n  _pagefind/\n    pagefind.js           # Main search library\n    pagefind-ui.js        # UI component\n    pagefind-ui.css       # UI styles\n    pagefind.*.pf_index   # Index chunks\n    pagefind.*.pf_meta    # Metadata chunks\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eTemplate integration:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eThe default post template includes \u003ccode\u003edata-pagefind-*\u003c/code\u003e attributes for indexing:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e \u003cspan class=\"na\"\u003edata-pagefind-body\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e \u003cspan class=\"na\"\u003edata-pagefind-meta\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003edata-pagefind-meta\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;excerpt\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.description }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% for tag in post.tags %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003edata-pagefind-filter\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;tag\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;display:none\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ tag }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;content\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ body | safe }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eSearch UI component:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eThe base template includes the search component:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if config.search.enabled %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% include \u0026#34;components/search.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eDisabling search:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eGraceful degradation:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIf Pagefind is not installed, search UI is hidden\u003c/li\u003e\n\u003cli\u003eIf search is disabled, no index is generated\u003c/li\u003e\n\u003cli\u003eSite functions normally without search functionality\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eLazy loading:\u003c/strong\u003e\nPagefind CSS and JS are loaded on user interaction (hover on search, press \u003ccode\u003e/\u003c/code\u003e, press \u003ccode\u003eCtrl+K\u003c/code\u003e) rather than eagerly on page load. This saves ~30-50KB on initial page load for pages where search is not used.\u003c/p\u003e\n\u003cp\u003eSee [[search|Search Guide]] for detailed usage and customization.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"diagnostics_artifact\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ediagnostics_artifact\u003c/span\u003e \u003ca href=\"#diagnostics_artifact\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003ediagnostics_artifact\u003c/code\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Cleanup\n\u003cstrong\u003ePriority:\u003c/strong\u003e \u003ccode\u003ePriorityLast + 100\u003c/code\u003e\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Persists the manager-owned content diagnostics snapshot for a\nsuccessful full build.\u003c/p\u003e\n\u003cp\u003eThis plugin is enabled by default and has no configuration entry. It writes:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;output_dir\u0026gt;/.markata/diagnostics.json\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe versioned JSON contains summary counts, per-source dispositions, stable\nreason codes, diagnostics, feed-level selection details, and build identity\nmetadata. It contains no raw content, frontmatter, rendered HTML, secrets, or\nabsolute paths. Failed, dry-run, fast, incremental, and incomplete builds do not\npublish a new artifact. See the \u003ca href=\"/docs/guides/content-diagnostics/\"\u003eContent Diagnostics guide\u003c/a\u003e\nfor the wire format and privacy contract.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"css_minify\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ecss_minify\u003c/span\u003e \u003ca href=\"#css_minify\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003ecss_minify\u003c/code\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Write (PriorityLast)\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Minifies all CSS files in the output directory to reduce file sizes and improve performance scores.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecss_minify\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                      \u003cspan class=\"c\"\u003e# Enable CSS minification (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;variables.css\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e         \u003cspan class=\"c\"\u003e# Files to skip (exact names or glob patterns)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epreserve_comments\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Copyright\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e   \u003cspan class=\"c\"\u003e# Strings that mark comments to preserve\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOptions:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable/disable CSS minification\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexclude\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFile patterns to skip (supports \u003ccode\u003e*\u003c/code\u003e, \u003ccode\u003e?\u003c/code\u003e, \u003ccode\u003e[\u003c/code\u003e glob syntax)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epreserve_comments\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSubstrings identifying comments to keep in output\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eRuns with \u003ccode\u003ePriorityLast\u003c/code\u003e in Write stage (after all CSS-generating plugins: \u003ccode\u003epalette_css\u003c/code\u003e, \u003ccode\u003echroma_css\u003c/code\u003e, \u003ccode\u003ecss_bundle\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eWalks the output directory recursively for \u003ccode\u003e.css\u003c/code\u003e files\u003c/li\u003e\n\u003cli\u003eSkips files matching exclusion patterns (exact match or glob)\u003c/li\u003e\n\u003cli\u003eExtracts comments containing \u003ccode\u003epreserve_comments\u003c/code\u003e substrings\u003c/li\u003e\n\u003cli\u003eMinifies content using \u003ccode\u003etdewolff/minify/v2\u003c/code\u003e CSS minifier\u003c/li\u003e\n\u003cli\u003ePrepends preserved comments to minified output\u003c/li\u003e\n\u003cli\u003eWrites minified content back to the same file\u003c/li\u003e\n\u003cli\u003eReuses verified exact-input persistent results and logs transformed/restored/excluded/failed counts and transformed size reduction\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eExample output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e[css_minify] Completed: 8 transformed, 0 restored, 1 excluded, 0 failed\n[css_minify] Size reduction: 45230 -\u0026gt; 28940 bytes (36.0% smaller)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eRelated plugins:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e[[#palette_css|palette_css]] - Generates palette CSS (minified by this plugin)\u003c/li\u003e\n\u003cli\u003e[[#chroma_css|chroma_css]] - Generates syntax highlighting CSS (minified by this plugin)\u003c/li\u003e\n\u003cli\u003e[[#js_minify|js_minify]] - Companion JS minification plugin\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"js_minify\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ejs_minify\u003c/span\u003e \u003ca href=\"#js_minify\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eName:\u003c/strong\u003e \u003ccode\u003ejs_minify\u003c/code\u003e\n\u003cstrong\u003eStage:\u003c/strong\u003e Write (PriorityLast)\n\u003cstrong\u003ePurpose:\u003c/strong\u003e Minifies all JavaScript files in the output directory to reduce file sizes and improve performance scores.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration (TOML):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ejs_minify\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                      \u003cspan class=\"c\"\u003e# Enable JS minification (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pagefind-ui.js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Files to skip (exact names or glob patterns)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOptions:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable/disable JS minification\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexclude\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFile patterns to skip (supports \u003ccode\u003e*\u003c/code\u003e, \u003ccode\u003e?\u003c/code\u003e, \u003ccode\u003e[\u003c/code\u003e glob syntax)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eBehavior:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eRuns with \u003ccode\u003ePriorityLast\u003c/code\u003e in Write stage (after all JS-generating plugins)\u003c/li\u003e\n\u003cli\u003eWalks the output directory recursively for \u003ccode\u003e.js\u003c/code\u003e files\u003c/li\u003e\n\u003cli\u003eAutomatically skips \u003ccode\u003e.min.js\u003c/code\u003e files (already minified)\u003c/li\u003e\n\u003cli\u003eSkips files matching exclusion patterns (exact match or glob)\u003c/li\u003e\n\u003cli\u003eMinifies content using \u003ccode\u003etdewolff/minify/v2\u003c/code\u003e JS minifier\u003c/li\u003e\n\u003cli\u003eWrites minified content back to the same file\u003c/li\u003e\n\u003cli\u003eReuses verified exact-input persistent results and logs transformed/restored/excluded/failed counts and transformed size reduction\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eExample output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e[js_minify] Completed: 12 transformed, 0 restored, 2 excluded, 0 failed\n[js_minify] Size reduction: 145337 -\u0026gt; 72100 bytes (50.4% smaller)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eTypical reduction by file:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFile\u003c/th\u003e\n\u003cth\u003eOriginal\u003c/th\u003e\n\u003cth\u003eMinified\u003c/th\u003e\n\u003cth\u003eReduction\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eview-transitions.js\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e13.3KB\u003c/td\u003e\n\u003ctd\u003e~6.5KB\u003c/td\u003e\n\u003ctd\u003e~51%\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econditional-css.js\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e~3KB\u003c/td\u003e\n\u003ctd\u003e~1.5KB\u003c/td\u003e\n\u003ctd\u003e~50%\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecopy-code.js\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e~2KB\u003c/td\u003e\n\u003ctd\u003e~1KB\u003c/td\u003e\n\u003ctd\u003e~50%\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eRelated plugins:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e[[#css_minify|css_minify]] - Companion CSS minification plugin\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBoth minifiers store private per-asset exact-input records and verified result blobs\noutside published output, under \u003ccode\u003e\u0026lt;content_dir\u0026gt;/.markata/asset-minify/v1/\u003c/code\u003e or the\nnonempty top-level \u003ccode\u003ecache_dir\u003c/code\u003e override. Only an exact current-input digest and\nmatching recipe authorize result reuse; the source hash names exact transform\ninput, not original author source. Hits atomically publish verified results with\nmode \u003ccode\u003e0644\u003c/code\u003e even when bytes already match, except empty JavaScript.\nThere is no processed-output shortcut: important CSS comments can make the\ntransform non-idempotent. Recopied exact inputs restore verified results without\ninvoking the engine, but retained output may need fresh transformations.\nRecipe changes include CSS comment options and maintained engine/wrapper\nidentities and always transform current stage-input bytes, never an older source\nsnapshot selected by a processed-output or retry digest. Previously stripped\ncomments need regeneration from authoritative source. Cache and transform\nfailures are explicit warnings, not fatal build\nerrors. Fast mode, disabled plugins, exclusions, and \u003ccode\u003e_pagefind\u003c/code\u003e retain their\nexisting behavior. Legacy sidecars are not trusted or removed; perform a\nsource-regenerating rebuild after upgrading. See the\n\u003ca href=\"../guides/performance.md#persistent-css-and-javascript-minification\"\u003eperformance guide\u003c/a\u003e\nfor privacy, recovery limits, and measurement details.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"disabling-plugins\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDisabling Plugins\u003c/span\u003e \u003ca href=\"#disabling-plugins\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTo use only specific plugins, configure them explicitly:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;github.com/example/markata-go/pkg/plugins\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Minimal set for basic builds\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eminimalPlugins\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eMinimalPlugins\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Or pick specific plugins\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecustomPlugins\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewGlobPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewLoadPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewRenderMarkdownPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewPublishHTMLPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr use plugin names:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epluginList\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ewarnings\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePluginsByNames\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;glob\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;load\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;render_markdown\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;publish_html\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"creating-custom-plugins\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCreating Custom Plugins\u003c/span\u003e \u003ca href=\"#creating-custom-plugins\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eImplement the \u003ccode\u003elifecycle.Plugin\u003c/code\u003e interface and optionally stage-specific interfaces:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eMyPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"p\"\u003e{}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eMyPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;my_plugin\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Implement stage interfaces as needed:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// - lifecycle.ConfigurePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// - lifecycle.GlobPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// - lifecycle.LoadPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// - lifecycle.TransformPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// - lifecycle.RenderPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// - lifecycle.CollectPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// - lifecycle.WritePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// - lifecycle.CleanupPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eMyPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eTransform\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eProcessPostsConcurrently\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003emodels\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePost\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Process each post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;my_field\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;my_value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRegister your plugin:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegisterPluginConstructor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;my_plugin\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003eMyPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e{}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSee [[plugin-development|Plugin Development Guide]] for complete instructions.\u003c/p\u003e\n\u003cdiv class=\"footnotes\" role=\"doc-endnotes\"\u003e\n\u003chr\u003e\n\u003col\u003e\n\u003cli id=\"fn:1\"\u003e\n\u003cp\u003eThis is the footnote content.\u0026#160;\u003ca href=\"#fnref:1\" class=\"footnote-backref\" role=\"doc-backlink\"\u003e\u0026#x21a9;\u0026#xfe0e;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/div\u003e\n\n\u003cscript src=\"/assets/vendor/chartjs/chart.min.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n(function() {\nconst initCharts = function() {\n  (function() {\n    const ctx = document.getElementById('chartjs-3');\n    if (!ctx || typeof Chart !== 'function') return;\n    ctx.hidden = false;\n    try {\n      new Chart(ctx, {\"data\":{\"datasets\":[{\"backgroundColor\":[\"rgba(54, 162, 235, 0.7)\",\"rgba(54, 162, 235, 0.7)\",\"rgba(54, 162, 235, 0.7)\",\"rgba(54, 162, 235, 0.7)\",\"rgba(54, 162, 235, 0.7)\",\"rgba(54, 162, 235, 0.7)\"],\"borderColor\":\"rgba(54, 162, 235, 1)\",\"borderWidth\":1,\"data\":[12500,19200,15800,22400,18900,25600],\"label\":\"Monthly Sales ($)\"}],\"labels\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\"]},\"options\":{\"plugins\":{\"title\":{\"display\":true,\"text\":\"2024 Sales Performance\"}},\"responsive\":true,\"scales\":{\"y\":{\"beginAtZero\":true,\"ticks\":{\"callback\":\"$\"}}}},\"type\":\"bar\"});\n      const data = document.getElementById('chartjs-3-data');\n      if (data) data.open = false;\n    } catch (error) {\n      ctx.hidden = true;\n    }\n  })();\n  (function() {\n    const ctx = document.getElementById('chartjs-4');\n    if (!ctx || typeof Chart !== 'function') return;\n    ctx.hidden = false;\n    try {\n      new Chart(ctx, {\"data\":{\"datasets\":[{\"backgroundColor\":\"rgba(75, 192, 192, 0.2)\",\"borderColor\":\"rgba(75, 192, 192, 1)\",\"data\":[2400,3100,2800,4200,3900,5100],\"fill\":true,\"label\":\"Page Views\",\"tension\":0.3},{\"backgroundColor\":\"rgba(255, 99, 132, 0.2)\",\"borderColor\":\"rgba(255, 99, 132, 1)\",\"data\":[1200,1500,1400,2100,1950,2600],\"fill\":true,\"label\":\"Unique Visitors\",\"tension\":0.3}],\"labels\":[\"Week 1\",\"Week 2\",\"Week 3\",\"Week 4\",\"Week 5\",\"Week 6\"]},\"options\":{\"plugins\":{\"legend\":{\"position\":\"bottom\"},\"title\":{\"display\":true,\"text\":\"Website Traffic - Q1 2024\"}},\"responsive\":true,\"scales\":{\"y\":{\"beginAtZero\":true}}},\"type\":\"line\"});\n      const data = document.getElementById('chartjs-4-data');\n      if (data) data.open = false;\n    } catch (error) {\n      ctx.hidden = true;\n    }\n  })();\n  (function() {\n    const ctx = document.getElementById('chartjs-5');\n    if (!ctx || typeof Chart !== 'function') return;\n    ctx.hidden = false;\n    try {\n      new Chart(ctx, {\"data\":{\"datasets\":[{\"backgroundColor\":[\"rgba(255, 99, 132, 0.8)\",\"rgba(54, 162, 235, 0.8)\",\"rgba(255, 206, 86, 0.8)\",\"rgba(75, 192, 192, 0.8)\",\"rgba(153, 102, 255, 0.8)\"],\"borderColor\":[\"rgba(255, 99, 132, 1)\",\"rgba(54, 162, 235, 1)\",\"rgba(255, 206, 86, 1)\",\"rgba(75, 192, 192, 1)\",\"rgba(153, 102, 255, 1)\"],\"borderWidth\":2,\"data\":[35,25,20,15,5]}],\"labels\":[\"Tutorials\",\"How-To Guides\",\"Reference Docs\",\"Blog Posts\",\"Case Studies\"]},\"options\":{\"plugins\":{\"legend\":{\"position\":\"right\"},\"title\":{\"display\":true,\"text\":\"Content Distribution by Type\"}},\"responsive\":true},\"type\":\"pie\"});\n      const data = document.getElementById('chartjs-5-data');\n      if (data) data.open = false;\n    } catch (error) {\n      ctx.hidden = true;\n    }\n  })();\n  (function() {\n    const ctx = document.getElementById('chartjs-6');\n    if (!ctx || typeof Chart !== 'function') return;\n    ctx.hidden = false;\n    try {\n      new Chart(ctx, {\"data\":{\"datasets\":[{\"backgroundColor\":[\"rgba(76, 175, 80, 0.8)\",\"rgba(255, 193, 7, 0.8)\",\"rgba(158, 158, 158, 0.8)\"],\"borderWidth\":0,\"data\":[68,22,10]}],\"labels\":[\"Completed\",\"In Progress\",\"Not Started\"]},\"options\":{\"cutout\":\"60%\",\"plugins\":{\"legend\":{\"position\":\"bottom\"},\"title\":{\"display\":true,\"text\":\"Project Completion Status\"}},\"responsive\":true},\"type\":\"doughnut\"});\n      const data = document.getElementById('chartjs-6-data');\n      if (data) data.open = false;\n    } catch (error) {\n      ctx.hidden = true;\n    }\n  })();\n};\nif (document.readyState === 'loading') {\n  document.addEventListener('DOMContentLoaded', initCharts, {once: true});\n} else {\n  initCharts();\n}\n})();\n\u003c/script\u003e\n\u003cscript type=\"module\"\u003e\n  const mermaid = await (async () =\u003e {\n    if (window.mermaid) return window.mermaid;\n    await new Promise((resolve, reject) =\u003e {\n      const s = document.createElement('script');\n      s.src = '/assets/vendor/mermaid/mermaid.min.js';\n      s.onload = resolve;\n      s.onerror = () =\u003e reject(new Error('failed to load mermaid from ' + s.src));\n      document.head.appendChild(s);\n    });\n    return window.mermaid;\n  })();\n\n  const diagramSources = new WeakMap();\n  let renderQueue = Promise.resolve();\n  const renderDiagrams = async (root = document) =\u003e {\n    const roots = Array.isArray(root) ? root : [root];\n    const blocks = roots.flatMap(node =\u003e node.matches?.('pre.mermaid') ? [node] : [...(node.querySelectorAll?.('pre.mermaid') || [])]);\n    if (blocks.length === 0) return;\n\n    for (const block of blocks) {\n      if (!diagramSources.has(block)) {\n        const source = block.textContent || '';\n        diagramSources.set(block, source);\n        block.dataset.markataMermaidSource = source;\n      }\n      block.removeAttribute('data-processed');\n      block.textContent = diagramSources.get(block);\n    }\n\n    const css = (name, fallback) =\u003e {\n      const probe = document.createElement('span');\n      probe.style.backgroundColor = `var(${name}, ${fallback})`;\n      document.documentElement.appendChild(probe);\n      const value = getComputedStyle(probe).backgroundColor;\n      probe.remove();\n      // Mermaid 10 does not accept color-mix(), color(), or other CSS color\n      // functions. Resolve the active CSS color through canvas to an RGB value.\n      const canvas = document.createElement('canvas');\n      const context = canvas.getContext('2d');\n      if (!context) return value;\n      context.fillStyle = value;\n      context.fillRect(0, 0, 1, 1);\n      const [red, green, blue] = context.getImageData(0, 0, 1, 1).data;\n      return `rgb(${red}, ${green}, ${blue})`;\n    };\n    // The active palette is the source of truth: OS preference may differ\n    // from the user-selected theme.\n    const background = css('--color-background', '#ffffff');\n    const accent = css('--color-primary', '#64748b');\n    const surface = css('--color-surface', background);\n    const foreground = css('--color-text', '#1f2937');\n    const border = css('--color-border', accent);\n    const flowchart = { nodeSpacing: 60, rankSpacing: 90, padding: 12 };\n    const themeCSS = `\n    .label foreignObject \u003e div { padding: 14px 14px 10px; line-height: 1.2; }\n    .nodeLabel { padding: 14px 14px 10px; line-height: 1.2; }\n\n  `;\n    const themeVariables = {\n      background,\n      primaryColor: surface,\n      primaryTextColor: foreground,\n      primaryBorderColor: border,\n      // Diagram edges encode direction and relationships, so keep them at\n      // foreground contrast instead of the intentionally subtle node border.\n      lineColor: foreground,\n      textColor: foreground,\n      nodeBkg: surface,\n      nodeBorder: border,\n      nodeTextColor: foreground,\n      fontSize: '16px',\n      nodePadding: 20,\n      nodeTextMargin: 14,\n      clusterBkg: background,\n      clusterBorder: border,\n      clusterTextColor: foreground,\n      titleColor: foreground,\n      edgeLabelBackground: surface,\n    };\n\n    mermaid.initialize({ startOnLoad: false, theme: 'base', themeVariables, flowchart, themeCSS });\n    await mermaid.run({ nodes: blocks });\n    ensureMermaidLightbox();\n  };\n\n  window.initMermaid = (root = document) =\u003e {\n    renderQueue = renderQueue.then(() =\u003e renderDiagrams(root)).catch(e =\u003e {\n      console.error('mermaid.run failed:', e);\n    });\n    return renderQueue;\n  };\n  const rerenderMermaid = () =\u003e window.initMermaid();\n  window.addEventListener('theme-change', rerenderMermaid);\n  window.addEventListener('palette-change', rerenderMermaid);\n  window.addEventListener('color-mode-change', rerenderMermaid);\n  window.addEventListener('view-transition-complete', rerenderMermaid);\n\n  const SVG_PAN_ZOOM_CDN = '/assets/vendor/svg-pan-zoom/svg-pan-zoom.min.js';\n  let mermaidLightbox = null;\n  let activePanZoom = null;\n\n  // Inject lightbox styles once\n  const injectLightboxStyles = () =\u003e {\n    if (document.getElementById('mermaid-lightbox-css')) return;\n    const style = document.createElement('style');\n    style.id = 'mermaid-lightbox-css';\n    style.textContent = `\n      /* Container fills the GLightbox slide */\n      .mermaid-lightbox-wrap {\n        width: 100%;\n        height: 100%;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        background: transparent;\n        position: relative;\n      }\n      .mermaid-lightbox-wrap svg {\n        width: 100% !important;\n        height: 100% !important;\n        max-width: 100%;\n        max-height: 100%;\n      }\n      /* Hide GLightbox prev/next arrows (single-slide lightbox) */\n      .glightbox-container .gprev,\n      .glightbox-container .gnext {\n        display: none !important;\n      }\n      /* Hide description area that renders as a white box */\n      .glightbox-container .gslide-description,\n      .glightbox-container .gslide-title,\n      .glightbox-container .gdesc-inner,\n      .glightbox-container .gslide-desc {\n        display: none !important;\n      }\n      /* Remove white background from inline slide content */\n      .glightbox-container .gslide-inline {\n        background: transparent !important;\n      }\n      /* Make the inline content area fill the slide */\n      .glightbox-container .ginlined-content {\n        max-width: none !important;\n        max-height: none !important;\n        width: 100%;\n        height: 100%;\n        padding: 0 !important;\n      }\n      /* Remove box-shadow from the media container */\n      .glightbox-container .gslide-media {\n        box-shadow: none !important;\n      }\n      /* Toolbar styling */\n      .mermaid-lightbox-toolbar {\n        position: absolute;\n        top: 8px;\n        right: 8px;\n        z-index: 10;\n        display: flex;\n        gap: 4px;\n      }\n      .mermaid-pz-btn {\n        background: rgba(0,0,0,0.6);\n        color: #fff;\n        border: 1px solid rgba(255,255,255,0.3);\n        border-radius: 4px;\n        padding: 4px 10px;\n        cursor: pointer;\n        font-size: 14px;\n        line-height: 1;\n      }\n      .mermaid-pz-btn:hover {\n        background: rgba(0,0,0,0.8);\n        border-color: rgba(255,255,255,0.6);\n      }\n    `;\n    document.head.appendChild(style);\n  };\n\n  // Lazy-load svg-pan-zoom from CDN, returns a promise\n  const loadSvgPanZoom = () =\u003e {\n    if (typeof svgPanZoom !== 'undefined') return Promise.resolve();\n    return new Promise((resolve, reject) =\u003e {\n      const s = document.createElement('script');\n      s.src = SVG_PAN_ZOOM_CDN;\n      s.onload = resolve;\n      s.onerror = reject;\n      document.head.appendChild(s);\n    });\n  };\n\n  // Initialize svg-pan-zoom on the SVG inside the lightbox.\n  // Retries until the lightbox container has settled dimensions.\n  let _pzRetries = 0;\n  const initPanZoom = () =\u003e {\n    if (activePanZoom) return;\n    const container = document.querySelector('.glightbox-container .gslide.current .mermaid-lightbox-wrap');\n    if (!container) return;\n    const svgEl = container.querySelector('svg');\n    if (!svgEl) return;\n\n    // Ensure the container has layout dimensions before initializing.\n    const cRect = container.getBoundingClientRect();\n    if (cRect.width \u003c 10 || cRect.height \u003c 10) {\n      if (_pzRetries \u003c 20) { _pzRetries++; setTimeout(initPanZoom, 50); }\n      return;\n    }\n\n    // svg-pan-zoom needs a viewBox. Pre-rendered SVGs from mermaid\n    // usually have one; browser-rendered ones may not.\n    if (!svgEl.getAttribute('viewBox')) {\n      let w = parseFloat(svgEl.getAttribute('width'));\n      let h = parseFloat(svgEl.getAttribute('height'));\n      if (!w \u0026\u0026 svgEl.style.maxWidth) w = parseFloat(svgEl.style.maxWidth);\n      if (!w || !h) {\n        const r = svgEl.getBoundingClientRect();\n        if (!w) w = r.width;\n        if (!h) h = r.height;\n      }\n      if (w \u003e 0 \u0026\u0026 h \u003e 0) {\n        svgEl.setAttribute('viewBox', '0 0 ' + w + ' ' + h);\n      } else if (_pzRetries \u003c 20) {\n        _pzRetries++; setTimeout(initPanZoom, 50); return;\n      }\n    }\n    _pzRetries = 0;\n\n    // Clear inline dimensions so SVG can be sized by the container\n    // and svg-pan-zoom can manage transforms.\n    svgEl.removeAttribute('width');\n    svgEl.removeAttribute('height');\n    svgEl.style.cssText = 'width:100%;height:100%;';\n\n    try {\n      activePanZoom = svgPanZoom(svgEl, {\n        zoomEnabled: true,\n        panEnabled: true,\n        controlIconsEnabled: false,\n        fit: true,\n        center: true,\n        contain: false,\n        minZoom: 0.3,\n        maxZoom: 10,\n        zoomScaleSensitivity: 0.3,\n        mouseWheelZoomEnabled: true,\n        preventMouseEventsDefault: true,\n      });\n      // Double-check fit after a frame in case dimensions shifted\n      requestAnimationFrame(() =\u003e {\n        if (!activePanZoom) return;\n        activePanZoom.resize();\n        activePanZoom.fit();\n        activePanZoom.center();\n      });\n    } catch (_) {\n      activePanZoom = null;\n    }\n\n    // Add reset/fit buttons\n    let toolbar = container.querySelector('.mermaid-lightbox-toolbar');\n    if (!toolbar) {\n      toolbar = document.createElement('div');\n      toolbar.className = 'mermaid-lightbox-toolbar';\n      toolbar.innerHTML =\n        '\u003cbutton class=\"mermaid-pz-btn\" data-action=\"fit\" title=\"Fit to view\"\u003eFit\u003c/button\u003e' +\n        '\u003cbutton class=\"mermaid-pz-btn\" data-action=\"zoomin\" title=\"Zoom in\"\u003e+\u003c/button\u003e' +\n        '\u003cbutton class=\"mermaid-pz-btn\" data-action=\"zoomout\" title=\"Zoom out\"\u003e\u0026minus;\u003c/button\u003e';\n      toolbar.addEventListener('click', (ev) =\u003e {\n        const btn = ev.target.closest('[data-action]');\n        if (!btn || !activePanZoom) return;\n        ev.preventDefault();\n        ev.stopPropagation();\n        const action = btn.dataset.action;\n        if (action === 'fit') { activePanZoom.resize(); activePanZoom.fit(); activePanZoom.center(); }\n        else if (action === 'zoomin') { activePanZoom.zoomIn(); }\n        else if (action === 'zoomout') { activePanZoom.zoomOut(); }\n      });\n      container.prepend(toolbar);\n    }\n  };\n\n  // Destroy pan-zoom on lightbox close\n  const destroyPanZoom = () =\u003e {\n    if (activePanZoom) {\n      try { activePanZoom.destroy(); } catch (_) { /* no-op */ }\n      activePanZoom = null;\n    }\n  };\n\n  let _lbRetries = 0;\n  const ensureMermaidLightbox = () =\u003e {\n    const diagrams = document.querySelectorAll('.mermaid svg');\n    if (!diagrams.length) {\n      // Mermaid ESM may still be rendering -- retry up to 2s\n      if (_lbRetries \u003c 20) { _lbRetries++; setTimeout(ensureMermaidLightbox, 100); }\n      return;\n    }\n    _lbRetries = 0;\n    injectLightboxStyles();\n    diagrams.forEach((svg) =\u003e {\n      if (svg.dataset.lightboxBound) return;\n      svg.dataset.lightboxBound = 'true';\n      svg.style.cursor = 'pointer';\n      svg.addEventListener('click', (e) =\u003e {\n        e.preventDefault();\n        e.stopPropagation();\n        const svgHtml = svg.outerHTML;\n        const openLightbox = () =\u003e {\n          if (!mermaidLightbox) {\n            mermaidLightbox = GLightbox({\n              selector: false,\n              openEffect: 'fade',\n              closeEffect: 'fade',\n              zoomable: false,\n              draggable: false,\n              skin: 'clean',\n            });\n            mermaidLightbox.on('slide_after_load', () =\u003e {\n              destroyPanZoom();\n              _pzRetries = 0;\n              loadSvgPanZoom().then(() =\u003e initPanZoom());\n            });\n            mermaidLightbox.on('close', destroyPanZoom);\n          }\n          mermaidLightbox.setElements([{\n            content: '\u003cdiv class=\"mermaid-lightbox-wrap\"\u003e' + svgHtml + '\u003c/div\u003e',\n            width: '90vw',\n            height: '90vh'\n          }]);\n          mermaidLightbox.open();\n          loadSvgPanZoom();\n        };\n        if (typeof GLightbox !== 'undefined') {\n          openLightbox();\n        } else if (window.initGLightbox) {\n          window.initGLightbox();\n          openLightbox();\n        } else {\n          window.addEventListener('glightbox-ready', () =\u003e { openLightbox(); }, { once: true });\n        }\n      });\n    });\n  };\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', () =\u003e window.initMermaid());\n  } else {\n    window.initMermaid();\n  }\n\u003c/script\u003e",
      "content_text": "\n## Built-in Plugins Reference\n\nThis reference documents all built-in plugins that ship with markata-go. Plugins are organized by their lifecycle stage.\n\n**Related guides:**\n- [[plugin-development|Plugin Development]] - Create your own plugins\n- [[configuration-guide|Configuration]] - Configure plugins\n- [[feeds-guide|Feeds]] - Feed plugins in detail\n\n## Plugin Lifecycle Overview\n\n```\nConfigure -\u003e Glob -\u003e Load -\u003e Transform -\u003e Render -\u003e Collect -\u003e Write -\u003e Cleanup\n```\n\n| Stage | Purpose | Example Plugins |\n|-------|---------|-----------------|\n| Configure | Initialize plugin settings | templates |\n| Glob | Discover content files | glob |\n| Load | Parse files into posts | load, frontmatter |\n| Transform | Pre-render modifications | description, reading_time, stats, breadcrumbs, jinja_md, wikilinks, toc |\n| Render | Convert content to HTML | render_markdown, templates, admonitions, heading_anchors, link_collector, mermaid, glossary, csv_fence, youtube, webawesome |\n| Configure | Build-time tooling | tailwind, cdn_assets, pagefind |\n| Collect | Build collections/feeds | series, feeds, auto_feeds, prevnext, overwrite_check, static_file_conflicts |\n| Write | Output files to disk | publish_html, random_post, publish_feeds, sitemap, content_index, images, rss, atom, jsonfeed, static_assets, redirects |\n| Cleanup | Post-build tasks | pagefind, diagnostics_artifact |\n\n---\n\n### icons\n\n**Name:** `icons`\u003cbr\u003e\n**Stage:** Transform (after other source transforms, before Markdown rendering)\u003cbr\u003e\n**Purpose:** Resolve Zensical-style SVG shortcodes in Markdown.\n\n````markdown\nA release :lucide-rocket: ready to ship.\n````\n\nThe icon is inlined as decorative SVG, with no icon-font or client-side\ndependency. The default pinned Lucide pack is vendored on first use, with\nproject-local SVGs under `.icons/` or `static/.icons/` taking precedence.\nFor disconnected first-use builds, supply a cached/local pack or keep the\nliteral shortcode; there is no forced network request in offline mode.\n\nThe default theme supports `md-icon` inside cards and `md-feature` with\n`md-feature-icon`/`md-feature-body` for icon-first feature rows, without\nchanging shortcode semantics. See [Icon Shortcodes](/docs/guides/icons/).\n\n---\n\n### content_index\n\n**Name:** `content_index`\n**Stage:** Write\n**Purpose:** Writes an optional, compact, versioned JSON artifact containing\nresolved document metadata and feed membership. Private documents are included\nas safe metadata-only records.\n\n**Configuration:**\n\n```toml\n[markata-go.content_index]\nenabled = true\noutput = \"content-index.json\"\nschema_version = 2\n```\n\nThe output is disabled by default. Relative paths are below `output_dir`.\nV2 is the default and includes non-draft, non-skipped documents, including\nprivate documents as safe metadata-only records. Private titles and\ndescriptions are included only when explicitly authored; bodies, rendered HTML,\nencryption keys, private media, and derived biographies are excluded. Set\n`schema_version = 1` for the released public-only compatibility format. See the\n[Content Index guide](/docs/guides/content-index/) for the parser and\ncompatibility contract.\n\n---\n\n### images\n\n**Name:** `images`\u003cbr\u003e\n**Stage:** Write\u003cbr\u003e\n**Purpose:** Builds a public image and video inventory and a searchable authoring page.\n\nThe plugin is enabled by default. It writes `images/index.html`,\n`images/index.json`, and the root-level `images.json` below `output_dir`. See\nthe [Image Library guide](/docs/guides/image-library/) for configuration,\ndiscovery rules, and the template context.\n\n```toml\n[markata-go.images]\nenabled = true\npath = \"images\"\ntemplate = \"images.html\"\nexport_json = true\ninclude_unreferenced = false\n```\n\nThe inventory contains image metadata and public usage relationships. Usage\nrelationships include normalized figure captions when the source appears in a\n`\u003cfigure\u003e`. Draft, private, skipped, and unpublished posts do not create usage\nrelationships. Private bodies are never scanned; only a published private\npost's public-safe `cover` and `cover_alt` frontmatter may add a metadata-only\nrecord. Remote images are recorded without network requests. Trusted Dropper\nhosts use resized URLs only for page previews; canonical sources remain\nunchanged. Set `include_unreferenced = true` explicitly when a local authoring\ninventory should enumerate every supported asset below `assets_dir`.\n\n---\n\n## Glob Stage\n\n### glob\n\n**Name:** `glob`  \n**Stage:** Glob  \n**Purpose:** Discovers content files using configurable glob patterns with gitignore support.\n\n**Configuration (TOML):**\n```toml\n[markata]\nglob_patterns = [\"**/*.md\"]  # Patterns to match\n\n[markata-go.glob]\nuse_gitignore = true  # Respect .gitignore patterns\n```\n\n**Behavior:**\n1. Matches files against configured glob patterns (supports `**` recursive matching)\n2. Excludes files matching `.gitignore` patterns if enabled\n3. Deduplicates files matched by multiple patterns\n4. Returns sorted list for deterministic builds\n\n**Example:**\n```toml\n[markata]\nglob_patterns = [\n    \"posts/**/*.md\",\n    \"pages/*.md\",\n    \"docs/**/*.md\"\n]\n\n[markata-go.glob]\nuse_gitignore = true\n```\n\n---\n\n## Load Stage\n\n### load\n\n**Name:** `load`  \n**Stage:** Load  \n**Purpose:** Reads discovered files and parses them into Post objects with frontmatter and content.\n\n**Configuration:** Uses `[markata-go.glob]` for discovery and default slug behavior\n\n**Behavior:**\n1. Reads each file as UTF-8\n2. Extracts YAML frontmatter between `---` delimiters\n3. Creates Post object with parsed metadata and content\n4. Generates slug from frontmatter or the configured slug mode (`flat` filename-based by default, optional `path` mode for nested content)\n5. Generates href as `/{slug}/`\n\n**Post fields set:**\n| Field | Type | Description |\n|-------|------|-------------|\n| `path` | string | Source file path |\n| `content` | string | Raw markdown content (after frontmatter) |\n| `slug` | string | URL-friendly identifier |\n| `href` | string | URL path (`/{slug}/`) |\n| `title` | *string | From frontmatter |\n| `date` | *time.Time | From frontmatter |\n| `published` | bool | From frontmatter (default: false) |\n| `draft` | bool | From frontmatter (default: false) |\n| `skip` | bool | From frontmatter (default: false) |\n| `tags` | []string | From frontmatter |\n| `description` | *string | From frontmatter |\n| `template` | string | Template name from frontmatter |\n\n**Supported date formats:**\n- RFC3339: `2024-01-15T10:30:00Z`\n- ISO datetime: `2024-01-15T10:30:00`\n- ISO datetime with space: `2024-01-15 10:30:00`\n- ISO date: `2024-01-15`\n- US format: `01/15/2024`\n- European format: `15-01-2024`\n- Long format: `January 15, 2024`\n- Short format: `Jan 15, 2024`\n\n---\n\n### python_docs\n\n**Name:** `python_docs`  \n**Stage:** Load  \n**Purpose:** Generates documentation posts directly from Python source files by extracting module, class, function, and method docstrings.\n\n**Status:** Built-in and disabled by default. It only runs when `python_docs` is listed in `hooks` and `[markata-go.python_docs].enabled = true`.\n\n**Configuration (TOML):**\n```toml\n[markata-go]\nhooks = [\"default\", \"python_docs\"]\n\n[markata-go.python_docs]\nenabled = true\npatterns = [\"src/**/*.py\", \"pkg/**/*.py\"]\nslug_prefix = \"api\"\ntemplate = \"docs\"\ninclude_source = true\ninclude_module_code = false\npublished = false\n```\n\n**Behavior:**\n1. Discovers Python files using its own glob patterns so normal markdown content loading is unchanged.\n2. Parses source with Python's AST via `python3`/`python`.\n3. Creates one post per module, with slug based on the module path.\n4. Renders module docstrings as markdown and adds sections for classes, functions, and methods.\n5. Includes signatures, docstrings, collapsible implementation snippets, and import lists.\n6. Adds internal links when imported modules or referenced symbols are also documented.\n\n**Generated post fields:**\n| Field | Type | Description |\n|-------|------|-------------|\n| `extra.python_docs` | bool | Always `true` for generated source docs |\n| `extra.python_module` | string | Canonical module name, e.g. `pkg.util` |\n| `extra.source_path` | string | Relative source path |\n\n**Notes:**\n- `python_docs` must be explicitly listed in `[markata-go].hooks`.\n- Generated docs are unpublished by default, so they render as shadow pages unless `published = true`.\n- Private `_symbols` are excluded unless `include_private = true`.\n- This plugin is useful for API reference sites that want source-backed docs inside the normal markata-go template pipeline.\n\n---\n\n### frontmatter\n\n**Name:** `frontmatter`  \n**Stage:** Load (utility)  \n**Purpose:** Parses YAML frontmatter from markdown files. Used internally by the `load` plugin.\n\n**Behavior:**\n- Extracts content between `---` delimiters\n- Parses YAML into a map\n- Handles edge cases: no frontmatter, empty frontmatter, unclosed delimiters\n\n**Example frontmatter:**\n```yaml\n---\ntitle: My Post\ndate: 2024-01-15\npublished: true\ntags:\n  - go\n  - programming\ndescription: A short description\ntemplate: post.html\ncustom_field: custom value\n---\n```\n\n---\n\n## Transform Stage\n\n### auto_title\n\n**Name:** `auto_title`  \n**Stage:** Transform (first priority)  \n**Purpose:** Auto-generates human-readable titles for posts that don't have one by deriving them from filenames.\n\n**Configuration:** None required.\n\n**Behavior:**\n1. Runs with highest priority in Transform stage (before other transform plugins)\n2. Skips posts that already have a title set\n3. Extracts the filename without extension\n4. Replaces hyphens and underscores with spaces\n5. Applies title case (first letter of each word capitalized)\n6. Sets `post.Title`\n\n**Post fields set:**\n| Field | Type | Description |\n|-------|------|-------------|\n| `title` | *string | Generated title (if not already set) |\n\n**Example transformations:**\n\n| Filename | Generated Title |\n|----------|-----------------|\n| `my-first-post.md` | \"My First Post\" |\n| `getting_started_guide.md` | \"Getting Started Guide\" |\n| `hello-world.md` | \"Hello World\" |\n| `2024-01-15-release-notes.md` | \"2024 01 15 Release Notes\" |\n\n**When to use:**\n- For quick drafts where you want titles auto-derived\n- When filenames already describe the content well\n- For sites with many posts where manual titling is tedious\n\n**Limitations:**\n- Does not extract titles from H1 headings in content (only uses filename)\n- Numeric prefixes in filenames (like dates) become part of the title\n- Special characters are kept as-is (not removed or transformed)\n\n---\n\n### description\n\n**Name:** `description`  \n**Stage:** Transform  \n**Purpose:** Auto-generates meta descriptions for posts that don't have one by extracting the first paragraph.\n\n**Configuration (TOML):**\n```toml\n[markata]\ndescription_max_length = 160  # Maximum characters (default: 160)\n```\n\n**Behavior:**\n1. Skips posts that already have a description\n2. Extracts first paragraph from content\n3. Strips markdown formatting (links, images, code, emphasis, headers, HTML)\n4. Truncates at word boundary with ellipsis\n5. Sets `post.Description`\n\n**Post fields set:**\n| Field | Type | Description |\n|-------|------|-------------|\n| `description` | *string | Generated description (if not already set) |\n\n**Example:**\n```markdown\n---\ntitle: My Post\n# No description - will be auto-generated\n---\n\nThis is my first paragraph that will become the description.\nIt continues here but will be truncated at 160 characters...\n\n## Second Section\nMore content here.\n```\n\n---\n\n### reading_time\n\n**Name:** `reading_time`  \n**Stage:** Transform  \n**Purpose:** Calculates the public word count and estimated reading time for each post.\n\n**Configuration (TOML):**\n```toml\n[markata-go]\nwords_per_minute = 200  # Average reading speed (default: 200)\n```\n\n`reading_time` reads `words_per_minute` from the top-level `markata-go` section.\n`reading_time` always excludes code. It shares its word-count and reading-time\ncalculator with the `stats` plugin, but the two plugins keep separate\nconfiguration contracts.\n\n**Behavior:**\n1. Counts words in content (excludes code blocks, URLs, HTML)\n2. Calculates reading time based on words per minute\n3. Rounds up to nearest minute (minimum 1 minute)\n4. Stores the public results in the post's Extra map\n\n**Post fields added (in `Extra`):**\n| Field | Type | Description |\n|-------|------|-------------|\n| `word_count` | int | Number of words |\n| `reading_time` | int | Minutes to read |\n| `reading_time_text` | string | Formatted string (e.g., \"5 min read\") |\n\n**Template usage:**\n```html\n\u003cspan class=\"reading-time\"\u003e{{ post.Extra.reading_time_text }}\u003c/span\u003e\n\u003cspan class=\"word-count\"\u003e{{ post.Extra.word_count }} words\u003c/span\u003e\n```\n\n---\n\n### stats\n\n**Name:** `stats`  \n**Stage:** Transform, Collect  \n**Purpose:** Calculates comprehensive content statistics for posts and aggregates them at feed and site levels.\n\n**Configuration (TOML):**\n```toml\n[markata-go.stats]\nwords_per_minute = 200      # Average reading speed (default: 200)\ninclude_code_in_count = false  # Include code blocks in word count (default: false)\ntrack_code_blocks = true    # Count lines of code in code blocks (default: true)\n```\n\nWhen both the top-level `words_per_minute` value and the nested Stats value exist, the top-level value takes precedence.\nStats uses the nested value when the top-level compatibility value is absent.\n\nThe `reading_time` and `stats` plugins share one word-count, reading-time,\nand formatted-text calculator. Their configuration remains separate: in a\nnormal default build, `stats` calculates and stores its own `PostStats` during\nthe early Transform stage, and `reading_time` later writes the public\n`word_count`, `reading_time`, and `reading_time_text` fields.\n\n**Behavior:**\n1. **Transform stage:** Calculates per-post statistics\n   - Calculates Stats' own `PostStats` using the Stats configuration\n   - Writes the same reading-time fields when `stats` runs alone\n   - Character count (letters and digits only)\n2. **Collect stage:** Aggregates statistics\n   - Per-feed totals and averages derived from `PostStats`\n   - Site-wide totals and averages derived from `PostStats`\n\n`include_code_in_count` applies to Stats' `PostStats` and its feed/site\naggregates, including a normal default build. It does not change the public\nfields written by `reading_time`.\n`track_code_blocks` controls the Stats code metrics independently. When it is\nfalse, `PostStats.CodeBlocks` and `PostStats.CodeLines`, and their feed/site\naggregate totals, are zero.\n\n**Post fields exposed (in `Extra`):**\n| Field | Type | Description |\n|-------|------|-------------|\n| `word_count` | int | Number of words |\n| `char_count` | int | Number of characters (no whitespace) |\n| `reading_time` | int | Minutes to read |\n| `reading_time_text` | string | Formatted (e.g., \"5 min read\") |\n| `code_lines` | int | Lines of code in code blocks |\n| `code_blocks` | int | Number of code blocks |\n| `stats` | PostStats | All stats as structured object |\n\n**Feed statistics (via cache):**\n| Field | Type | Description |\n|-------|------|-------------|\n| `post_count` | int | Number of posts in feed |\n| `total_words` | int | Sum of word counts |\n| `total_reading_time` | int | Sum of reading times |\n| `total_reading_time_text` | string | Formatted (e.g., \"2 hours 30 min\") |\n| `average_words` | int | Average word count |\n| `average_reading_time` | int | Average reading time |\n| `total_code_lines` | int | Total lines of code |\n| `total_code_blocks` | int | Total code blocks |\n\n**Site statistics (in `config.Extra.site_stats`):**\nSame fields as feed statistics, aggregated across all posts.\n\n**Template usage:**\n```html\n{# Post-level stats #}\n\u003cdiv class=\"post-meta\"\u003e\n    \u003cspan\u003e{{ post.Extra.reading_time_text }}\u003c/span\u003e\n    \u003cspan\u003e{{ post.Extra.word_count }} words\u003c/span\u003e\n    {% if post.Extra.code_blocks \u003e 0 %}\n    \u003cspan\u003e{{ post.Extra.code_lines }} lines of code\u003c/span\u003e\n    {% endif %}\n\u003c/div\u003e\n\n{# Site-level stats #}\n\u003cdiv class=\"site-stats\"\u003e\n    \u003cp\u003e{{ config.Extra.site_stats.total_posts }} posts\u003c/p\u003e\n    \u003cp\u003e{{ config.Extra.site_stats.total_reading_time_text }} total reading time\u003c/p\u003e\n\u003c/div\u003e\n```\n\n**Use cases:**\n- Display \"X min read\" on post cards\n- Show word count for documentation pages\n- Aggregate stats for feed index pages (\"25 tutorials, ~8 hours\")\n- Track content creation metrics\n- Display code-heavy post indicators\n\n---\n\n### breadcrumbs\n\n**Name:** `breadcrumbs`  \n**Stage:** Transform  \n**Purpose:** Generates breadcrumb navigation trails for posts based on URL path structure with JSON-LD structured data for SEO.\n\n**Configuration (TOML):**\n```toml\n[markata-go.breadcrumbs]\nenabled = true           # Enable/disable breadcrumbs globally\nshow_home = true         # Include \"Home\" as first breadcrumb\nhome_label = \"Home\"      # Label for home breadcrumb\nseparator = \"/\"          # Visual separator between breadcrumbs\nmax_depth = 0            # Maximum depth (0 = unlimited)\nstructured_data = true   # Generate JSON-LD for SEO\n\n# Alternative: under components section\n[markata-go.components.breadcrumbs]\nenabled = true\nshow_home = true\n```\n\n**Frontmatter options:**\n```yaml\n---\ntitle: \"My Page\"\n# Disable breadcrumbs for this page\nbreadcrumbs: false\n\n# Or customize per-page\nbreadcrumbs:\n  enabled: true\n  show_home: false\n  home_label: \"Docs\"\n\n  # Manual breadcrumb trail (overrides auto-generation)\n  items:\n    - label: \"Products\"\n      url: \"/products/\"\n    - label: \"Widgets\"\n      url: \"/products/widgets/\"\n---\n```\n\n**Post fields set:**\n| Field | Type | Description |\n|-------|------|-------------|\n| `post.breadcrumbs` | `[]Breadcrumb` | Array of breadcrumb items |\n| `post.breadcrumb_separator` | `string` | Configured separator character |\n| `post.breadcrumbs_jsonld` | `string` | JSON-LD structured data |\n\n**Breadcrumb item structure:**\n```go\ntype Breadcrumb struct {\n    Label     string // Display text\n    URL       string // Link href\n    IsCurrent bool   // True for last item\n    Position  int    // 1-indexed position\n}\n```\n\n**Auto-generation behavior:**\n1. Parses post's `href` path (e.g., `/docs/guides/getting-started/`)\n2. Creates breadcrumb for each path segment\n3. Humanizes segment names (e.g., `getting-started` → \"Getting Started\")\n4. Uses post title for final segment if available\n5. Optionally prepends \"Home\" breadcrumb\n\n**Template usage:**\n```html\n{# Include the breadcrumbs component #}\n{% include \"components/breadcrumbs.html\" %}\n\n{# Or manual rendering #}\n{% if post.breadcrumbs %}\n\u003cnav class=\"breadcrumbs\" aria-label=\"Breadcrumb\"\u003e\n  \u003col\u003e\n    {% for crumb in post.breadcrumbs %}\n    \u003cli\u003e\n      {% if crumb.is_current %}\n      \u003cspan aria-current=\"page\"\u003e{{ crumb.label }}\u003c/span\u003e\n      {% else %}\n      \u003ca href=\"{{ crumb.url }}\"\u003e{{ crumb.label }}\u003c/a\u003e\n      {% endif %}\n    \u003c/li\u003e\n    {% if not loop.last %}\n    \u003cspan class=\"separator\"\u003e{{ post.breadcrumb_separator }}\u003c/span\u003e\n    {% endif %}\n    {% endfor %}\n  \u003c/ol\u003e\n\u003c/nav\u003e\n{% endif %}\n\n{# Add JSON-LD to head for SEO #}\n{% if post.breadcrumbs_jsonld %}\n\u003cscript type=\"application/ld+json\"\u003e\n{{ post.breadcrumbs_jsonld | safe }}\n\u003c/script\u003e\n{% endif %}\n```\n\n**Generated JSON-LD example:**\n```json\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"BreadcrumbList\",\n  \"itemListElement\": [\n    {\n      \"@type\": \"ListItem\",\n      \"position\": 1,\n      \"name\": \"Home\",\n      \"item\": \"https://example.com/\"\n    },\n    {\n      \"@type\": \"ListItem\",\n      \"position\": 2,\n      \"name\": \"Docs\",\n      \"item\": \"https://example.com/docs/\"\n    },\n    {\n      \"@type\": \"ListItem\",\n      \"position\": 3,\n      \"name\": \"Getting Started\"\n    }\n  ]\n}\n```\n\n**Use cases:**\n- Documentation sites with deep hierarchies\n- Multi-section websites (products, services, about)\n- Blog categories and subcategories\n- SEO improvement via structured data\n- Improved user navigation and orientation\n\n---\n\n### jinja_md\n\n**Name:** `jinja_md`  \n**Stage:** Transform  \n**Purpose:** Processes Jinja2 template expressions within markdown content before rendering.\n\n**Configuration:** Requires `jinja: true` in post frontmatter.\n\n**Activation:**\nPosts must explicitly enable Jinja processing:\n```yaml\n---\ntitle: Dynamic Post\njinja: true\n---\n```\n\n**Template context:**\n| Variable | Type | Description |\n|----------|------|-------------|\n| `post` | Post | Current post object |\n| `config` | Config | Site configuration |\n| `posts` | []Post | All posts |\n| `core` | Manager | Lifecycle manager for filtering |\n| `filter` | func | Filter posts by expression |\n| `map` | func | Map field values from posts |\n\n**Example content:**\n```markdown\n---\ntitle: Recent Posts Index\njinja: true\n---\n\n# Latest Posts\n\n{% for p in filter(\"published == true\")[:5] %}\n- [{{ p.Title }}]({{ p.Href }}) - {{ p.Date.Format \"Jan 2, 2006\" }}\n{% endfor %}\n\n## All Tags\n{% for tag in map(\"tags\", \"published == true\", \"date\", true) %}\n- {{ tag }}\n{% endfor %}\n```\n\n---\n\n### wikilinks\n\n**Name:** `wikilinks`  \n**Stage:** Transform  \n**Purpose:** Transforms `[[slug]]`, `[[slug|text]]`, and `[[slug#fragment]]` wikilink syntax into HTML anchor tags.\n\n**Configuration (TOML):**\n```toml\n[markata]\nwikilinks_warn_broken = true  # Warn about broken links (default: true)\n```\n\n**Syntax:**\n```markdown\nLink to another post: [[other-post-slug]]\nWith custom text: [[other-post-slug|Click here to read more]]\nLink to a section: [[other-post-slug#getting-started]]\nSection with custom text: [[other-post-slug#getting-started|See getting started]]\n```\n\n**Behavior:**\n1. Finds all `[[...]]` patterns in content\n2. Splits the target on the first `#` to extract slug and optional fragment\n3. Looks up target post by slug (case-insensitive), also checks aliases\n4. If found: converts to `\u003ca href=\"/slug/#fragment\"\u003eTitle\u003c/a\u003e` (fragment omitted if empty)\n5. If not found: keeps original syntax, adds warning to post\n\n**Post fields added (in `Extra`):**\n| Field | Type | Description |\n|-------|------|-------------|\n| `wikilink_warnings` | []string | List of broken wikilink warnings |\n\n**Example:**\n```markdown\nCheck out my [[getting-started]] guide.\nYou might also like [[advanced-topics|the advanced guide]].\nJump to [[getting-started#installation]] for setup steps.\n```\n\nBecomes:\n```html\nCheck out my \u003ca href=\"/getting-started/\"\u003eGetting Started\u003c/a\u003e guide.\nYou might also like \u003ca href=\"/advanced-topics/\"\u003ethe advanced guide\u003c/a\u003e.\nJump to \u003ca href=\"/getting-started/#installation\"\u003eGetting Started\u003c/a\u003e for setup steps.\n```\n\n---\n\n### toc\n\n**Name:** `toc`  \n**Stage:** Transform  \n**Purpose:** Extracts headings from markdown and builds a hierarchical table of contents.\n\n**Configuration (TOML):**\n```toml\n[markata]\ntoc_min_level = 2  # Minimum heading level (default: 2, h2)\ntoc_max_level = 4  # Maximum heading level (default: 4, h4)\n```\n\n**Behavior:**\n1. Parses ATX-style headings (`# Heading`)\n2. Generates URL-safe IDs from heading text\n3. Handles duplicate IDs by appending numbers\n4. Builds hierarchical structure\n\n**Post fields added (in `Extra`):**\n| Field | Type | Description |\n|-------|------|-------------|\n| `toc` | []TocEntry | Hierarchical table of contents |\n\n**TocEntry structure:**\n```go\ntype TocEntry struct {\n    Level    int         // Heading level (2-6)\n    Text     string      // Heading text\n    ID       string      // Anchor ID\n    Children []*TocEntry // Nested headings\n}\n```\n\n**Template usage:**\n```html\n{% if post.Extra.toc %}\n\u003cnav class=\"toc\"\u003e\n    \u003ch2\u003eTable of Contents\u003c/h2\u003e\n    \u003cul\u003e\n    {% for entry in post.Extra.toc %}\n        \u003cli\u003e\n            \u003ca href=\"#{{ entry.ID }}\"\u003e{{ entry.Text }}\u003c/a\u003e\n            {% if entry.Children %}\n            \u003cul\u003e\n            {% for child in entry.Children %}\n                \u003cli\u003e\u003ca href=\"#{{ child.ID }}\"\u003e{{ child.Text }}\u003c/a\u003e\u003c/li\u003e\n            {% endfor %}\n            \u003c/ul\u003e\n            {% endif %}\n        \u003c/li\u003e\n    {% endfor %}\n    \u003c/ul\u003e\n\u003c/nav\u003e\n{% endif %}\n```\n\n---\n\n### structured_data\n\n**Name:** `structured_data`  \n**Stage:** Transform  \n**Purpose:** Generates JSON-LD Schema.org markup, OpenGraph meta tags, and Twitter Cards for SEO and social media optimization.\n\n**Configuration (TOML):**\n```toml\n[seo]\ntwitter_handle = \"yourusername\"           # Twitter/X handle (without @)\ndefault_image = \"/images/default-og.jpg\"  # Fallback social image\nlogo_url = \"/images/logo.png\"             # Site logo for Schema.org\n\n[seo.structured_data]\nenabled = true  # Enable/disable (default: true)\n\n[seo.structured_data.default_author]\ntype = \"Person\"\nname = \"Author Name\"\nurl = \"https://example.com/about\"\n\n[seo.structured_data.publisher]\ntype = \"Organization\"\nname = \"Site Name\"\nurl = \"https://example.com\"\nlogo = \"/images/logo.png\"\n```\n\n**Behavior:**\n1. Runs during Transform stage for each published post\n2. Skips posts without titles (required for structured data)\n3. Generates JSON-LD Schema.org BlogPosting markup\n4. Generates OpenGraph meta tags for social sharing\n5. Generates Twitter Card meta tags\n6. Stores all data in `post.Extra[\"structured_data\"]`\n\n**Post fields set (in `Extra`):**\n| Field | Type | Description |\n|-------|------|-------------|\n| `structured_data` | *StructuredData | Container for all SEO metadata |\n\n**StructuredData contains:**\n- `JSONLD` - JSON-LD script content (string)\n- `OpenGraph` - Array of `{Property, Content}` pairs\n- `Twitter` - Array of `{Name, Content}` pairs\n\n**Frontmatter fields used:**\n```yaml\n---\ntitle: \"Post Title\"           # Required\ndescription: \"Description\"    # For meta description\ndate: 2024-01-15             # Publication date\nauthor: \"Author Name\"         # Override default author\nimage: \"/images/post.jpg\"     # Featured image\nsocial_image: \"/images/og.jpg\"  # Override for OG image\ntwitter: \"authorhandle\"       # Author's Twitter (without @)\nmodified: \"2024-01-16\"        # Last modified date\ntags: [\"tag1\", \"tag2\"]        # Become keywords\n---\n```\n\n**Example JSON-LD Output:**\n```json\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"BlogPosting\",\n  \"headline\": \"My Blog Post\",\n  \"description\": \"A description of my post\",\n  \"url\": \"https://example.com/my-post/\",\n  \"datePublished\": \"2024-01-15T00:00:00Z\",\n  \"dateModified\": \"2024-01-16T00:00:00Z\",\n  \"author\": {\n    \"@type\": \"Person\",\n    \"name\": \"Author Name\",\n    \"url\": \"https://example.com/about\"\n  },\n  \"publisher\": {\n    \"@type\": \"Organization\",\n    \"name\": \"Site Name\",\n    \"logo\": {\n      \"@type\": \"ImageObject\",\n      \"url\": \"https://example.com/images/logo.png\"\n    }\n  },\n  \"image\": \"https://example.com/images/post.jpg\",\n  \"keywords\": [\"tag1\", \"tag2\"]\n}\n```\n\n**Example OpenGraph Tags:**\n```html\n\u003cmeta property=\"og:title\" content=\"My Blog Post\"\u003e\n\u003cmeta property=\"og:description\" content=\"A description of my post\"\u003e\n\u003cmeta property=\"og:type\" content=\"article\"\u003e\n\u003cmeta property=\"og:url\" content=\"https://example.com/my-post/\"\u003e\n\u003cmeta property=\"og:site_name\" content=\"Site Name\"\u003e\n\u003cmeta property=\"og:image\" content=\"https://example.com/images/post.jpg\"\u003e\n\u003cmeta property=\"og:image:width\" content=\"1200\"\u003e\n\u003cmeta property=\"og:image:height\" content=\"630\"\u003e\n\u003cmeta property=\"og:locale\" content=\"en_US\"\u003e\n\u003cmeta property=\"article:published_time\" content=\"2024-01-15T00:00:00Z\"\u003e\n\u003cmeta property=\"article:tag\" content=\"tag1\"\u003e\n\u003cmeta property=\"article:tag\" content=\"tag2\"\u003e\n```\n\n**Example Twitter Card Tags:**\n```html\n\u003cmeta name=\"twitter:card\" content=\"summary_large_image\"\u003e\n\u003cmeta name=\"twitter:site\" content=\"@yourusername\"\u003e\n\u003cmeta name=\"twitter:creator\" content=\"@authorhandle\"\u003e\n\u003cmeta name=\"twitter:title\" content=\"My Blog Post\"\u003e\n\u003cmeta name=\"twitter:description\" content=\"A description of my post\"\u003e\n\u003cmeta name=\"twitter:image\" content=\"https://example.com/images/post.jpg\"\u003e\n```\n\n**Template usage:**\n```html\n{# JSON-LD in head #}\n{% if post.structured_data.jsonld %}\n\u003cscript type=\"application/ld+json\"\u003e\n{{ post.structured_data.jsonld | safe }}\n\u003c/script\u003e\n{% endif %}\n\n{# OpenGraph tags #}\n{% for meta in post.structured_data.opengraph %}\n\u003cmeta property=\"{{ meta.property }}\" content=\"{{ meta.content }}\"\u003e\n{% endfor %}\n\n{# Twitter Card tags #}\n{% for meta in post.structured_data.twitter %}\n\u003cmeta name=\"{{ meta.name }}\" content=\"{{ meta.content }}\"\u003e\n{% endfor %}\n```\n\n**Image priority:**\n1. `social_image` from frontmatter (OG-specific override)\n2. `image` from frontmatter\n3. `default_image` from SEO config\n\n**Author priority:**\n1. `author` field from frontmatter\n2. `default_author` from structured data config\n3. `author` from site config\n\n**Disabling structured data:**\n```toml\n[seo.structured_data]\nenabled = false\n```\n\n**Testing tools:**\n- [Google Rich Results Test](https://search.google.com/test/rich-results)\n- [Facebook Sharing Debugger](https://developers.facebook.com/tools/debug/)\n- [Twitter Card Validator](https://cards-dev.twitter.com/validator)\n- [Schema.org Validator](https://validator.schema.org/)\n\n**Related:**\n- [[structured-data-guide|Structured Data Guide]] - Detailed user guide\n- [[\u003ca href=\"/tags/templates/\" class=\"hashtag-tag\" data-tag=\"templates\" data-count=5 data-reading-time=21 data-reading-time-text=\"21 minutes\"\u003e#templates\u003c/a\u003e|templates]] - Template integration\n\n---\n\n### authors\n\n**Name:** `authors`  \n**Stage:** Transform  \n**Priority:** `PriorityFirst + 1` (runs right after `auto_title`)  \n**Purpose:** Resolves author IDs in post frontmatter against the site-wide authors configuration, populating rich author objects for templates.\n\n**Configuration:**\n\nAuthors are defined in the site configuration under `[markata-go.authors]`:\n\n```toml\n[markata-go.authors]\ngenerate_pages = false\nfeeds_enabled = false\n\n[markata-go.authors.authors.waylon]\nname = \"Waylon Walker\"\nrole = \"author\"\nactive = true\ndefault = true\n\n[markata-go.authors.authors.guest]\nname = \"Guest Writer\"\nrole = \"editor\"\nguest = true\nactive = true\n```\n\n**Behavior:**\n\n1. Reads the authors map from the site configuration\n2. Identifies the default author (the entry with `default = true`)\n3. For each post:\n   - Reads author IDs from `authors` array or `author` string in frontmatter\n   - If no authors specified, assigns the default author\n   - Resolves each author ID against the config map\n   - Applies per-post role overrides (from extended frontmatter format)\n   - Applies per-post details overrides (shown as hover tooltips in byline)\n   - Populates `post.AuthorObjects` with resolved Author structs\n4. Logs a warning for unrecognized author IDs\n\n**Post fields set:**\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `author_objects` | []Author | Resolved author structs (computed, not serialized) |\n| `authors` | []string | Author IDs (may be set if default author assigned) |\n\n**Template access:**\n\n- `post.author_objects` -- Array of author maps with all fields (name, role, avatar, url, details, etc.)\n- `post.authors` -- Array of author ID strings\n- `authors` -- Top-level map of all configured authors (ID to author map)\n\nEach author object includes a `details` field (when set via frontmatter) that provides a per-post description of the author's contribution, displayed as a CSS tooltip on hover.\n\nThe extended frontmatter format supports key aliases for convenience (`name`/`handle` for `id`, `job`/`position`/`part`/`title` for `role`, `detail`/`description` for `details`). See the [Frontmatter Guide](../guides/frontmatter.md#authors) for the full alias table.\n\n**Related:**\n- [Authors Configuration](../guides/configuration.md#authors-configuration) -- Config setup guide\n- [Frontmatter Guide](../guides/frontmatter.md) -- `authors` and `author` fields\n\n---\n\n## Render Stage\n\n### admonitions\n\n**Name:** `admonitions`  \n**Stage:** Render (goldmark extension)  \n**Purpose:** Renders admonition blocks (notes, warnings, tips) from markdown.\n\n**Syntax:**\n```markdown\n!!! note \"Optional Title\"\n    Content of the note goes here.\n    Must be indented with 4 spaces.\n\n!!! warning\n    Default title will be \"Warning\"\n\n!!! tip \"Pro Tip\"\n    Helpful information here.\n```\n\n**Built-in types (examples):**\n- `note` - General information\n- `warning` - Caution/warning\n- `tip` - Helpful tips\n- `important` - Important information\n- `danger` - Dangerous/critical warnings\n- `caution` - Proceed with care\n\n**Custom types:** Any type name using letters, numbers, underscores, or hyphens\nis accepted, even if it is not built in. The type is included in the HTML class\n(for example, `class=\"admonition scripture\"`), and its first letter is\ncapitalized for the default title. A quoted or unquoted title overrides it.\nCustom types can be styled with site CSS.\n\n```markdown\n!!! scripture\n    A passage of scripture.\n\n!!! background-thought \"A side thought\"\n    More context.\n\n???+ source \"Further reading\"\n    Expanded by default.\n```\n\n**HTML output:**\n```html\n\u003cdiv class=\"admonition note\"\u003e\n    \u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n    \u003cp\u003eContent of the note goes here.\u003c/p\u003e\n\u003c/div\u003e\n```\n\n**CSS styling:**\n```css\n.admonition {\n    padding: 1rem;\n    margin: 1rem 0;\n    border-left: 4px solid;\n    border-radius: 4px;\n}\n.admonition.note { border-color: #448aff; background: #e3f2fd; }\n.admonition.warning { border-color: #ff9800; background: #fff3e0; }\n.admonition.tip { border-color: #4caf50; background: #e8f5e9; }\n.admonition.danger { border-color: #f44336; background: #ffebee; }\n.admonition-title { font-weight: bold; margin-bottom: 0.5rem; }\n```\n\n---\n\n### render_markdown\n\n**Name:** `render_markdown`  \n**Stage:** Render  \n**Purpose:** Converts markdown content to HTML using goldmark with extensions.\n\n**Configuration (TOML):**\n\n```toml\n[markdown.extensions]\ntypographer = true       # Smart quotes, dashes, ellipses (default: true)\ndefinition_list = true   # PHP Markdown Extra definition lists (default: true)\nfootnote = true          # PHP Markdown Extra footnotes (default: true)\n```\n\n**Enabled extensions:**\n- **GFM** - GitHub Flavored Markdown (tables, strikethrough, autolinks, task lists)\n- **Syntax Highlighting** - Code block highlighting with Chroma\n- **Admonitions** - Note/warning blocks\n- **Auto Heading IDs** - Generates IDs for headings (anchor links disabled by default; use `heading_anchors` plugin instead)\n- **Typographer** - Smart quotes, dashes, ellipses\n- **Definition Lists** - PHP Markdown Extra style definition lists\n- **Footnotes** - PHP Markdown Extra style footnotes\n\n**Behavior:**\n1. Takes `post.Content` (raw markdown)\n2. Converts to HTML with all extensions\n3. Stores result in `post.ArticleHTML`\n\n**Post fields set:**\n| Field | Type | Description |\n|-------|------|-------------|\n| `article_html` | string | Rendered HTML content |\n\n**Supported markdown features:**\n```markdown\n## Tables\n| Header | Header |\n|--------|--------|\n| Cell   | Cell   |\n\n## Task Lists\n- [x] Completed task\n- [ ] Pending task\n\n## Strikethrough\n~~deleted text~~\n\n## Code Blocks\n```go\nfunc main() {\n    fmt.Println(\"Syntax highlighted!\")\n}\n```\n\n## Footnotes\nHere's a sentence with a footnote.[^1]\n\n[^1]: This is the footnote content.\n\n## Smart Quotes\n\"Straight quotes\" become curly.\n\n## Definition Lists\nTerm\n:   Definition of the term.\n```\n\n**Disabling extensions:**\n\nAll extensions are enabled by default. To disable any:\n\n```toml\n# Disable specific extensions\n[markdown.extensions]\ntypographer = false       # Use straight quotes instead\ndefinition_list = false   # Disable definition lists\nfootnote = false          # Disable footnotes\n\n# Or disable all three\n[markdown.extensions]\ntypographer = false\ndefinition_list = false\nfootnote = false\n```\n\n---\n\n### templates\n\n**Name:** `templates`  \n**Stage:** Render  \n**Purpose:** Wraps rendered markdown content in HTML templates with theme support.\n\n**Configuration (TOML):**\n```toml\n[markata]\ntemplates_dir = \"templates\"  # Templates directory (default: \"templates\")\ntheme = \"default\"            # Theme name (default: \"default\")\n\n# Or with theme options:\n[markata-go.theme]\nname = \"default\"\n```\n\n**Behavior:**\n1. Looks up template from `post.Template` (default: `post.html`)\n2. Renders template with post context\n3. Falls back to raw `ArticleHTML` if no template exists\n4. Stores result in `post.HTML`\n\n**Template context:**\n| Variable | Type | Description |\n|----------|------|-------------|\n| `post` | Post | Current post |\n| `body` | string | `post.ArticleHTML` |\n| `config` | Config | Site configuration |\n| `core` | Manager | Lifecycle manager |\n\n**Post fields set:**\n| Field | Type | Description |\n|-------|------|-------------|\n| `html` | string | Final HTML (content + template) |\n\n**Example template (`templates/post.html`):**\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n    \u003ctitle\u003e{{ post.Title }} | {{ config.Title }}\u003c/title\u003e\n    \u003cmeta name=\"description\" content=\"{{ post.Description }}\"\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n    \u003carticle\u003e\n        \u003ch1\u003e{{ post.Title }}\u003c/h1\u003e\n        \u003ctime\u003e{{ post.Date.Format \"January 2, 2006\" }}\u003c/time\u003e\n        \u003cdiv class=\"content\"\u003e{{ body | safe }}\u003c/div\u003e\n    \u003c/article\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n---\n\n### heading_anchors\n\n**Name:** `heading_anchors`  \n**Stage:** Render (post_render)  \n**Purpose:** Adds clickable anchor links to headings in rendered HTML for easy linking to sections.\n\n**Configuration (TOML):**\n```toml\n[markata-go.heading_anchors]\nenabled = true        # Enable/disable the plugin (default: true)\nmin_level = 2         # Minimum heading level to process (default: 2, h2)\nmax_level = 4         # Maximum heading level to process (default: 4, h4)\nposition = \"end\"      # Anchor position: \"start\" or \"end\" (default: \"end\")\nsymbol = \"#\"          # Link text for the anchor (default: \"#\")\nclass = \"heading-anchor\"  # CSS class for the anchor link (default: \"heading-anchor\")\n```\n\n**Behavior:**\n1. Runs after `render_markdown` to process `ArticleHTML`\n2. Finds all heading tags within the configured level range\n3. Skips headings that already contain a goldmark anchor (`class=\"anchor\"`) to prevent duplicate anchor links\n4. Extracts existing IDs or generates URL-safe IDs from heading text\n5. Handles duplicate IDs by appending numbers (e.g., `my-heading`, `my-heading-1`)\n6. Inserts anchor link at the configured position (start or end of heading)\n\n**Note:** The goldmark markdown renderer has its own anchor extension (`[markdown.extensions] anchor`), which is disabled by default. This plugin is the recommended way to add heading anchors because it offers more configuration (min/max level, position, symbol, CSS class). If the goldmark extension is re-enabled, this plugin detects and skips headings that already have goldmark anchors.\n\n**HTML output example:**\n```html\n\u003c!-- Input (from render_markdown) --\u003e\n\u003ch2 id=\"getting-started\"\u003eGetting Started\u003c/h2\u003e\n\n\u003c!-- Output (with default config, position=\"end\") --\u003e\n\u003ch2 id=\"getting-started\"\u003eGetting Started \u003ca href=\"#getting-started\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\n\u003c!-- Output (with position=\"start\") --\u003e\n\u003ch2 id=\"getting-started\"\u003e\u003ca href=\"#getting-started\" class=\"heading-anchor\"\u003e#\u003c/a\u003e Getting Started\u003c/h2\u003e\n```\n\n**CSS styling:**\n```css\n.heading-anchor {\n    opacity: 0;\n    text-decoration: none;\n    margin-left: 0.5rem;\n    color: #666;\n}\nh2:hover .heading-anchor,\nh3:hover .heading-anchor,\nh4:hover .heading-anchor {\n    opacity: 1;\n}\n```\n\n---\n\n### md_video\n\n**Name:** `md_video`  \n**Stage:** Render (post_render)  \n**Purpose:** Converts markdown image syntax for video files into HTML video elements with native controls and on-demand loading.\n\n**Configuration (TOML):**\n```toml\n[markata-go.md_video]\nenabled = true                    # Enable the plugin (default: true)\nvideo_extensions = [\".mp4\", \".webm\", \".ogg\", \".ogv\", \".mov\", \".m4v\", \".avi\", \".mkv\"]  # Extensions to treat as video\nvideo_class = \"md-video\"          # CSS class for video elements (default)\ncontrols = true                   # Show video controls (default: true)\nautoplay = false                  # Authored autoplay intent (default: false)\nloop = true                       # Loop video continuously (default: true)\nmuted = true                      # Mute audio (default: true, required for autoplay)\nplaysinline = true                # Play inline on mobile (default: true)\npreload = \"none\"                  # Preload hint: \"none\", \"metadata\", \"auto\" (default: \"none\")\n```\n\n**Autoplay intent and loading policy**\n\nSet `autoplay = true` to author GIF-like Markdown playback. Generated HTML stores\nthat intent in `data-authored-autoplay=\"true\"` and keeps `preload=\"none\"`.\nFull Quality or already-confident fast Auto at page entry may start unrequested authored videos.\nSave Data, constrained Auto, reduced motion, and the no-JS baseline keep native\ninteraction. Raw HTML preserves its own autoplay intent; the Markdown setting\nnever adds autoplay to a raw video that omitted it. See\n[Adaptive loading](../adaptive-loading/) for policy and recovery behavior.\n\nTo use traditional video behavior (click to play with sound):\n```toml\n[markata-go.md_video]\nautoplay = false\nloop = false\nmuted = false\ncontrols = true\n```\n\n**Markdown usage:**\n```markdown\n![kickflip down the 3 stair - fingerboarding](https://example.com/video.mp4)\n\n![Demo of the feature](demo.webm)\n\n![Screen recording](screen.mp4?width=500)\n```\n\n**Behavior:**\n1. Scans `ArticleHTML` for `\u003cimg\u003e` tags after markdown rendering\n2. Checks if the `src` attribute ends with a video extension (handles query parameters)\n3. Replaces matching `\u003cimg\u003e` tags with `\u003cvideo\u003e` elements\n4. Preserves the `alt` text as fallback content\n5. Automatically detects MIME type from file extension\n6. Derives a `.webp` poster for trusted video URLs on every supported video format\n\n**HTML output:**\n```html\n\u003cvideo loop muted playsinline controls preload=\"none\" class=\"md-video\" style=\"margin-inline:auto\"\u003e\n  \u003csource src=\"https://example.com/video.mp4\" type=\"video/mp4\"\u003e\n  kickflip down the 3 stair - fingerboarding\n\u003c/video\u003e\n```\n\n**MIME type detection:**\n\n| Extension | MIME Type |\n|-----------|-----------|\n| `.mp4` | `video/mp4` |\n| `.webm` | `video/webm` |\n| `.ogg`, `.ogv` | `video/ogg` |\n| `.mov` | `video/quicktime` |\n| `.m4v` | `video/x-m4v` |\n| `.avi` | `video/x-msvideo` |\n| `.mkv` | `video/x-matroska` |\n\n**CSS styling:**\n```css\n.md-video {\n    max-width: 100%;\n    height: auto;\n    border-radius: 4px;\n}\n```\n\n---\n\n### youtube\n\n**Name:** `youtube`  \n**Stage:** Render (post_render)  \n**Purpose:** Converts YouTube URLs on their own line into responsive embedded iframes with privacy-enhanced mode by default.\n\n**Configuration (TOML):**\n```toml\n[markata-go.youtube]\nenabled = true              # Enable the plugin (default: true)\nprivacy_enhanced = true     # Use youtube-nocookie.com (default: true)\ncontainer_class = \"youtube-embed\"  # CSS class for container (default)\nlazy_load = true            # Enable lazy loading (default: true)\n```\n\n**Markdown usage:**\n\nSimply paste a YouTube URL on its own line:\n\n```markdown\nCheck out this video:\n\nhttps://www.youtube.com/watch?v=dQw4w9WgXcQ\n\nMore content below...\n```\n\n**Supported URL formats:**\n- `https://www.youtube.com/watch?v=VIDEO_ID`\n- `https://youtube.com/watch?v=VIDEO_ID`\n- `https://m.youtube.com/watch?v=VIDEO_ID`\n- `https://youtu.be/VIDEO_ID`\n- URLs with extra parameters like `\u0026t=30` (timestamp is ignored in embed)\n\n**HTML output:**\n```html\n\u003cdiv class=\"youtube-embed\"\u003e\n  \u003ciframe\n    src=\"https://www.youtube-nocookie.com/embed/dQw4w9WgXcQ\"\n    title=\"YouTube video player\"\n    frameborder=\"0\"\n    allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n    allowfullscreen\n    loading=\"lazy\"\u003e\n  \u003c/iframe\u003e\n\u003c/div\u003e\n```\n\n**Privacy-enhanced mode:**\n\nBy default, the plugin uses `youtube-nocookie.com` which prevents YouTube from storing cookies on visitors' browsers until they play the video. Disable this for standard embeds:\n\n```toml\n[markata-go.youtube]\nprivacy_enhanced = false\n```\n\n**CSS styling (included in default theme):**\n```css\n.youtube-embed {\n  position: relative;\n  padding-bottom: 56.25%; /* 16:9 aspect ratio */\n  height: 0;\n  overflow: hidden;\n  max-width: 100%;\n  margin: 1.5rem 0;\n  border-radius: 0.5rem;\n}\n\n.youtube-embed iframe {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: none;\n  border-radius: 0.5rem;\n}\n```\n\n**Behavior:**\n1. Scans `ArticleHTML` for YouTube URLs in standalone `\u003cp\u003e` tags\n2. URLs inside code blocks or inline with text are NOT converted\n3. Extracts the 11-character video ID from the URL\n4. Generates responsive embed with configurable privacy mode\n5. Adds lazy loading by default for better page performance\n\n**Notes:**\n- URLs must be on their own line (in their own `\u003cp\u003e` tag) to be converted\n- Inline URLs like \"Check out https://youtube.com/watch?v=xyz\" are preserved as text\n- Invalid video IDs (not exactly 11 characters) are ignored\n- oEmbed-based YouTube embeds (via the embeds plugin) render Lite YouTube by default\n\n---\n\n### image_zoom\n\n**Name:** `image_zoom`  \n**Stage:** Render (post_render), Write  \n**Purpose:** Adds optional image zoom/lightbox functionality using GLightbox. Users can click/tap images to view them in a full-screen modal with support for touch gestures, keyboard navigation, and gallery mode.\n\n**Configuration (TOML):**\n```toml\n[markata-go.image_zoom]\nenabled = false           # Enable the plugin (default: false)\nlibrary = \"glightbox\"     # Lightbox library to use (default: \"glightbox\")\nselector = \".glightbox\"   # CSS selector for zoomable images (default: \".glightbox\")\ncdn = true                # Legacy fallback when shared vendored assets are unavailable\nauto_all_images = false   # Make all images zoomable by default (default: false)\n\n# GLightbox-specific options\nopen_effect = \"zoom\"      # Effect when opening: \"zoom\", \"fade\", \"none\" (default: \"zoom\")\nclose_effect = \"zoom\"     # Effect when closing: \"zoom\", \"fade\", \"none\" (default: \"zoom\")\nslide_effect = \"slide\"    # Effect when sliding: \"slide\", \"fade\", \"zoom\", \"none\" (default: \"slide\")\ntouch_navigation = true   # Enable touch/swipe gestures (default: true)\nloop = false              # Loop through images in gallery (default: false)\ndraggable = true          # Enable dragging images to navigate (default: true)\n```\n\n**Markdown syntax:**\n\nMark individual images as zoomable using attribute markers:\n\n```markdown\n![Photo with zoom {data-zoomable}](/images/photo.jpg)\n\n![Alternative syntax {.zoomable}](/images/sunset.jpg)\n\n![Regular image without zoom](/images/icon.png)\n```\n\n**Frontmatter option:**\n\nEnable zoom for all images in a specific post:\n\n```yaml\n---\ntitle: \"Photo Gallery\"\nimage_zoom: true\n---\n```\n\n**Behavior:**\n1. Runs after `render_markdown` to process `ArticleHTML`\n2. Finds images with `{data-zoomable}` or `{.zoomable}` markers\n3. Removes the markers from alt text\n4. Wraps images in anchor tags with GLightbox classes\n5. Preserves explicit width/height when the source URL already carries media size hints\n6. Adds `data-glightbox` attribute for the lightbox\n7. Tracks which posts need the lightbox library\n8. In Write stage, stores configuration for templates to inject JS/CSS\n9. Prefers shared vendored GLightbox assets from `[markata-go.assets]` when available, otherwise falls back to the legacy `cdn` toggle\n\n**HTML output:**\n\nInput:\n```markdown\n![Beautiful sunset {data-zoomable}](/images/sunset.jpg)\n```\n\nOutput:\n```html\n\u003ca href=\"/images/sunset.jpg\" class=\"glightbox-link\"\u003e\n  \u003cimg src=\"/images/sunset.jpg\" alt=\"Beautiful sunset\"\n       class=\"glightbox\" width=\"1200\" height=\"675\"\n       data-glightbox=\"description: Beautiful sunset\"\u003e\n\u003c/a\u003e\n```\n\n**Post fields set (in `Extra`):**\n| Field | Type | Description |\n|-------|------|-------------|\n| `needs_image_zoom` | bool | True if post has zoomable images |\n\n**Config fields set (in `Extra`):**\n| Field | Type | Description |\n|-------|------|-------------|\n| `glightbox_enabled` | bool | True if any posts need GLightbox |\n| `glightbox_cdn` | bool | Whether templates should fall back to CDN after checking shared vendored asset URLs |\n| `glightbox_options` | map | GLightbox initialization options |\n\n**Template usage:**\n\nThe base template automatically includes GLightbox when needed:\n\n```html\n{% if config.Extra.glightbox_enabled %}\n\u003c!-- CSS in head --\u003e\n\u003clink rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/css/glightbox.min.css\"\u003e\n\n\u003c!-- JS before closing body --\u003e\n\u003cscript src=\"https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/js/glightbox.min.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n  document.addEventListener('DOMContentLoaded', function() {\n    GLightbox({ selector: '.glightbox' });\n  });\n\u003c/script\u003e\n{% endif %}\n```\n\nWhen `[markata-go.assets].mode` is `self-hosted` or `auto`, the base templates prefer the shared `asset_urls` mappings generated by `cdn_assets`. In that setup, `markata-go assets download` will vendor GLightbox alongside the other third-party assets.\n\n**Keyboard shortcuts:**\n| Key | Action |\n|-----|--------|\n| `Escape` | Close lightbox |\n| `→` / `ArrowRight` | Next image |\n| `←` / `ArrowLeft` | Previous image |\n\n**Touch gestures:**\n| Gesture | Action |\n|---------|--------|\n| Swipe left/right | Navigate images |\n| Pinch | Zoom in/out |\n| Drag | Pan zoomed image |\n\n---\n\n### image_optimization\n\n**Name:** `image_optimization`  \n**Stage:** Render (post_render), Write  \n**Purpose:** Generates AVIF/WebP variants for local images and rewrites HTML to use `\u003cpicture\u003e` with stable fallbacks.\n\n**Configuration (TOML):**\n```toml\n[markata-go.image_optimization]\nenabled = true\nformats = [\"avif\", \"webp\"]\nquality = 80\navif_quality = 80\nwebp_quality = 80\nwidths = [480, 768, 1200]\nsizes = \"100vw\"\ncache_dir = \".markata/image-cache\"\navifenc_path = \"\"\ncwebp_path = \"\"\n```\n\n**Configuration fields:**\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `true` | Whether the plugin is active |\n| `formats` | []string | `[\"avif\",\"webp\"]` | Formats to generate |\n| `quality` | int | `80` | Default quality for all formats |\n| `avif_quality` | int | `80` | AVIF quality override |\n| `webp_quality` | int | `80` | WebP quality override |\n| `widths` | []int | `[480,768,1200]` | Responsive widths to generate |\n| `sizes` | string | `\"100vw\"` | Sizes attribute for responsive sources |\n| `cache_dir` | string | `.markata/image-cache` | Cache directory for encode metadata |\n| `avifenc_path` | string | `\"\"` | Path to `avifenc` (auto-detect if empty) |\n| `cwebp_path` | string | `\"\"` | Path to `cwebp` (auto-detect if empty) |\n\n**Behavior:**\n1. Scans `ArticleHTML` for local `\u003cimg\u003e` tags and skips external URLs or data URIs.\n2. Wraps each local image in `\u003cpicture\u003e` with AVIF/WebP sources and `srcset` widths.\n3. Writes optimized variants next to the original output file using width suffixes.\n4. Uses a cache key (path, mod time, size, quality, encoder) to skip re-encoding.\n5. Missing encoders emit warnings and skip the format without failing the build.\n\n**HTML output:**\n\nInput:\n```markdown\n![Cat](/images/cat.jpg)\n```\n\nOutput:\n```html\n\u003cpicture\u003e\n  \u003csource type=\"image/avif\" srcset=\"/images/cat-480w.avif 480w, /images/cat-768w.avif 768w\" sizes=\"100vw\"\u003e\n  \u003csource type=\"image/webp\" srcset=\"/images/cat-480w.webp 480w, /images/cat-768w.webp 768w\" sizes=\"100vw\"\u003e\n  \u003cimg src=\"/images/cat.jpg\" alt=\"Cat\"\u003e\n\u003c/picture\u003e\n```\n| Tap outside | Close lightbox |\n\n**CSS customization:**\n```css\n.glightbox-link {\n  display: inline-block;\n  cursor: zoom-in;\n}\n\n.glightbox-link:hover img {\n  opacity: 0.9;\n  transform: scale(1.02);\n  transition: all 0.2s ease;\n}\n```\n\n**Performance notes:**\n- GLightbox JS/CSS only loaded on pages with zoomable images\n- Library is ~11KB gzipped when using CDN\n- Files loaded asynchronously to avoid blocking page render\n\n---\n\n### link_collector\n\n**Name:** `link_collector`  \n**Stage:** Render (post_render)  \n**Purpose:** Collects all hyperlinks from posts and tracks inlinks (pages linking TO a post) and outlinks (pages a post links TO).\n\n**Configuration (TOML):**\n```toml\n[markata-go.link_collector]\ninclude_feeds = false  # Include feed pages in inlinks (default: false)\ninclude_index = false  # Include index page in inlinks (default: false)\n```\n\n**Note:** The plugin also reads `url` from `config.Extra` to determine internal vs external links.\n\n**Behavior:**\n1. Runs after `render_markdown` to process `ArticleHTML`\n2. Extracts all `\u003ca href=\"...\"\u003e` links from each post\n3. Resolves relative URLs against the post's URL\n4. Distinguishes internal links (same domain) from external links\n5. Looks up target posts for internal links\n6. Populates `Inlinks` and `Outlinks` on each post\n7. Stores all links in cache for use by other plugins\n\n**Performance:**\n- Caches href extraction per post using a hash of `ArticleHTML`\n- Reuses cached hrefs on unchanged posts, while still rebuilding link objects\n\n**Post fields set:**\n| Field | Type | Description |\n|-------|------|-------------|\n| `hrefs` | []string | All href values found in the post |\n| `inlinks` | []map | Links from other posts pointing to this post (template-friendly) |\n| `outlinks` | []map | Links from this post to other pages (template-friendly) |\n\n**Link structure:**\n```go\ntype Link struct {\n    SourceURL    string  // Full URL of the source page\n    SourcePost   *Post   // Source post object (if internal)\n    TargetPost   *Post   // Target post object (if internal)\n    RawTarget    string  // Original href value\n    TargetURL    string  // Resolved full URL\n    TargetDomain string  // Domain of target URL\n    IsInternal   bool    // True if same domain\n    IsSelf       bool    // True if self-link\n    SourceText   string  // Link text from source\n    TargetText   string  // Title of target post (if internal)\n}\n```\n\n**Template usage:**\n```html\n{% if post.inlinks %}\n\u003caside class=\"backlinks\"\u003e\n    \u003ch3\u003ePages that link here\u003c/h3\u003e\n    \u003cul\u003e\n    {% for link in post.inlinks %}\n        \u003cli\u003e\u003ca href=\"{{ link.source_post.href }}\"\u003e{{ link.source_post.title }}\u003c/a\u003e\u003c/li\u003e\n    {% endfor %}\n    \u003c/ul\u003e\n\u003c/aside\u003e\n{% endif %}\n\n{% if post.outlinks %}\n\u003caside class=\"outlinks\"\u003e\n    \u003ch3\u003eLinks from this page\u003c/h3\u003e\n    \u003cul\u003e\n    {% for link in post.outlinks %}\n        \u003cli\u003e\n            \u003ca href=\"{{ link.target_url }}\"\u003e\n                {% if link.is_internal %}{{ link.target_text }}{% else %}{{ link.target_domain }}{% endif %}\n            \u003c/a\u003e\n            {% if not link.is_internal %}\u003cspan class=\"external\"\u003e↗\u003c/span\u003e{% endif %}\n        \u003c/li\u003e\n    {% endfor %}\n    \u003c/ul\u003e\n\u003c/aside\u003e\n{% endif %}\n```\n\n---\n\n### chartjs\n\n**Name:** `chartjs`  \n**Stage:** Render (after render_markdown)  \n**Purpose:** Converts `chartjs` code blocks into interactive Chart.js charts.\n\n**Status:** Enabled by default. Set `enabled = false` to disable.\n\n**Configuration (TOML):**\n```toml\n[markata-go.chartjs]\nenabled = true                                         # Enabled by default; set to false to disable\ncdn_url = \"/assets/vendor/chartjs/chart.min.js\"        # Chart.js URL (local by default)\ncontainer_class = \"chartjs-container\"                  # CSS class for wrapper div\n```\n\n**Options:**\n| Option | Default | Description |\n|--------|---------|-------------|\n| `enabled` | `true` | Enable/disable the plugin |\n| `cdn_url` | `/assets/vendor/chartjs/chart.min.js` | Chart.js URL (local by default) |\n| `container_class` | `chartjs-container` | CSS class for wrapper div |\n| `data_display` | `open` | Initial fallback disclosure state: `open` or `collapsed` |\n\nOptional top-level JSON strings `title` and `caption` create a semantic,\naccessible figure card without adding a TOC heading. Top-level `data_display`\noverrides the site default per chart. All three keys are stripped before Chart.js\ninitialization. See [chart figures and fallbacks](../guides/markdown-chart-fallback.md).\n\n**Markdown syntax:**\n````markdown\n```chartjs\n{\n  \"type\": \"bar\",\n  \"data\": {\n    \"labels\": [\"Red\", \"Blue\", \"Yellow\"],\n    \"datasets\": [{\n      \"label\": \"My Dataset\",\n      \"data\": [12, 19, 3],\n      \"backgroundColor\": [\"#ff6384\", \"#36a2eb\", \"#ffce56\"]\n    }]\n  }\n}\n```\n````\n\n**HTML output:**\n```html\n\u003cdiv class=\"chartjs-container\"\u003e\n  \u003ccanvas id=\"chart-abc123\"\u003e\u003c/canvas\u003e\n  \u003cscript\u003e\n    (function() {\n      var ctx = document.getElementById('chart-abc123').getContext('2d');\n      new Chart(ctx, {\"type\":\"bar\",\"data\":{...}});\n    })();\n  \u003c/script\u003e\n\u003c/div\u003e\n```\n\n**Supported chart types:**\n- `bar`, `line`, `pie`, `doughnut`, `radar`, `polarArea`, `bubble`, `scatter`\n\n**Template requirements:**\nInclude Chart.js in your base template:\n```html\n\u003cscript src=\"/assets/vendor/chartjs/chart.min.js\"\u003e\u003c/script\u003e\n```\n\n### Examples\n\n#### Bar Chart - Monthly Sales Data\n\nA simple bar chart showing monthly sales performance:\n\n```chartjs\n{\n  \"type\": \"bar\",\n  \"data\": {\n    \"labels\": [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\"],\n    \"datasets\": [{\n      \"label\": \"Monthly Sales ($)\",\n      \"data\": [12500, 19200, 15800, 22400, 18900, 25600],\n      \"backgroundColor\": [\n        \"rgba(54, 162, 235, 0.7)\",\n        \"rgba(54, 162, 235, 0.7)\",\n        \"rgba(54, 162, 235, 0.7)\",\n        \"rgba(54, 162, 235, 0.7)\",\n        \"rgba(54, 162, 235, 0.7)\",\n        \"rgba(54, 162, 235, 0.7)\"\n      ],\n      \"borderColor\": \"rgba(54, 162, 235, 1)\",\n      \"borderWidth\": 1\n    }]\n  },\n  \"options\": {\n    \"responsive\": true,\n    \"plugins\": {\n      \"title\": {\n        \"display\": true,\n        \"text\": \"2024 Sales Performance\"\n      }\n    },\n    \"scales\": {\n      \"y\": {\n        \"beginAtZero\": true,\n        \"ticks\": {\n          \"callback\": \"$\"\n        }\n      }\n    }\n  }\n}\n```\n\n#### Line Chart - Website Traffic Over Time\n\nTrack trends with a line chart showing page views and unique visitors:\n\n```chartjs\n{\n  \"type\": \"line\",\n  \"data\": {\n    \"labels\": [\"Week 1\", \"Week 2\", \"Week 3\", \"Week 4\", \"Week 5\", \"Week 6\"],\n    \"datasets\": [\n      {\n        \"label\": \"Page Views\",\n        \"data\": [2400, 3100, 2800, 4200, 3900, 5100],\n        \"borderColor\": \"rgba(75, 192, 192, 1)\",\n        \"backgroundColor\": \"rgba(75, 192, 192, 0.2)\",\n        \"fill\": true,\n        \"tension\": 0.3\n      },\n      {\n        \"label\": \"Unique Visitors\",\n        \"data\": [1200, 1500, 1400, 2100, 1950, 2600],\n        \"borderColor\": \"rgba(255, 99, 132, 1)\",\n        \"backgroundColor\": \"rgba(255, 99, 132, 0.2)\",\n        \"fill\": true,\n        \"tension\": 0.3\n      }\n    ]\n  },\n  \"options\": {\n    \"responsive\": true,\n    \"plugins\": {\n      \"title\": {\n        \"display\": true,\n        \"text\": \"Website Traffic - Q1 2024\"\n      },\n      \"legend\": {\n        \"position\": \"bottom\"\n      }\n    },\n    \"scales\": {\n      \"y\": {\n        \"beginAtZero\": true\n      }\n    }\n  }\n}\n```\n\n#### Pie Chart - Content Distribution\n\nVisualize proportions with a pie chart showing content by category:\n\n```chartjs\n{\n  \"type\": \"pie\",\n  \"data\": {\n    \"labels\": [\"Tutorials\", \"How-To Guides\", \"Reference Docs\", \"Blog Posts\", \"Case Studies\"],\n    \"datasets\": [{\n      \"data\": [35, 25, 20, 15, 5],\n      \"backgroundColor\": [\n        \"rgba(255, 99, 132, 0.8)\",\n        \"rgba(54, 162, 235, 0.8)\",\n        \"rgba(255, 206, 86, 0.8)\",\n        \"rgba(75, 192, 192, 0.8)\",\n        \"rgba(153, 102, 255, 0.8)\"\n      ],\n      \"borderColor\": [\n        \"rgba(255, 99, 132, 1)\",\n        \"rgba(54, 162, 235, 1)\",\n        \"rgba(255, 206, 86, 1)\",\n        \"rgba(75, 192, 192, 1)\",\n        \"rgba(153, 102, 255, 1)\"\n      ],\n      \"borderWidth\": 2\n    }]\n  },\n  \"options\": {\n    \"responsive\": true,\n    \"plugins\": {\n      \"title\": {\n        \"display\": true,\n        \"text\": \"Content Distribution by Type\"\n      },\n      \"legend\": {\n        \"position\": \"right\"\n      }\n    }\n  }\n}\n```\n\n#### Doughnut Chart with Center Text\n\nA doughnut chart is useful for showing a primary metric with breakdown:\n\n```chartjs\n{\n  \"type\": \"doughnut\",\n  \"data\": {\n    \"labels\": [\"Completed\", \"In Progress\", \"Not Started\"],\n    \"datasets\": [{\n      \"data\": [68, 22, 10],\n      \"backgroundColor\": [\n        \"rgba(76, 175, 80, 0.8)\",\n        \"rgba(255, 193, 7, 0.8)\",\n        \"rgba(158, 158, 158, 0.8)\"\n      ],\n      \"borderWidth\": 0\n    }]\n  },\n  \"options\": {\n    \"responsive\": true,\n    \"cutout\": \"60%\",\n    \"plugins\": {\n      \"title\": {\n        \"display\": true,\n        \"text\": \"Project Completion Status\"\n      },\n      \"legend\": {\n        \"position\": \"bottom\"\n      }\n    }\n  }\n}\n```\n\n---\n\n### contribution_graph\n\n**Name:** `contribution_graph`  \n**Stage:** Render (after render_markdown)  \n**Purpose:** Renders GitHub-style calendar heatmaps showing activity over time using Cal-Heatmap.\n\n**Configuration (TOML):**\n```toml\n[markata-go.contribution_graph]\nenabled = true\ncdn_url = \"/assets/vendor/cal-heatmap\"                # Cal-Heatmap base URL (local by default)\ncontainer_class = \"contribution-graph-container\"\ntheme = \"light\"\nscale_max_percentile = 0\n```\n\n**Options:**\n| Option | Default | Description |\n|--------|---------|-------------|\n| `enabled` | `true` | Enable/disable the plugin |\n| `cdn_url` | `/assets/vendor/cal-heatmap` | Cal-Heatmap base URL (local by default) |\n| `container_class` | `contribution-graph-container` | CSS class for wrapper div |\n| `theme` | `light` | Color theme (light, dark) |\n| `scale_max_percentile` | `0` | Global percentile cap for contribution graph color scaling |\n\n**Markdown syntax:**\n````markdown\n```contribution-graph\n{\n  \"data\": [\n    {\"date\": \"2024-01-01\", \"value\": 5},\n    {\"date\": \"2024-01-02\", \"value\": 3},\n    {\"date\": \"2024-01-03\", \"value\": 8}\n  ],\n  \"options\": {\n    \"domain\": \"year\",\n    \"subDomain\": \"day\",\n    \"cellSize\": 12\n  }\n}\n```\n````\n\n**HTML output:**\n```html\n\u003cdiv class=\"contribution-graph-container\"\u003e\n  \u003cdiv id=\"contribution-graph-1\"\u003e\u003c/div\u003e\n\u003c/div\u003e\n\n\u003clink rel=\"stylesheet\" href=\"/assets/vendor/cal-heatmap/cal-heatmap.css\"\u003e\n\u003cscript src=\"/assets/vendor/cal-heatmap/cal-heatmap.min.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\ndocument.addEventListener('DOMContentLoaded', function() {\n  const cal = new CalHeatmap();\n  cal.paint({\n    itemSelector: '#contribution-graph-1',\n    data: { source: [...], x: 'date', y: 'value' },\n    domain: { type: 'year' },\n    subDomain: { type: 'day' }\n  });\n});\n\u003c/script\u003e\n```\n\n**Data format:**\n- `date`: ISO date string (YYYY-MM-DD)\n- `value`: Numeric value (affects cell color intensity)\n\n**Options:**\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `domain` | string | `year` | Time domain: year, month, week, day |\n| `subDomain` | string | `day` | Sub-domain: day, hour, minute |\n| `cellSize` | number | `10` | Cell size in pixels |\n| `range` | number | `1` | Number of domain units to display |\n| `maxValue` | number | unset | Explicit color-scale maximum |\n| `maxPercentile` | number | unset | Per-graph percentile cap for the color scale |\n\nThe plugin also fits rendered graphs to narrow content columns automatically, so pages do not need custom resize JavaScript in markdown.\n\n**Use cases:**\n- Blog post publishing frequency\n- Contribution tracking\n- Habit tracking displays\n\n**Related:** [[analytics|Analytics Guide]]\n\n---\n\n### one_line_link\n\n**Name:** `one_line_link`  \n**Stage:** Render (after render_markdown)  \n**Purpose:** Expands standalone URLs in paragraphs into styled link preview cards.\n\n**Configuration (TOML):**\n```toml\n[markata-go.one_line_link]\nenabled = true\ncard_class = \"link-card\"\nfallback_title = \"Link\"\ntimeout = 5\nexclude_patterns = [\"^https://twitter\\\\.com\", \"^https://x\\\\.com\"]\n```\n\n**Options:**\n| Option | Default | Description |\n|--------|---------|-------------|\n| `enabled` | `true` | Enable/disable the plugin |\n| `card_class` | `link-card` | CSS class for the link card |\n| `fallback_title` | `Link` | Title when metadata unavailable |\n| `timeout` | `5` | HTTP timeout in seconds |\n| `exclude_patterns` | `[]` | Regex patterns for URLs to skip |\n\n**Behavior:**\n1. Finds paragraphs containing only a URL (`\u003cp\u003ehttps://...\u003c/p\u003e`)\n2. Extracts the domain from the URL\n3. Converts to a styled link card\n\n**Before:**\n```html\n\u003cp\u003ehttps://example.com/article\u003c/p\u003e\n```\n\n**After:**\n```html\n\u003ca href=\"https://example.com/article\" class=\"link-card\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\n  \u003cdiv class=\"link-card-content\"\u003e\n    \u003cdiv class=\"link-card-title\"\u003eLink\u003c/div\u003e\n    \u003cdiv class=\"link-card-url\"\u003eexample.com\u003c/div\u003e\n  \u003c/div\u003e\n\u003c/a\u003e\n```\n\n**CSS example:**\n```css\n.link-card {\n  display: block;\n  padding: 1rem;\n  border: 1px solid var(--color-border);\n  border-radius: 8px;\n  text-decoration: none;\n  transition: box-shadow 0.2s;\n}\n.link-card:hover {\n  box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n}\n.link-card-title {\n  font-weight: bold;\n  color: var(--color-text);\n}\n.link-card-url {\n  font-size: 0.875rem;\n  color: var(--color-text-muted);\n}\n```\n\n---\n\n### external_link_hover\n\n**Name:** `external_link_hover`  \n**Stage:** Render (after glossary, before templates)  \n**Purpose:** Adds preview data to links that point to other sites, so the\ndefault theme shows a hover card with the page title, description, image, and\nsite icon.\n\n**Status:** Disabled by default. Set `enabled = true` to turn it on.\n\n**Configuration (TOML):**\n```toml\n[markata-go.external_link_hover]\nenabled = true\nfetch = false           # true: look up URLs missing from the embeds cache\ninclude_image = true    # add the page's preview image\nfavicon_service = \"\"    # e.g. \"https://icons.duckduckgo.com/ip3/{host}.ico\"\nignore_domains = [\"localhost\"]\n```\n\n**Options:**\n| Option | Default | Description |\n|--------|---------|-------------|\n| `enabled` | `false` | Enable/disable the plugin |\n| `fetch` | `false` | Fetch oEmbed/Open Graph metadata for URLs that aren't cached. When `false` the plugin makes no network requests. |\n| `include_image` | `true` | Add `data-link-image` when metadata has an image |\n| `favicon_service` | `\"\"` | URL template for a site icon; `{host}` and `{origin}` are replaced. Empty disables icons. |\n| `ignore_domains` | `[]` | Hosts (and their subdomains) that never get cards |\n\n**Where the data comes from** (first match wins per field):\n1. The embeds metadata cache (`[embeds] cache_dir`, default `.cache/embeds`):\n   oEmbed first, then Open Graph. With `fetch = true`, missing URLs are\n   fetched once per build using the embeds `resolution_strategy`, `timeout`,\n   and cache settings, and the result is cached for later builds.\n2. Your `[[markata-go.blogroll.feeds]]` entries, matched by host: `title`,\n   `description`, and `image_url`. This works even when blogroll is disabled.\n3. The link's Markdown title (`[text](url \"title\")`), used as the description.\n4. The host name, so every external link gets at least a small card.\n\n**Skipped links:** links to your own site (`url`), relative links, private\nposts, posts with `skip: true`, ignored domains, links that already have\nhover data (`data-hover-*`, `data-link-preview`), links with\n`data-no-preview`, and links created by other features (wikilinks, mentions,\nglossary terms, heading anchors, embed and link cards).\n\n**Data attributes added:**\n| Attribute | Description |\n|-----------|-------------|\n| `data-link-preview` | Marks the link for the hover card |\n| `data-link-host` | Host name (always set) |\n| `data-link-title` | Page title (max 140 characters) |\n| `data-link-description` | Page description (max 280 characters) |\n| `data-link-site` | Site or provider name |\n| `data-link-image` | Preview image URL (if `include_image`) |\n| `data-link-icon` | Site icon URL (if `favicon_service` is set) |\n\n**Before:**\n```html\n\u003ca href=\"https://github.com/WaylonWalker/markata-go\"\u003emarkata-go repo\u003c/a\u003e\n```\n\n**After:**\n```html\n\u003ca href=\"https://github.com/WaylonWalker/markata-go\" data-link-preview\n   data-link-host=\"github.com\" data-link-title=\"GitHub - WaylonWalker/markata-go\"\n   data-link-description=\"Contribute to WaylonWalker/markata-go development...\"\n   data-link-site=\"GitHub\" data-link-image=\"https://opengraph.githubassets.com/...\"\u003emarkata-go repo\u003c/a\u003e\n```\n\n**Privacy:** With the defaults, the build makes no requests, and readers'\nbrowsers only load a preview image when they hover a link. Setting\n`favicon_service` makes browsers request icons from that service as the card\nopens, and `fetch = true` makes the build request each linked page once.\n\nSee [Hover Cards](/docs/guides/markdown/#external-link-cards) for how the card\nlooks and how to style it.\n\n---\n\n### wikilink_hover\n\n**Name:** `wikilink_hover`  \n**Stage:** Render (after wikilinks)  \n**Purpose:** Adds hover preview data attributes to wikilinks for tooltip/popup previews.\n\n**Status:** Enabled by default. Set `enabled = false` to disable.\n\n**Configuration (TOML):**\n```toml\n[markata-go.wikilink_hover]\nenabled = true           # Enabled by default; set to false to disable\npreview_length = 200     # Max characters for preview text\ninclude_image = true     # Add preview image if available\nscreenshot_service = \"\"  # Optional: \"https://screenshot.example.com/capture?url=\"\n```\n\n**Options:**\n| Option | Default | Description |\n|--------|---------|-------------|\n| `enabled` | `true` | Enable/disable the plugin |\n| `preview_length` | `200` | Max characters for preview text |\n| `include_image` | `true` | Add preview image if available |\n| `screenshot_service` | `\"\"` | URL prefix for screenshot service |\n\n**Behavior:**\n1. Finds `\u003ca class=\"wikilink\"\u003e` tags created by the wikilinks plugin\n2. Looks up the target post by href\n3. Adds data attributes for hover previews\n\n**Data attributes added:**\n| Attribute | Description |\n|-----------|-------------|\n| `data-preview` | Truncated description or content |\n| `data-preview-image` | Featured image URL (if available) |\n| `data-preview-screenshot` | Screenshot service URL (if configured) |\n\n**Before:**\n```html\n\u003ca href=\"/my-post/\" class=\"wikilink\"\u003eMy Post\u003c/a\u003e\n```\n\n**After:**\n```html\n\u003ca href=\"/my-post/\" class=\"wikilink\"\n   data-preview=\"This is a description of the post...\"\n   data-preview-image=\"/images/featured.jpg\"\u003eMy Post\u003c/a\u003e\n```\n\n**Hover display:** The default theme's `js/tooltips.js` renders the card for\nevery wikilink with a `data-title` (added by the `wikilinks` plugin), falling\nback to `data-preview` when the target has no description. You don't need to\nwrite any JavaScript. See [Hover Cards](/docs/guides/markdown/#hover-cards) for\nstyling and for adding cards to glossary terms or your own elements.\n\n**Image field lookup order:**\nThe plugin checks these Extra fields for images:\n1. `image`\n2. `featured_image`\n3. `cover_image`\n4. `og_image`\n5. `thumbnail`\n\n### Examples\n\n#### Basic Wikilink with Hover Preview\n\nWhen you link to another post using wikilink syntax, the hover plugin automatically adds preview data:\n\n**Markdown input:**\n```markdown\nLearn more about [[getting-started|getting started with markata-go]].\n\nFor advanced users, check out [[plugin-development]].\n```\n\n**Rendered HTML (with hover data):**\n```html\n\u003ca href=\"/getting-started/\" class=\"wikilink\"\n   data-preview=\"A comprehensive guide to installing and configuring markata-go for your first static site project.\"\n   data-preview-image=\"/images/getting-started-hero.jpg\"\u003egetting started with markata-go\u003c/a\u003e\n\n\u003ca href=\"/plugin-development/\" class=\"wikilink\"\n   data-preview=\"Learn how to extend markata-go with custom plugins that hook into the build lifecycle.\"\u003ePlugin Development\u003c/a\u003e\n```\n\n#### Styling Hover Previews\n\nThe built-in card uses the `hover-card` and `wikilink-tooltip` classes and\nfollows the active palette. Override them in your site CSS:\n\n```css\n.hover-card.wikilink-tooltip {\n  max-width: 26rem;\n}\n\n.hover-card .tooltip-path {\n  display: none;\n}\n```\n\n#### Using Screenshot Service for External Previews\n\nConfigure a screenshot service for richer previews:\n\n```toml\n[markata-go.wikilink_hover]\nenabled = true\npreview_length = 200\ninclude_image = true\nscreenshot_service = \"https://api.microlink.io/?screenshot=true\u0026url=\"\n```\n\nThis adds a `data-preview-screenshot` attribute for external screenshot generation:\n\n```html\n\u003ca href=\"/complex-diagrams/\" class=\"wikilink\"\n   data-preview=\"Learn to create complex diagrams with Mermaid.js\"\n   data-preview-screenshot=\"https://api.microlink.io/?screenshot=true\u0026url=https://mysite.com/complex-diagrams/\"\u003e\n   Complex Diagrams\n\u003c/a\u003e\n```\n\n---\n\n### encryption\n\n**Name:** `encryption`  \n**Stage:** Render (priority 50 -- after markdown rendering, before templates)  \n**Purpose:** Encrypts content for private posts using AES-256-GCM client-side encryption.\n\n**Status:** Enabled by default with `default_key = \"default\"`.\n\n**Configuration (TOML):**\n\n```toml\n[encryption]\nenabled = true\ndefault_key = \"default\"\ndecryption_hint = \"Contact me for access\"\n\n[encryption.private_tags]\ndiary = \"personal\"\n```\n\n**Behavior:**\n\n1. Applies `private_tags` config -- posts with matching tags are marked `private: true`\n2. Validates that every private post has an available encryption key\n3. If any private post has no key, returns a **CriticalError** that halts the build\n4. Encrypts `ArticleHTML` of each private post with the resolved key\n5. Replaces content with an encrypted wrapper containing a password prompt\n\n**Encryption keys** are loaded from environment variables:\n\n```bash\nMARKATA_GO_ENCRYPTION_KEY_DEFAULT=password\nMARKATA_GO_ENCRYPTION_KEY_PERSONAL=another-password\n```\n\n**Post fields read:**\n- `Private` -- whether the post is private\n- `SecretKey` -- which encryption key to use (set via `secret_key`, `private_key`, or `encryption_key` frontmatter)\n- `Tags` -- checked against `private_tags` config\n- `ArticleHTML` -- the content to encrypt\n\n**Post fields set:**\n- `ArticleHTML` -- replaced with encrypted wrapper HTML\n- `Extra[\"has_encrypted_content\"]` -- `true` (for template script inclusion)\n- `Extra[\"encryption_key_name\"]` -- the key name used\n\n**Related:** See the [Encryption Guide](/docs/guides/encryption/) for complete usage documentation.\n\n---\n\n## Collect Stage\n\n### overwrite_check\n\n**Name:** `overwrite_check`  \n**Stage:** Collect (early priority)  \n**Purpose:** Detects when multiple posts or feeds would write to the same output path, preventing accidental content overwrites and catching slug conflicts early in the build.\n\n**Configuration:** No user-facing configuration required. The plugin runs automatically.\n\n**Behavior:**\n1. Runs early in the Collect stage (before feeds plugin)\n2. Checks all post output paths (`{output_dir}/{slug}/index.html`)\n3. Checks all feed output paths (HTML, RSS, Atom, JSON)\n4. Detects conflicts where multiple sources would write to the same file\n5. Fails the build with detailed error messages\n\n**Error Output Example:**\n```\ndetected 2 output path conflict(s):\n  - markout/about/index.html: post:content/about.md, feed:about\n  - markout/blog/index.html: post:content/blog.md, post:content/blog-page.md\n```\n\n**Common Conflict Scenarios:**\n\n1. **Post and feed with same slug:**\n```yaml\n# content/about.md\n---\nslug: \"about\"\n---\n```\n```toml\n# markata-go.toml - conflicts!\n[[markata-go.feeds]]\nslug = \"about\"\n```\n\n2. **Two posts with same slug:**\n```yaml\n# content/post-a.md\n---\nslug: \"my-page\"\n---\n```\n```yaml\n# content/post-b.md\n---\nslug: \"my-page\"  # Conflict!\n---\n```\n\n**Resolution strategies:**\n- Rename one of the conflicting slugs\n- Use different paths for feeds vs content\n- Remove duplicate content\n\n**Files checked for conflicts:**\n| Source | Output Path |\n|--------|-------------|\n| Post | `{output_dir}/{slug}/index.html` |\n| Feed HTML | `{output_dir}/{feed_slug}/index.html` |\n| Feed RSS | `{output_dir}/{feed_slug}/rss.xml` |\n| Feed Atom | `{output_dir}/{feed_slug}/atom.xml` |\n| Feed JSON | `{output_dir}/{feed_slug}/index.json` |\n\n---\n\n### static_file_conflicts\n\n**Name:** `static_file_conflicts`  \n**Stage:** Collect (late priority)  \n**Purpose:** Detects when static files in the `static/` directory would silently clobber generated content, causing unexpected behavior like private posts not being added to robots.txt.\n\n**Configuration (TOML):**\n```toml\n[markata-go.static_file_conflicts]\nenabled = true        # Enable/disable the lint rule (default: true)\nstatic_dir = \"static\" # Static files directory (default: \"static\")\n```\n\n**Behavior:**\n1. Runs late in the Collect stage (after content is processed)\n2. Scans the `static/` directory for files\n3. Checks for posts that would generate root-level files (robots.md → robots.txt)\n4. Checks for feed output paths (rss.xml, atom.xml, sitemap.xml)\n5. Reports warnings when conflicts are detected\n6. Continues the build (non-blocking warning)\n\n**Warning Output Example:**\n```\nWARNING: 2 static file conflict(s) detected\nStatic files will override generated content.\n\n  Conflicting /robots.txt:\n    Generated: pages/robots.md → /robots.txt\n    Static:    static/robots.txt → /robots.txt\n    The static file will override the generated one.\n\n  Conflicting /sitemap.xml:\n    Generated: sitemap → /sitemap.xml\n    Static:    static/sitemap.xml → /sitemap.xml\n    The static file will override the generated one.\n\nTo fix:\n  - Remove the static file if you want the generated version\n  - Remove or rename the source file if you want the static version\n  - Disable the static_file_conflicts lint rule in config if intentional\n```\n\n**Common Conflict Scenarios:**\n\n1. **robots.txt conflict:**\n   ```\n   pages/robots.md     → generates /robots.txt (with private posts excluded)\n   static/robots.txt   → copied to /robots.txt (overwrites generated)\n   ```\n   **Impact:** Private posts may NOT be added to robots.txt Disallow rules.\n\n2. **sitemap.xml conflict:**\n   ```\n   Sitemap plugin      → generates /sitemap.xml\n   static/sitemap.xml  → overwrites with static version\n   ```\n   **Impact:** New posts won't appear in the sitemap for search engines.\n\n3. **Feed conflicts:**\n   ```\n   RSS plugin          → generates /rss.xml\n   static/rss.xml      → overwrites with static version\n   ```\n\n**Checked file patterns:**\n| Generated Source | Checks For Static File |\n|------------------|------------------------|\n| `robots.md` | `static/robots.txt` |\n| `sitemap.md` | `static/sitemap.xml` |\n| `humans.md` | `static/humans.txt` |\n| `security.md` | `static/security.txt` |\n| `manifest.md` | `static/manifest.json`, `static/manifest.webmanifest` |\n| RSS feed | `static/rss.xml`, `static/feed.xml` |\n| Atom feed | `static/atom.xml` |\n| JSON feed | `static/index.json`, `static/feed.json` |\n\n**Disabling the lint rule:**\nIf the conflict is intentional (you specifically want the static file to override):\n```toml\n[markata-go.static_file_conflicts]\nenabled = false\n```\n\n**Related:**\n- [[#overwrite_check|overwrite_check]] - Detects conflicts between generated files\n- [[#static_assets|static_assets]] - Copies static files to output\n\n---\n\n### series\n\n**Name:** `series`  \n**Stage:** Collect (PriorityEarly)  \n**Purpose:** Scans posts for `series` frontmatter and auto-generates series feed configs with prev/next navigation for sequential reading.\n\nPosts declare series membership with `series: \"series-name\"` in frontmatter. The plugin groups posts by series, sorts them (by `series_order` or date ascending), sets prev/next navigation, and injects series `FeedConfig` entries so the feeds plugin renders them.\n\n**Frontmatter:**\n```yaml\n---\ntitle: \"Part 1: Getting Started\"\nseries: \"Building a CLI in Go\"\nseries_order: 1  # optional, defaults to date-ascending order\n---\n```\n\n**Configuration (TOML):**\n```toml\n[markata-go.series]\nslug_prefix = \"series\"     # URL prefix (default: \"series\")\nauto_sidebar = true        # Auto-enable feed sidebar (default: true)\n\n[markata-go.series.defaults]\nitems_per_page = 0         # No pagination by default\nsidebar = true             # Show sidebar on series posts\n\n[markata-go.series.defaults.formats]\nhtml = true\nrss = true\natom = false\njson = false\n\n# Per-series overrides (keyed by series name)\n[markata-go.series.overrides.\"building-a-cli-in-go\"]\ntitle = \"Building a CLI in Go\"\ndescription = \"A step-by-step guide to building CLIs with Go and Cobra\"\n```\n\n**Behavior:**\n- Posts can belong to only one series\n- Series feeds are created at `/{slug_prefix}/{series-slug}/` (e.g., `/series/building-a-cli-in-go/`)\n- Posts within a series get Prev/Next navigation and position indicators (\"Part X of Y\")\n- Series feeds automatically show in the feed sidebar, taking precedence over other feeds\n- Feed type is set to `FeedTypeSeries`\n- Runs before the `feeds` plugin so generated configs are available for processing\n\n**Related:**\n- [[series-guide|Series Guide]] - Complete usage documentation\n- [[\u003ca href=\"/tags/feeds/\" class=\"hashtag-tag\" data-tag=\"feeds\" data-count=9 data-reading-time=51 data-reading-time-text=\"51 minutes\"\u003e#feeds\u003c/a\u003e|feeds]] - Processes the feed configs generated by this plugin\n- [[#prevnext|prevnext]] - Calculates prev/next from feeds and series\n\n---\n\n### feeds\n\n**Name:** `feeds`  \n**Stage:** Collect  \n**Purpose:** Processes configured feed definitions, filtering, sorting, and paginating posts.\n\n**Configuration (TOML):**\n```toml\n[[markata-go.feeds]]\nslug = \"blog\"\ntitle = \"Blog Posts\"\ndescription = \"All blog posts\"\nfilter = \"published == true and not draft\"\nsort = \"date\"\nreverse = true\nitems_per_page = 10\n\n[markata-go.feeds.formats]\nhtml = true\nrss = true\natom = false\njson = false\n\n[[markata-go.feeds]]\nslug = \"tutorials\"\ntitle = \"Tutorials\"\nfilter = \"tags contains 'tutorial'\"\nsort = \"date\"\nreverse = true\n```\n\n**Feed configuration options:**\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `slug` | string | required | URL path for the feed |\n| `title` | string | \"\" | Feed title |\n| `description` | string | \"\" | Feed description |\n| `filter` | string | \"\" | Filter expression |\n| `sort` | string | \"date\" | Sort field |\n| `reverse` | bool | true | Reverse sort order |\n| `items_per_page` | int | 10 | Posts per page |\n| `formats` | object | varies | Output formats |\n\n**Filter expression syntax:**\n```toml\n# Equality\nfilter = \"published == true\"\nfilter = \"category == 'news'\"\n\n# Contains (for arrays)\nfilter = \"tags contains 'go'\"\n\n# Boolean combinations\nfilter = \"published == true and not draft\"\nfilter = \"tags contains 'go' or tags contains 'python'\"\n\n# Comparisons\nfilter = \"date \u003e= '2024-01-01'\"\n```\n\nSee [[feeds-guide|Feeds Guide]] for complete filter syntax.\n\n---\n\n### auto_feeds\n\n**Name:** `auto_feeds`  \n**Stage:** Collect  \n**Purpose:** Automatically generates feeds for tags, categories, and date archives.\n\n**Configuration (TOML):**\n```toml\n[markata-go.auto_feeds.tags]\nenabled = true\nslug_prefix = \"tags\"  # Results in /tags/python/, /tags/go/, etc.\n\n[markata-go.auto_feeds.tags.formats]\nhtml = true\nrss = true\n\n[markata-go.auto_feeds.categories]\nenabled = true\nslug_prefix = \"categories\"\n\n[markata-go.auto_feeds.categories.formats]\nhtml = true\nrss = true\n\n[markata-go.auto_feeds.archives]\nenabled = true\nslug_prefix = \"archive\"\nyearly_feeds = true   # /archive/2024/\nmonthly_feeds = false # /archive/2024/01/\n\n[markata-go.auto_feeds.archives.formats]\nhtml = true\nrss = false\n```\n\n**Generated feeds:**\n\nFor tags:\n- `/tags/python/` - Posts tagged \"python\"\n- `/tags/go/` - Posts tagged \"go\"\n\nFor categories (uses `category` field from post Extra):\n- `/categories/tutorials/` - Posts in tutorials category\n\nFor archives:\n- `/archive/2024/` - All posts from 2024\n- `/archive/2024/01/` - All posts from January 2024 (if monthly enabled)\n\n---\n\n### prevnext\n\n**Name:** `prevnext`  \n**Stage:** Collect  \n**Purpose:** Calculates previous/next post links for navigation based on feed ordering.\n\n**Configuration (TOML):**\n```toml\n[markata-go.prevnext]\nenabled = true           # Enable/disable the plugin (default: true)\nstrategy = \"first_feed\"  # Strategy for determining navigation context\ndefault_feed = \"blog\"    # Default feed slug (for \"explicit_feed\" strategy)\n```\n\n**Strategy options:**\n| Strategy | Description |\n|----------|-------------|\n| `first_feed` | Use the first feed that contains the post (default) |\n| `explicit_feed` | Always use the feed specified in `default_feed` |\n| `series` | Use `series` frontmatter field, fall back to `first_feed` |\n| `frontmatter` | Use `prevnext_feed` frontmatter field, fall back to `first_feed` |\n\n**Behavior:**\n1. Runs after the `feeds` plugin to access feed data\n2. For each post, determines which feed to use based on strategy\n3. Finds the post's position within that feed\n4. Sets `Prev` and `Next` post references\n5. Sets `PrevNextContext` with additional navigation metadata\n\n**Post fields set:**\n| Field | Type | Description |\n|-------|------|-------------|\n| `prev` | *Post | Previous post in sequence (nil if first) |\n| `next` | *Post | Next post in sequence (nil if last) |\n| `prev_next_feed` | string | Feed slug used for navigation |\n| `prev_next_context` | *PrevNextContext | Full navigation context |\n\n**PrevNextContext structure:**\n```go\ntype PrevNextContext struct {\n    FeedSlug  string // Slug of the feed used\n    FeedTitle string // Title of the feed\n    Position  int    // 1-indexed position in feed\n    Total     int    // Total posts in feed\n    Prev      *Post  // Previous post\n    Next      *Post  // Next post\n}\n```\n\n**Template usage:**\n```html\n{% if post.Prev or post.Next %}\n\u003cnav class=\"post-navigation\"\u003e\n    {% if post.Prev %}\n    \u003ca href=\"{{ post.Prev.Href }}\" class=\"nav-prev\"\u003e\n        \u003cspan class=\"nav-label\"\u003ePrevious\u003c/span\u003e\n        \u003cspan class=\"nav-title\"\u003e{{ post.Prev.Title }}\u003c/span\u003e\n    \u003c/a\u003e\n    {% endif %}\n\n    {% if post.Next %}\n    \u003ca href=\"{{ post.Next.Href }}\" class=\"nav-next\"\u003e\n        \u003cspan class=\"nav-label\"\u003eNext\u003c/span\u003e\n        \u003cspan class=\"nav-title\"\u003e{{ post.Next.Title }}\u003c/span\u003e\n    \u003c/a\u003e\n    {% endif %}\n\u003c/nav\u003e\n{% endif %}\n\n\u003c!-- With context --\u003e\n{% if post.PrevNextContext %}\n\u003cdiv class=\"series-progress\"\u003e\n    Post {{ post.PrevNextContext.Position }} of {{ post.PrevNextContext.Total }}\n    in {{ post.PrevNextContext.FeedTitle }}\n\u003c/div\u003e\n{% endif %}\n```\n\n**Using series for tutorials:**\n```yaml\n---\ntitle: \"Part 2: Advanced Topics\"\nseries: \"go-tutorial\"\n---\n```\n\n```toml\n[markata-go.prevnext]\nstrategy = \"series\"\n```\n\n---\n\n## Write Stage\n\n### publish_html\n\n**Name:** `publish_html`  \n**Stage:** Write  \n**Purpose:** Writes individual post HTML files to the output directory.\n\n**Configuration:** Uses `output_dir` from main config.\n\n**Behavior:**\n1. Skips posts marked as skip, unpublished, or draft\n2. Creates directory: `{output_dir}/{slug}/`\n3. Writes `index.html` with post's HTML content\n4. Uses `post.HTML` if available, otherwise wraps `ArticleHTML` in basic template\n\n**Output structure:**\n```\noutput/\n  getting-started/\n    index.html\n  advanced-topics/\n    index.html\n  my-first-post/\n    index.html\n```\n\n---\n\n### random_post\n\n**Name:** `random_post`  \n**Stage:** Write  \n**Purpose:** Writes a static `/random/` page that picks a random eligible post in the browser.\n\n**Configuration (TOML):**\n```toml\n[markata-go.random_post]\nenabled = true\npath = \"random\"               # default: \"random\"\nexclude_tags = [\"draft\"]      # optional\nemit_posts_json = false        # optional\n```\n\n**Outputs:**\n- `/{path}/index.html`\n- `/{path}/posts.json` (optional)\n\n**Eligibility (defaults):** published, not draft/private/skip, and not tagged with any `exclude_tags`.\n\nWarm builds replace a page previously generated by this plugin. A real post at\n`/{path}/` remains a route collision; the homepage `/` is not one.\n\n---\n\n### well_known\n\n**Name:** `well_known`  \n**Stage:** Write  \n**Purpose:** Generates `.well-known` endpoints from site metadata.\n\n**Configuration:** `markata-go.well_known`\n\n**Behavior:**\n1. Resolves enabled entries from `auto_generate`\n2. Renders templates in `templates/well-known/` if present\n3. Writes files into `output/.well-known/`\n\n**Generated files (defaults):**\n- `/.well-known/host-meta`\n- `/.well-known/host-meta.json`\n- `/.well-known/webfinger`\n- `/.well-known/nodeinfo` and `/nodeinfo/2.0`\n- `/.well-known/time`\n- `/.well-known/links`\n- `/.well-known/internal-links`\n- `/external-links/index.html`\n- `/internal-links/index.html`\n\n**Optional files:**\n- `/.well-known/sshfp` (when `ssh_fingerprint` is set)\n- `/.well-known/keybase.txt` (when `keybase_username` is set)\n\n**Template overrides \u0026 context:**\n- Templates in `templates/well-known/` override the built-in host discovery responses.\n- Themes or sites can provide `templates/external-links.html` (for `/external-links/`) and `templates/internal-links.html` (for `/internal-links/`).\n- When rendering the link pages, the context includes `well_known_links` (outbound domain buckets) and `well_known_internal_links` (internal target buckets) in addition to `well_known`.\n\n**Template context additions:**\n- `well_known_links`: list of `{domain, count, links}` objects describing outbound destinations.\n- `well_known_internal_links`: list of `{targetUrl, count, links}` objects describing grouped internal targets.\n\n---\n\n### publish_feeds\n\n**Name:** `publish_feeds`  \n**Stage:** Write  \n**Purpose:** Writes feed output files in all configured formats (HTML, RSS, Atom, JSON, Markdown, Text).\n\n**Behavior:**\nFor each feed, generates enabled formats:\n\n| Format | File | Description |\n|--------|------|-------------|\n| HTML | `index.html`, `page/2/index.html` | Paginated HTML pages |\n| RSS | `rss.xml` | RSS 2.0 feed |\n| Atom | `atom.xml` | Atom 1.0 feed |\n| JSON | `feed.json` | JSON Feed 1.1 |\n| Markdown | `slug.md` | Markdown listing |\n| Text | `slug.txt` | Plain text listing |\n\n**Output structure:**\n```\noutput/\n  blog/\n    index.html      # Page 1\n    page/\n      2/\n        index.html  # Page 2\n      3/\n        index.html  # Page 3\n    rss.xml\n    atom.xml\n    feed.json\n  tags/\n    python/\n      index.html\n      rss.xml\n```\n\n---\n\n### llms_txt\n\n**Name:** `llms_txt`  \n**Stage:** Write (last priority)  \n**Purpose:** Automatically generate a concise v2-style `/llms.txt` index\nfor AI agents from public site metadata and selected published pages.\n\n**Configuration:** `[markata-go.llms_txt]` with `enabled = true` and\n`max_pages = 30` defaults. Caps output at 100 entries. Drafts, private,\nskipped, unpublished, and `noindex` posts are excluded. The generator\nuses `.md` links when Markdown post output is enabled.\n\nA published `llms.md` or project static `llms.txt` wins over auto\ngeneration; existing manual output is also preserved. Disabling only\ndeletes content identified as automatically generated. Excluded from\nsingle-page builds.\n\n### sitemap\n\n**Name:** `sitemap`  \n**Stage:** Write  \n**Purpose:** Generates a sitemap.xml file listing all published posts and feed pages.\n\n**Configuration:** None (uses `url` from main config for absolute URLs)\n\n**Behavior:**\n1. Adds home page with highest priority\n2. Adds all published posts with their dates\n3. Adds feed index pages\n4. Writes to `{output_dir}/sitemap.xml`\n\n**Output example:**\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003curlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\u003e\n    \u003curl\u003e\n        \u003cloc\u003ehttps://example.com/\u003c/loc\u003e\n        \u003clastmod\u003e2024-01-15\u003c/lastmod\u003e\n        \u003cchangefreq\u003edaily\u003c/changefreq\u003e\n        \u003cpriority\u003e1.0\u003c/priority\u003e\n    \u003c/url\u003e\n    \u003curl\u003e\n        \u003cloc\u003ehttps://example.com/my-post/\u003c/loc\u003e\n        \u003clastmod\u003e2024-01-15\u003c/lastmod\u003e\n        \u003cchangefreq\u003eweekly\u003c/changefreq\u003e\n        \u003cpriority\u003e0.8\u003c/priority\u003e\n    \u003c/url\u003e\n\u003c/urlset\u003e\n```\n\n---\n\n### rss\n\n**Name:** `rss`  \n**Stage:** Write (utility)  \n**Purpose:** Generates RSS 2.0 feeds. Used by `publish_feeds`.\n\n**Output format:** RSS 2.0 with Atom namespace for self-reference.\n\n**Example output:**\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003crss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\"\u003e\n    \u003cchannel\u003e\n        \u003ctitle\u003eMy Blog\u003c/title\u003e\n        \u003clink\u003ehttps://example.com\u003c/link\u003e\n        \u003cdescription\u003eA blog about things\u003c/description\u003e\n        \u003clanguage\u003een-us\u003c/language\u003e\n        \u003clastBuildDate\u003eMon, 15 Jan 2024 10:00:00 +0000\u003c/lastBuildDate\u003e\n        \u003catom:link href=\"https://example.com/blog/rss.xml\" rel=\"self\" type=\"application/rss+xml\"/\u003e\n        \u003citem\u003e\n            \u003ctitle\u003eMy First Post\u003c/title\u003e\n            \u003clink\u003ehttps://example.com/my-first-post/\u003c/link\u003e\n            \u003cdescription\u003ePost description or excerpt...\u003c/description\u003e\n            \u003cpubDate\u003eMon, 15 Jan 2024 10:00:00 +0000\u003c/pubDate\u003e\n            \u003cguid isPermaLink=\"true\"\u003ehttps://example.com/my-first-post/\u003c/guid\u003e\n        \u003c/item\u003e\n    \u003c/channel\u003e\n\u003c/rss\u003e\n```\n\n---\n\n### atom\n\n**Name:** `atom`  \n**Stage:** Write (utility)  \n**Purpose:** Generates Atom 1.0 feeds. Used by `publish_feeds`.\n\n**Output format:** Atom 1.0\n\n**Example output:**\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cfeed xmlns=\"http://www.w3.org/2005/Atom\"\u003e\n    \u003ctitle\u003eMy Blog\u003c/title\u003e\n    \u003cid\u003ehttps://example.com/blog/atom.xml\u003c/id\u003e\n    \u003cupdated\u003e2024-01-15T10:00:00Z\u003c/updated\u003e\n    \u003clink href=\"https://example.com\" rel=\"alternate\" type=\"text/html\"/\u003e\n    \u003clink href=\"https://example.com/blog/atom.xml\" rel=\"self\" type=\"application/atom+xml\"/\u003e\n    \u003cauthor\u003e\n        \u003cname\u003eAuthor Name\u003c/name\u003e\n    \u003c/author\u003e\n    \u003centry\u003e\n        \u003ctitle\u003eMy First Post\u003c/title\u003e\n        \u003cid\u003ehttps://example.com/my-first-post/\u003c/id\u003e\n        \u003cupdated\u003e2024-01-15T10:00:00Z\u003c/updated\u003e\n        \u003cpublished\u003e2024-01-15T10:00:00Z\u003c/published\u003e\n        \u003clink href=\"https://example.com/my-first-post/\" rel=\"alternate\" type=\"text/html\"/\u003e\n        \u003csummary type=\"text\"\u003ePost description\u003c/summary\u003e\n        \u003ccontent type=\"html\"\u003eFull HTML content...\u003c/content\u003e\n    \u003c/entry\u003e\n\u003c/feed\u003e\n```\n\n---\n\n### jsonfeed\n\n**Name:** `jsonfeed`  \n**Stage:** Write (utility)  \n**Purpose:** Generates JSON Feed 1.1 documents. Used by `publish_feeds`.\n\n**Output format:** [JSON Feed 1.1](https://jsonfeed.org/version/1.1)\n\n**Example output:**\n```json\n{\n    \"version\": \"https://jsonfeed.org/version/1.1\",\n    \"title\": \"My Blog\",\n    \"home_page_url\": \"https://example.com\",\n    \"feed_url\": \"https://example.com/blog/feed.json\",\n    \"description\": \"A blog about things\",\n    \"language\": \"en\",\n    \"authors\": [\n        { \"name\": \"Author Name\" }\n    ],\n    \"items\": [\n        {\n            \"id\": \"https://example.com/my-first-post/\",\n            \"url\": \"https://example.com/my-first-post/\",\n            \"title\": \"My First Post\",\n            \"content_html\": \"\u003cp\u003eFull HTML content...\u003c/p\u003e\",\n            \"content_text\": \"Plain text content...\",\n            \"summary\": \"Post description\",\n            \"date_published\": \"2024-01-15T10:00:00Z\",\n            \"tags\": [\"go\", \"programming\"]\n        }\n    ]\n}\n```\n\n---\n\n### static_assets\n\n**Name:** `static_assets`  \n**Stage:** Write  \n**Purpose:** Copies static assets from theme and project directories to output.\n\n**Configuration (TOML):**\n```toml\n[markata]\ntheme = \"default\"  # Theme name for theme static files\n```\n\n**Behavior:**\n1. Copies theme static files from `themes/{theme}/static/`\n2. Copies project static files from `static/`\n3. Project files override theme files (local customization)\n\n**Directory structure:**\n```\nmysite/\n  themes/\n    default/\n      static/\n        css/\n          theme.css\n        js/\n          theme.js\n  static/\n    css/\n      custom.css    # Overrides or adds to theme\n    images/\n      logo.png\n  output/\n    css/\n      theme.css     # From theme\n      custom.css    # From project\n    js/\n      theme.js      # From theme\n    images/\n      logo.png      # From project\n```\n\n---\n\n### palette_css\n\n**Name:** `palette_css`  \n**Stage:** Write (after static_assets)  \n**Purpose:** Generates CSS custom properties from the configured color palette, enabling theme customization without modifying CSS files directly.\n\n**Configuration (TOML):**\n```toml\n[markata-go.theme]\npalette = \"nord\"  # Palette name (built-in or custom)\n```\n\n**Built-in palettes:**\n- `catppuccin-latte` - Light pastel theme\n- `catppuccin-mocha` - Dark pastel theme\n- `dracula` - Dark purple/pink theme\n- `gruvbox-dark` - Dark retro groove theme\n- `gruvbox-light` - Light retro groove theme\n- `nord` - Arctic, north-bluish color palette\n- `one-dark` - Atom One Dark inspired\n- `rose-pine` - All-natural pine, faux fur, and soho vibes\n- `solarized-dark` - Precision dark theme\n- `solarized-light` - Precision light theme\n- `tokyo-night` - Dark theme inspired by Tokyo night lights\n\n**Behavior:**\n1. Reads palette name from `config.Extra[\"theme\"][\"palette\"]`\n2. Loads the palette definition (built-in or from `palettes/` directory)\n3. Maps palette semantic colors to theme CSS variable names\n4. Generates `css/variables.css` with CSS custom properties\n5. Includes default font families, spacing, and layout values\n\n**Generated CSS structure:**\n```css\n/* CSS Custom Properties - Nord Theme */\n:root {\n  --color-primary: #88c0d0;\n  --color-primary-light: #8fbcbb;\n  --color-primary-dark: #8fbcbb;\n\n  /* Semantic colors */\n  --color-text: #eceff4;\n  --color-text-muted: #d8dee9;\n  --color-background: #2e3440;\n  --color-surface: #3b4252;\n  --color-border: #4c566a;\n\n  /* Status colors */\n  --color-success: #a3be8c;\n  --color-warning: #ebcb8b;\n  --color-error: #bf616a;\n  --color-info: #81a1c1;\n\n  /* Font families */\n  --font-body: system-ui, -apple-system, ...;\n  --font-heading: var(--font-body);\n  --font-mono: ui-monospace, ...;\n\n  /* Font sizes, spacing, layout... */\n}\n```\n\n**Custom palettes:**\nCreate a TOML file in the `palettes/` directory:\n\n```toml\n# palettes/my-palette.toml\nname = \"My Custom Palette\"\ntype = \"dark\"  # or \"light\"\n\n[colors]\naccent = \"#ff6b6b\"\naccent-hover = \"#ee5a5a\"\ntext-primary = \"#f8f8f2\"\ntext-muted = \"#b0b0b0\"\nbg-primary = \"#1a1a2e\"\nbg-surface = \"#16213e\"\nborder = \"#2d3a5a\"\nsuccess = \"#50fa7b\"\nwarning = \"#f1fa8c\"\nerror = \"#ff5555\"\ninfo = \"#8be9fd\"\n```\n\n**Template usage:**\nVariables are automatically available in your CSS:\n\n```css\n.my-component {\n  background: var(--color-surface);\n  color: var(--color-text);\n  border: 1px solid var(--color-border);\n}\n\n.button-primary {\n  background: var(--color-primary);\n  color: var(--color-background);\n}\n```\n\n**Why use palettes?**\n- Switch themes by changing one config value\n- Consistent colors across your entire site\n- Built-in palettes tested for accessibility\n- Easy to create and share custom themes\n\n---\n\n### chroma_css\n\n**Name:** `chroma_css`  \n**Stage:** Configure + Write  \n**Purpose:** Generates `css/chroma.css` for syntax-highlighted code blocks. By default it styles Chroma token classes from the active palette's `code-*` colors; with `markdown.highlight.theme` it uses an explicit Chroma theme override.\n\n**Configuration (TOML):**\n```toml\n# Explicit theme setting\n[markdown.highlight]\ntheme = \"github-dark\"  # Chroma theme name\n```\n\nOr use palette-native syntax colors:\n```toml\n[theme]\npalette = \"catppuccin-mocha\"  # Uses the palette's code-* component colors\n```\n\n**Behavior:**\n1. During Configure: Reads `markdown.highlight.theme` if explicitly set\n2. Without an explicit theme, emits palette-native CSS using `--color-code-*` variables\n3. During Write: Generates `{output_dir}/css/chroma.css` with syntax highlighting styles\n\n**Available Chroma Themes:**\n\nLight themes:\n- `github`, `gruvbox-light`, `solarized-light`, `catppuccin-latte`\n- `rose-pine-dawn`, `xcode`, `vs`, `friendly`, `tango`\n\nDark themes:\n- `github-dark`, `gruvbox`, `solarized-dark`, `catppuccin-mocha`\n- `dracula`, `monokai`, `nord`, `onedark`, `rose-pine`\n- `tokyo-night`, `vim`\n\n**Example CSS Output:**\n```css\n/* Syntax highlighting - generated from Chroma theme: github-dark */\n\n.chroma { color: #e6edf3; background-color: #0d1117 }\n.chroma .err { color: #f85149 }\n.chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }\n.chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; }\n.chroma .hl { background-color: #2d333b }\n.chroma .ln { color: #6e7681; }\n.chroma .k { color: #ff7b72 }  /* Keyword */\n.chroma .kc { color: #79c0ff }  /* KeywordConstant */\n.chroma .kd { color: #ff7b72 }  /* KeywordDeclaration */\n/* ... additional token styles ... */\n```\n\n**Template usage:**\nInclude the generated CSS in your base template:\n```html\n\u003clink rel=\"stylesheet\" href=\"/css/chroma.css\"\u003e\n```\n\n**Palette-native roles used by default:**\n\n- `code-bg`\n- `code-text`\n- `code-comment`\n- `code-keyword`\n- `code-string`\n- `code-number`\n- `code-function`\n- `code-type`\n- `code-operator`\n\n**Related plugins:**\n- [[#render_markdown|render_markdown]] - Uses CSS classes for syntax highlighting\n- [[#palette_css|palette_css]] - Generates theme color variables\n\n---\n\n### redirects\n\n**Name:** `redirects`  \n**Stage:** Write  \n**Purpose:** Generates HTML redirect pages from a `_redirects` file for URL migration and link preservation.\n\n**Configuration (TOML):**\n```toml\n[markata-go.redirects]\nredirects_file = \"static/_redirects\"  # Path to redirects file (default)\nredirect_template = \"\"                 # Custom template path (optional)\n```\n\n**Redirects file format (`static/_redirects`):**\n```\n# Comments start with #\n# Format: /old-path /new-path\n\n/old-post/          /new-post/\n/blog/2020/hello/   /posts/hello-world/\n/about-me/          /about/\n```\n\n**Behavior:**\n1. Reads the `_redirects` file (skips silently if not found)\n2. Parses redirect rules (ignores comments, empty lines, wildcards)\n3. For each rule, creates `{output_dir}/{old-path}/index.html`\n4. Uses HTML meta refresh and canonical link for SEO-friendly redirects\n5. Caches results to avoid regeneration on unchanged content\n\n**Supported redirect syntax:**\n- Simple redirects: `/old /new`\n- Paths must start with `/`\n- Wildcards (`*`) are ignored (not supported for static generation)\n- Status codes in the file are ignored (always uses meta refresh)\n\n**Generated HTML:**\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"en\"\u003e\n\u003chead\u003e\n  \u003cmeta http-equiv=\"Refresh\" content=\"0; url='/new-path/'\" /\u003e\n  \u003clink rel=\"canonical\" href=\"/new-path/\" /\u003e\n  \u003cmeta name=\"description\" content=\"/old-path/ has been moved to /new-path/.\" /\u003e\n  \u003ctitle\u003e/old-path/ has been moved to /new-path/\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n  \u003ch1\u003ePage Moved\u003c/h1\u003e\n  \u003cp\u003e\u003ccode\u003e/old-path/\u003c/code\u003e has moved to \u003ca href=\"/new-path/\"\u003e/new-path/\u003c/a\u003e\u003c/p\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n**Custom template:**\nCreate a custom template with these available variables:\n\n```html\n\u003c!-- templates/redirect.html --\u003e\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n    \u003cmeta http-equiv=\"Refresh\" content=\"0; url='{{ .New }}'\" /\u003e\n    \u003clink rel=\"canonical\" href=\"{{ .New }}\" /\u003e\n    \u003ctitle\u003eRedirecting...\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n    \u003cp\u003eRedirecting from {{ .Original }} to \u003ca href=\"{{ .New }}\"\u003e{{ .New }}\u003c/a\u003e\u003c/p\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n```toml\n[markata-go.redirects]\nredirect_template = \"templates/redirect.html\"\n```\n\n**Template variables:**\n| Variable | Type | Description |\n|----------|------|-------------|\n| `.Original` | string | Source path (e.g., `/old-post/`) |\n| `.New` | string | Destination path (e.g., `/new-post/`) |\n| `.Config` | *Config | Site configuration object |\n\n---\n\n### qrcode\n\n**Name:** `qrcode`  \n**Stage:** Write  \n**Purpose:** Generates QR code images for each post's URL, useful for print materials or sharing.\n\n**Configuration (TOML):**\n```toml\n[markata-go.qrcode]\nenabled = true\nformat = \"svg\"              # \"svg\" or \"png\"\nsize = 200                  # Size in pixels\noutput_dir = \"qrcodes\"      # Subdirectory in output\nerror_correction = \"M\"      # L, M, Q, H\nforeground = \"#000000\"      # QR code color\nbackground = \"#ffffff\"      # Background color\n```\n\n**Options:**\n| Option | Default | Description |\n|--------|---------|-------------|\n| `enabled` | `true` | Enable/disable QR code generation |\n| `format` | `svg` | Output format: `svg` or `png` |\n| `size` | `200` | Image size in pixels |\n| `output_dir` | `qrcodes` | Output subdirectory name |\n| `error_correction` | `M` | Error correction level |\n| `foreground` | `#000000` | QR code foreground color |\n| `background` | `#ffffff` | QR code background color |\n\n**Error correction levels:**\n| Level | Recovery | Use Case |\n|-------|----------|----------|\n| `L` | ~7% | Clean environments |\n| `M` | ~15% | Standard use (default) |\n| `Q` | ~25% | Industrial/outdoor |\n| `H` | ~30% | Maximum durability |\n\n**Behavior:**\n1. For each non-skipped post, builds the absolute URL\n2. Generates QR code in the configured format\n3. Saves to `{output_dir}/{qrcode_output_dir}/{slug}.{format}`\n4. Adds `qrcode_url` to post's Extra map\n\n**Output structure:**\n```\noutput/\n  qrcodes/\n    hello-world.svg\n    my-first-post.svg\n    another-article.svg\n```\n\n**Post field set:**\n| Field | Type | Description |\n|-------|------|-------------|\n| `qrcode_url` | string | Relative URL to QR code image |\n\n**Template usage:**\n```html\n{% if post.qrcode_url %}\n\u003cdiv class=\"qr-code\"\u003e\n    \u003cimg src=\"{{ post.qrcode_url }}\" alt=\"QR Code for {{ post.Title }}\" /\u003e\n    \u003cp\u003eScan to visit this page\u003c/p\u003e\n\u003c/div\u003e\n{% endif %}\n```\n\n**Print stylesheet example:**\n```css\n@media print {\n    .qr-code {\n        display: block;\n        page-break-inside: avoid;\n        text-align: center;\n        margin-top: 2rem;\n    }\n    .qr-code img {\n        width: 150px;\n        height: 150px;\n    }\n}\n@media screen {\n    .qr-code {\n        display: none; /* Hide on screen, show in print */\n    }\n}\n```\n\n**Custom colors example:**\n```toml\n[markata-go.qrcode]\nforeground = \"#2e3440\"  # Nord dark\nbackground = \"#eceff4\"  # Nord light\n```\n\n---\n\n## Default Plugin Order\n\nWhen using `DefaultPlugins()`, plugins execute in this order:\n\n```go\n[]lifecycle.Plugin{\n    // Glob stage\n    NewGlobPlugin(),\n\n    // Load stage\n    NewLoadPlugin(),\n\n    // Transform stage (in order)\n    NewAutoTitlePlugin(),      // Auto-generate titles from filenames\n    NewDescriptionPlugin(),    // Auto-generate descriptions early\n    NewReadingTimePlugin(),    // Calculate reading time\n    NewStructuredDataPlugin(), // Generate SEO metadata\n    NewWikilinksPlugin(),      // Process wikilinks\n    NewTocPlugin(),            // Extract TOC\n    NewJinjaMdPlugin(),        // Process Jinja templates\n\n    // Render stage\n    NewRenderMarkdownPlugin(),\n    NewHeadingAnchorsPlugin(), // Add anchor links to headings\n    NewChartJSPlugin(),        // Convert Chart.js code blocks to charts\n    NewCSVFencePlugin(),       // Convert CSV code blocks to tables\n    NewMermaidPlugin(),        // Convert Mermaid code blocks to diagrams\n    NewGlossaryPlugin(),       // Auto-link glossary terms\n    NewWikilinkHoverPlugin(),  // Add hover data to wikilinks\n    NewLinkCollectorPlugin(),  // Track inlinks/outlinks\n    NewTemplatesPlugin(),\n\n    // Collect stage\n    NewOverwriteCheckPlugin(), // Check for output path conflicts (early)\n    NewFeedsPlugin(),\n    NewAutoFeedsPlugin(),\n    NewPrevNextPlugin(),       // Calculate prev/next navigation\n\n    // Write stage\n    NewStaticAssetsPlugin(),   // Copy static assets first\n    NewChromaCSSPlugin(),      // Generate syntax highlighting CSS\n    NewPublishFeedsPlugin(),\n    NewPublishHTMLPlugin(),\n    NewSitemapPlugin(),\n    NewRedirectsPlugin(),      // Generate redirect pages\n}\n```\n\n---\n\n## Optional Plugins\n\nThe following plugins are not enabled by default and must be explicitly configured. They provide specialized functionality that may not be needed for all sites.\n\n### webmentions_fetch\n\n**Name:** `webmentions_fetch`  \n**Stage:** Transform  \n**Priority:** First (-200, runs before jinja_md)  \n**Purpose:** Fetches incoming webmentions from webmention.io and attaches them to posts.\n\n**Configuration (TOML):**\n```toml\n[markata-go.webmentions]\nenabled = true\nwebmention_io_token = \"your_token_here\"  # Or use WEBMENTION_IO_TOKEN env var\ncache_dir = \".cache/webmentions\"\ntimeout = \"30s\"\nuser_agent = \"markata-go/1.0 (WebMention)\"\n```\n\n**Behavior:**\n1. Reads cached webmentions from `{cache_dir}/received_mentions.json`\n2. Groups mentions by target URL\n3. For each post, matches webmentions to the post's URL (with various URL format normalizations)\n4. Attaches matched webmentions to `post.Extra[\"webmentions\"]`\n\n**Incremental builds:**\nWhen build cache is enabled, the plugin skips re-attaching webmentions if no posts are scheduled to rebuild.\n\n**Fetching webmentions:**\nThe plugin loads from cache during builds. To fetch fresh webmentions from webmention.io:\n\n```bash\nmarkata-go webmentions fetch\n```\n\nThis fetches all webmentions for your domain and saves them to the cache.\n\n**Post fields set (in `Extra`):**\n| Field | Type | Description |\n|-------|------|-------------|\n| `webmentions` | `[]ReceivedWebMention` | Array of webmentions for this post |\n\n**ReceivedWebMention structure:**\n```go\ntype ReceivedWebMention struct {\n    Source     string    // Source URL\n    Target     string    // Target URL (your post)\n    WMProperty string    // Type: \"like-of\", \"repost-of\", \"in-reply-to\", \"bookmark-of\", \"mention-of\"\n    Author     Author    // Author info (name, photo, url)\n    Content    Content   // Content (text, html)\n    Published  time.Time // When the mention was published\n}\n```\n\n**Template usage:**\n```html\n{% if post.Extra.webmentions %}\n\u003csection class=\"webmentions\"\u003e\n  {% set likes = post.Extra.webmentions|selectattr(\"WMProperty\", \"equalto\", \"like-of\")|list %}\n  {% set reposts = post.Extra.webmentions|selectattr(\"WMProperty\", \"equalto\", \"repost-of\")|list %}\n  {% set replies = post.Extra.webmentions|selectattr(\"WMProperty\", \"equalto\", \"in-reply-to\")|list %}\n\n  {% if likes %}\n  \u003cdiv class=\"likes\"\u003e\n    \u003ch4\u003e{{ likes|length }} Likes\u003c/h4\u003e\n    \u003cdiv class=\"facepile\"\u003e\n      {% for mention in likes %}\n      \u003ca href=\"{{ mention.Author.URL }}\" title=\"{{ mention.Author.Name }}\"\u003e\n        \u003cimg src=\"{{ mention.Author.Photo }}\" alt=\"{{ mention.Author.Name }}\"\u003e\n      \u003c/a\u003e\n      {% endfor %}\n    \u003c/div\u003e\n  \u003c/div\u003e\n  {% endif %}\n\u003c/section\u003e\n{% endif %}\n```\n\n**URL matching:**\nThe plugin tries multiple URL variants to match webmentions:\n- Exact URL match\n- With/without trailing slash\n- Legacy `/blog/` prefix (for migrated sites)\n- Double-slash normalization (common in webmention.io data)\n\n**Related:**\n- [[webmentions|WebMentions Guide]] - Complete webmentions documentation\n- [[#webmentions_leaderboard|webmentions_leaderboard]] - Engagement statistics\n\n---\n\n### webmentions_leaderboard\n\n**Name:** `webmentions_leaderboard`  \n**Stage:** Transform  \n**Priority:** -150 (after webmentions_fetch, before jinja_md)  \n**Purpose:** Calculates top posts by webmention engagement and provides leaderboard data for templates.\n\n**Configuration:** None required. Automatically processes webmentions attached by `webmentions_fetch`.\n\n**Behavior:**\n1. Iterates through all posts with webmentions\n2. Counts mentions by type (likes, reposts, replies, bookmarks, mentions)\n3. Creates sorted leaderboards (top 20 posts each)\n4. Stores results in `config.Extra[\"webmention_leaderboard\"]`\n\n**Config fields set (in `Extra`):**\n| Field | Type | Description |\n|-------|------|-------------|\n| `webmention_leaderboard` | `WebmentionLeaderboard` | Leaderboard data structure |\n\n**WebmentionLeaderboard structure:**\n```go\ntype WebmentionLeaderboard struct {\n    TopLiked      []LeaderboardEntry  // Top 20 by likes\n    TopReposted   []LeaderboardEntry  // Top 20 by reposts\n    TopReplied    []LeaderboardEntry  // Top 20 by replies\n    TopTotal      []LeaderboardEntry  // Top 20 by total engagement\n    TotalLikes    int                 // Site-wide total likes\n    TotalReposts  int                 // Site-wide total reposts\n    TotalReplies  int                 // Site-wide total replies\n    TotalMentions int                 // Site-wide total mentions\n}\n\ntype LeaderboardEntry struct {\n    Post      *Post   // Reference to the post\n    Href      string  // Post URL\n    Title     string  // Post title\n    Likes     int     // Number of likes\n    Reposts   int     // Number of reposts\n    Replies   int     // Number of replies\n    Bookmarks int     // Number of bookmarks\n    Mentions  int     // Number of mentions\n    Total     int     // Total engagement\n}\n```\n\n**Template usage (in Jinja-enabled pages):**\n```markdown\n---\ntitle: \"Analytics\"\njinja: true\n---\n\n## Webmention Leaderboard\n\n{% if config.Extra.webmention_leaderboard %}\n\n### Most Liked Posts\n\n| Likes | Post |\n|------:|------|\n{% for entry in config.Extra.webmention_leaderboard.TopLiked %}| {{ entry.Likes }} | [{{ entry.Title }}]({{ entry.Href }}) |\n{% endfor %}\n\n### Most Discussed Posts\n\n| Replies | Post |\n|--------:|------|\n{% for entry in config.Extra.webmention_leaderboard.TopReplied %}| {{ entry.Replies }} | [{{ entry.Title }}]({{ entry.Href }}) |\n{% endfor %}\n\n### Site Totals\n\n- **Total Likes:** {{ config.Extra.webmention_leaderboard.TotalLikes }}\n- **Total Reposts:** {{ config.Extra.webmention_leaderboard.TotalReposts }}\n- **Total Replies:** {{ config.Extra.webmention_leaderboard.TotalReplies }}\n\n{% endif %}\n```\n\n**Use cases:**\n- Analytics dashboards showing top-performing content\n- \"Popular posts\" widgets based on social engagement\n- Content performance tracking\n- Gamification/motivation for content creators\n\n**Related:**\n- [[webmentions|WebMentions Guide]] - Complete webmentions documentation\n- [[#webmentions_fetch|webmentions_fetch]] - Fetches webmentions\n\n---\n\n### mermaid\n\n**Name:** `mermaid`  \n**Stage:** Render (post_render)  \n**Purpose:** Converts Mermaid code blocks into rendered diagrams. Supports client-side rendering (default), CLI-based pre-rendering via mmdc, or headless Chromium pre-rendering.\n\n**Status:** Enabled by default. Set `enabled = false` to disable.\n\n**Configuration (TOML):**\n```toml\n[markata-go.mermaid]\nenabled = true                                              # Enabled by default; set to false to disable\nmode = \"client\"                                             # \"client\", \"cli\", or \"chromium\"\ncdn_url = \"/assets/vendor/mermaid/mermaid.min.js\"      # Mermaid URL (client mode, local by default)\ntheme = \"default\"                                           # Mermaid theme (default, dark, forest, neutral)\nuse_css_variables = true                                    # Derive diagram colors from site CSS palette (default: true)\nlightbox = true                                             # Click diagrams to open in lightbox with pan/zoom (default: true)\nlightbox_selector = \".glightbox-mermaid\"                    # CSS selector for lightbox links (default: \".glightbox-mermaid\")\n\n# CLI mode settings\n[markata-go.mermaid.cli]\nmmdc_path = \"\"                                              # Auto-detect if empty\nextra_args = \"\"                                             # Additional mmdc arguments\n\n# Chromium mode settings\n[markata-go.mermaid.chromium]\nbrowser_path = \"\"                                           # Auto-detect if empty\ntimeout = 30                                                # Seconds per diagram\nmax_concurrent = 4                                          # Parallel diagram renderers\nno_sandbox = false                                          # Required in containers (Docker, etc.)\n```\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `true` | Whether mermaid processing is active |\n| `mode` | string | `\"client\"` | Rendering mode: `client` (browser-side JS), `cli` (mmdc), or `chromium` (headless Chrome) |\n| `cdn_url` | string | `/assets/vendor/mermaid/mermaid.min.js` | Mermaid URL (client mode, local by default) |\n| `theme` | string | `\"default\"` | Mermaid theme: default, dark, forest, neutral. Ignored when `use_css_variables` is true. |\n| `use_css_variables` | bool | `true` | Use `--color-surface` for node fills and edge-label backgrounds, `--color-text` for labels, `--color-border` (falling back to `--color-primary`) for borders and edges, and `--color-background` for cluster fills. |\n| `lightbox` | bool | `true` | Enable click-to-zoom lightbox overlay with interactive pan and zoom via svg-pan-zoom. |\n| `lightbox_selector` | string | `\".glightbox-mermaid\"` | CSS selector for mermaid lightbox links. Retained for backward compatibility; the programmatic GLightbox API does not use it. |\n| `chromium.no_sandbox` | bool | `false` | Disable Chromium sandbox. Required when running inside Docker, Distrobox, or other containerized environments. |\n| `chromium.timeout` | int | `30` | Maximum seconds to wait for a single diagram to render. |\n| `chromium.max_concurrent` | int | `4` | Maximum number of diagrams to render in parallel. |\n\n**Behavior:**\n1. Finds code blocks with `language-mermaid` class in `ArticleHTML`\n2. In **client** mode: converts to `\u003cpre class=\"mermaid\"\u003e` blocks and injects Mermaid.js initialization script\n3. In **cli/chromium** modes: pre-renders diagrams to static SVGs embedded directly in HTML\n4. Only injects the script once per post (even with multiple diagrams)\n5. When `use_css_variables` is true, reads site CSS custom properties and passes them to `mermaid.initialize()` so diagrams match the site palette automatically\n6. Client mode retains each diagram's source and rerenders its SVG when the site theme, palette, or color mode changes. Chromium mode uses the same palette colors when it pre-renders SVGs. CLI mode follows Mermaid CLI theme and configuration.\n7. When `lightbox` is true, attaches click handlers to each rendered SVG. Clicking opens a programmatic GLightbox overlay with svg-pan-zoom for interactive pan and zoom. svg-pan-zoom (~29KB) is lazy-loaded from vendor assets by default.\n8. In chromium mode, the MermaidJS library is cached at `~/.cache/markata-go/mermaid/` to avoid re-downloading on each build\n9. In cli/chromium modes, rendered SVGs are cached in the build cache and reused when the diagram source and rendering inputs are unchanged\n\n**Markdown usage:**\n````markdown\n```mermaid\ngraph TD\n    A[Start] --\u003e B{Is it working?}\n    B --\u003e|Yes| C[Great!]\n    B --\u003e|No| D[Debug]\n    D --\u003e B\n```\n````\n\n**Supported diagram types:**\n- Flowcharts (`graph TD`, `graph LR`)\n- Sequence diagrams\n- Class diagrams\n- State diagrams\n- Entity Relationship diagrams\n- Gantt charts\n- Pie charts\n- Git graphs\n- And more (see [Mermaid docs](https://mermaid.js.org/))\n\n**HTML output:**\n```html\n\u003cpre class=\"mermaid\"\u003e\ngraph TD\n    A[Start] --\u003e B{Is it working?}\n    B --\u003e|Yes| C[Great!]\n    B --\u003e|No| D[Debug]\n    D --\u003e B\n\u003c/pre\u003e\n\n\u003cscript type=\"module\"\u003e\n  // Loads the vendored UMD bundle (/assets/vendor/mermaid/mermaid.min.js)\n  // and binds it to `mermaid`; ESM URLs are imported directly instead.\n  mermaid.initialize({ startOnLoad: false, theme: 'default' });\n  await mermaid.run();\n\u003c/script\u003e\n```\n\n`cdn_url` accepts either bundle style. URLs ending in `.mjs` (or containing\n`.esm.`) are loaded with an ES module `import`; anything else is loaded as a\nclassic script and read from `window.mermaid`. The default is the vendored,\nself-contained UMD build. The ESM build lazily fetches per-diagram chunks from\nthe same directory, so only point `cdn_url` at an `.mjs` file when the full\n`dist/` directory is served alongside it (for example a CDN URL).\n\nWhen `lightbox` is enabled, each rendered SVG also gets a click handler that opens a GLightbox overlay. The lightbox contains a toolbar with Fit / + / - controls and supports mouse wheel zoom and click-drag panning via svg-pan-zoom.\n\n#### Lightbox / Pan-Zoom for Diagrams\n\nWhen `lightbox = true` (the default), clicking any rendered mermaid diagram opens a full-screen overlay with interactive pan and zoom.\n\n**How it works:**\n- A separate GLightbox instance (`selector: false`) is created for mermaid diagrams to avoid conflicts with image lightbox\n- svg-pan-zoom v3.6.2 is lazy-loaded from CDN on first click (zero cost for pages without interaction)\n- GLightbox `draggable` is set to `false` to prevent conflict with svg-pan-zoom panning\n- On lightbox open, `requestAnimationFrame` is used to `resize()` + `fit()` + `center()` the diagram for reliable initial positioning\n\n**Interaction:**\n\n| Action | Result |\n|--------|--------|\n| Click diagram | Open lightbox with full-size diagram |\n| Mouse wheel / pinch | Zoom in / out |\n| Click + drag | Pan the diagram |\n| Fit button | Reset zoom to fit diagram in viewport |\n| + / - buttons | Zoom in / out incrementally |\n| Escape / click overlay | Close lightbox |\n\n**CSS classes:**\n\n| Class | Purpose |\n|-------|---------|\n| `.mermaid-lightbox-wrap` | Container inside lightbox (100% width, 90vh height, overflow hidden) |\n| `.mermaid-lightbox-toolbar` | Absolute-positioned button toolbar (top-right) |\n| `.mermaid-pz-btn` | Themed control buttons using `var(--color-surface)`, `var(--color-border)`, `var(--color-text)` |\n| `.svg-pan-zoom_viewport` | Added by svg-pan-zoom; styled with `cursor: grab` / `cursor: grabbing` |\n\n**GLightbox theming:**\n\nThe lightbox overlay is themed to match the site's dark palette. CSS overrides in `components.css` apply to:\n- `.goverlay` -- dark background overlay\n- `.ginlined-content` -- content container\n- Navigation buttons and description area\n\n**Performance:**\n- svg-pan-zoom JS (~29KB, BSD-2 license) is only loaded on first diagram click\n- GLightbox CSS/JS is loaded with the page (shared with image_zoom if enabled)\n- Pan-zoom instance is destroyed on lightbox close to prevent memory leaks\n\n---\n\n### tailwind\n\n**Name:** `tailwind`  \\\n**Stage:** Configure + Cleanup  \\\n**Purpose:** Runs the Tailwind standalone CLI during builds and optionally injects\ncompiled CSS or the Tailwind CDN JS script into your site.\n\n**Status:** Enabled by default (via `hooks = [\"default\"]`). Set `build = false` or\n`include = false` to disable parts of the behavior.\n\n**Configuration (TOML):**\n```toml\n[markata-go.tailwind]\ninclude = \"css\"                # \"css\", \"js\", or false (default: \"css\")\npreflight = false               # Enable Tailwind Preflight reset styles (default: false)\ninput = \"tailwind.css\"          # Input CSS (relative to assets_dir)\noutput = \"markata-tailwind.css\" # Output CSS (relative to assets_dir)\nconfig_file = \"\"                # Optional tailwind.config.js path\nbuild = true                     # Run Tailwind CLI during build\nminify = true                    # Pass --minify to Tailwind CLI\nauto_install = true              # Auto-download Tailwind CLI (default: true)\nversion = \"v3.4.19\"             # Managed Tailwind CLI version tag\ncache_dir = \"\"                  # Cache dir for Tailwind CLI\nbinary = \"\"                     # Optional path to tailwindcss binary\nextra_args = []                  # Optional extra CLI arguments\nverbose = false                  # Verbose installer/build logs\n```\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `include` | string \\| bool | `\"css\"` | Load the compiled CSS (`\"css\"`), inject the CDN JS (`\"js\"`), or disable auto-inclusion (`false`). |\n| `preflight` | bool | `false` | Enable Tailwind Preflight reset styles in markata-go's generated Tailwind config. |\n| `input` | string | `\"tailwind.css\"` | Tailwind input CSS (relative to `assets_dir`). |\n| `output` | string | `\"markata-tailwind.css\"` | Output CSS path (relative to `assets_dir`). |\n| `config_file` | string | `\"\"` | Optional path to `tailwind.config.js`. |\n| `build` | bool | `true` | Run Tailwind CLI during build. |\n| `minify` | bool | `true` | Add `--minify` to the Tailwind CLI. |\n| `auto_install` | bool | `true` | Use the managed Tailwind CLI download instead of relying on `PATH`. |\n| `version` | string | `\"v3.4.19\"` | Managed Tailwind CLI version tag. |\n| `cache_dir` | string | `\"\"` | Cache directory for the Tailwind CLI binary. |\n| `binary` | string | `\"\"` | Optional explicit `tailwindcss` binary path. |\n| `extra_args` | string[] | `[]` | Extra CLI arguments appended to the command. |\n| `verbose` | bool | `false` | Verbose install/build output. |\n\n**Behavior:**\n1. Injects Tailwind includes during Configure, then rebuilds CSS during Cleanup only when the effective utility manifest changes.\n2. Resolves `input`/`output` relative to `assets_dir` (absolute paths are respected).\n3. If `input` is missing, generates a default Tailwind entry CSS file automatically.\n4. If `extra_args` is empty and `config_file` is unset, generates a temporary Tailwind config from a cached token manifest derived from rendered HTML plus local JS/template sources, with `corePlugins.preflight` controlled by `tailwind.preflight`.\n5. `include = \"css\"` sets `theme.custom_css` to the output if it's empty.\n6. `include = \"js\"` injects the Tailwind CDN script and respects assets mode for vendoring.\n7. Fast mode skips Tailwind rebuilds when the compiled asset already exists.\n8. When `include = \"css\"` and CSS purge is disabled, a validation warning is emitted.\n\n**Notes:**\n- Tailwind CLI is downloaded with checksum verification (versioned per platform).\n- With default settings, markata-go prefers the managed Tailwind binary for consistency.\n- Preflight defaults to off in markata-go-managed configs so utility classes can be layered onto the built-in theme without resetting post typography.\n- If `auto_install = false`, the plugin uses `binary` or searches `PATH`.\n\n### Examples\n\n#### Flowchart - Build Process\n\nVisualize processes and decision trees with flowcharts:\n\n```mermaid\nflowchart TD\n    A[Start Build] --\u003e B{Config Found?}\n    B --\u003e|Yes| C[Load Configuration]\n    B --\u003e|No| D[Use Defaults]\n    C --\u003e E[Discover Content]\n    D --\u003e E\n    E --\u003e F[Parse Frontmatter]\n    F --\u003e G[Transform Content]\n    G --\u003e H[Render Markdown]\n    H --\u003e I[Apply Templates]\n    I --\u003e J[Write Output]\n    J --\u003e K[Generate Feeds]\n    K --\u003e L{Search Enabled?}\n    L --\u003e|Yes| M[Build Search Index]\n    L --\u003e|No| N[Complete]\n    M --\u003e N\n```\n\n#### Sequence Diagram - API Request Flow\n\nShow interactions between components over time:\n\n```mermaid\nsequenceDiagram\n    participant Browser\n    participant Server\n    participant Cache\n    participant Database\n\n    Browser-\u003e\u003eServer: GET /api/posts\n    Server-\u003e\u003eCache: Check cache\n    alt Cache hit\n        Cache--\u003e\u003eServer: Return cached data\n    else Cache miss\n        Server-\u003e\u003eDatabase: Query posts\n        Database--\u003e\u003eServer: Return posts\n        Server-\u003e\u003eCache: Store in cache\n    end\n    Server--\u003e\u003eBrowser: JSON response\n\n    Note over Browser,Server: Response includes ETag header\n\n    Browser-\u003e\u003eServer: GET /api/posts (with If-None-Match)\n    Server--\u003e\u003eBrowser: 304 Not Modified\n```\n\n#### Class Diagram - Plugin Architecture\n\nDocument code structure and relationships:\n\n```mermaid\nclassDiagram\n    class Plugin {\n        \u003c\u003cinterface\u003e\u003e\n        +Name() string\n    }\n\n    class ConfigurePlugin {\n        \u003c\u003cinterface\u003e\u003e\n        +Configure(m *Manager) error\n    }\n\n    class TransformPlugin {\n        \u003c\u003cinterface\u003e\u003e\n        +Transform(m *Manager) error\n    }\n\n    class RenderPlugin {\n        \u003c\u003cinterface\u003e\u003e\n        +Render(m *Manager) error\n    }\n\n    class Manager {\n        -config *Config\n        -posts []*Post\n        -plugins []Plugin\n        +RunStage(stage Stage) error\n        +Posts() []*Post\n        +ProcessPostsConcurrently(fn func) error\n    }\n\n    class Post {\n        +Path string\n        +Title *string\n        +Content string\n        +ArticleHTML string\n        +Slug string\n        +Tags []string\n    }\n\n    Plugin \u003c|-- ConfigurePlugin\n    Plugin \u003c|-- TransformPlugin\n    Plugin \u003c|-- RenderPlugin\n    Manager --\u003e Plugin : uses\n    Manager --\u003e Post : manages\n```\n\n#### State Diagram - Post Lifecycle\n\nShow state transitions for content:\n\n```mermaid\nstateDiagram-v2\n    [*] --\u003e Draft: Create post\n\n    Draft --\u003e Review: Submit for review\n    Draft --\u003e Draft: Edit\n\n    Review --\u003e Draft: Request changes\n    Review --\u003e Scheduled: Approve\n\n    Scheduled --\u003e Published: Publish date reached\n    Scheduled --\u003e Draft: Cancel\n\n    Published --\u003e Archived: Archive\n    Published --\u003e Published: Update\n\n    Archived --\u003e Published: Restore\n    Archived --\u003e [*]: Delete\n```\n\n#### Entity Relationship Diagram - Content Model\n\nDocument data relationships:\n\n```mermaid\nerDiagram\n    POST ||--o{ TAG : has\n    POST ||--o| AUTHOR : written_by\n    POST ||--o{ FEED : belongs_to\n    POST ||--o{ LINK : contains\n    FEED ||--o{ POST : contains\n    AUTHOR ||--o{ POST : writes\n\n    POST {\n        string slug PK\n        string title\n        string content\n        datetime date\n        boolean published\n    }\n\n    TAG {\n        string name PK\n        string slug\n    }\n\n    AUTHOR {\n        string id PK\n        string name\n        string email\n    }\n\n    FEED {\n        string slug PK\n        string title\n        string filter\n    }\n\n    LINK {\n        string source FK\n        string target\n        boolean internal\n    }\n```\n\n#### Gantt Chart - Project Timeline\n\nPlan and visualize project schedules:\n\n```mermaid\ngantt\n    title Site Redesign Project\n    dateFormat YYYY-MM-DD\n    section Planning\n        Requirements gathering    :a1, 2024-01-01, 7d\n        Design mockups           :a2, after a1, 10d\n        Technical planning       :a3, after a1, 5d\n    section Development\n        Theme development        :b1, after a2, 14d\n        Plugin customization     :b2, after a3, 10d\n        Content migration        :b3, after b1, 7d\n    section Testing\n        QA testing              :c1, after b3, 5d\n        Performance testing     :c2, after c1, 3d\n    section Launch\n        Soft launch             :milestone, after c2, 0d\n        Full launch             :d1, after c2, 2d\n```\n\n#### Git Graph - Branch History\n\nVisualize git workflows:\n\n```mermaid\ngitGraph\n    commit id: \"Initial commit\"\n    commit id: \"Add base theme\"\n    branch feature/blog\n    checkout feature/blog\n    commit id: \"Add blog layout\"\n    commit id: \"Add post template\"\n    checkout main\n    branch feature/search\n    checkout feature/search\n    commit id: \"Add Pagefind\"\n    checkout main\n    merge feature/blog id: \"Merge blog feature\"\n    checkout feature/search\n    commit id: \"Style search UI\"\n    checkout main\n    merge feature/search id: \"Merge search\"\n    commit id: \"v1.0.0 release\" tag: \"v1.0.0\"\n```\n\n---\n\n### webawesome\n\n**Name:** `webawesome`  \n**Stage:** Configure (register shared vendor asset) + Render (after render_markdown)  \n**Purpose:** Converts Web Awesome Markdown containers into custom elements and loads Web Awesome assets when needed.\n\n**Status:** Built-in. Add `webawesome` to `hooks` to use it explicitly.\n\n**Configuration (TOML):**\n```toml\n[markata-go]\nhooks = [\"default\", \"webawesome\"]\n\n[markata-go.webawesome]\nenabled = true\nsource = \"vendor\" # \"vendor\" (default) or \"cdn\"\nversion = \"3.5.0\"\ntheme = \"default\"\npalette = \"default\"\nbrand = \"blue\"\n```\n\nWhen `source = \"vendor\"`, the plugin downloads Web Awesome through the shared `[markata-go.assets]` vendor pipeline and serves it from `/assets/vendor/webawesome/...`.\n\n**Markdown syntax:**\n```markdown\n::: wa-comparison {position=42 caption=\"Before and after\"}\n![Before](/images/before.webp)\n![After](/images/after.webp)\n:::\n```\n\nThe longer `::: webawesome comparison` alias is also supported. Web Awesome classes can be combined with other container classes; detection treats `wa-*` or `webawesome \u003ccomponent\u003e` as class tokens rather than requiring them to appear first.\n\nSee the [[webawesome-components|Web Awesome Components]] guide for demos and self-hosting details.\n\n---\n\n### glossary\n\n**Name:** `glossary`  \n**Stage:** Render (post_render) + Write  \n**Purpose:** Automatically links glossary terms in post content and exports a glossary JSON file.\n\n**Status:** Enabled by default. Set `enabled = false` to disable.\n\n**Configuration (TOML):**\n```toml\n[markata-go.glossary]\nenabled = true              # Enabled by default; set to false to disable\nlink_class = \"glossary-term\"  # CSS class for glossary links (default)\ncase_sensitive = false      # Case-sensitive term matching (default: false)\ntooltip = true              # Show the definition in a hover card (default: true)\nmax_links_per_term = 1      # Max times to link each term (0 = all, default: 1)\nexclude_tags = [\"glossary\"] # Tags to exclude from linking (default: [\"glossary\"])\nexport_json = true          # Export glossary.json file (default: true)\nglossary_path = \"glossary\"  # Path prefix for glossary posts (default)\ntemplate_key = \"glossary\"   # Frontmatter key to identify glossary posts (default)\n```\n\n**Glossary post format:**\nCreate posts in the `glossary/` directory (or set `glossary_path`):\n\n```yaml\n---\ntitle: \"API\"\ndescription: \"Application Programming Interface - a set of protocols for building software\"\ntemplateKey: glossary\naliases:\n  - \"APIs\"\n  - \"Application Programming Interface\"\n---\n\nAn **API** (Application Programming Interface) is a set of protocols,\nroutines, and tools for building software applications...\n```\n\n**Behavior:**\n1. Scans posts to identify glossary definitions (by path or `templateKey`)\n2. Builds a lookup table of terms and aliases\n3. In non-glossary posts, finds term occurrences and wraps them in links\n4. Protects content inside `\u003ca\u003e`, `\u003ccode\u003e`, and `\u003cpre\u003e` tags from linking\n5. Respects `max_links_per_term` to avoid over-linking\n6. Exports `glossary.json` to the output directory\n\nLonger terms are matched first. Equal-length terms and aliases are matched in\nlexical order (after case normalization), so aliases sharing a link limit select\nthe same occurrence on every build. Updating from the older unordered behavior\nrefreshes glossary results once; it does not require deleting your caches.\nNested protected content, such as a link inside a code block, is preserved\nwithout leaking internal placeholder markers into pages or feeds.\n\n**HTML output:**\n```html\n\u003c!-- Before --\u003e\n\u003cp\u003eYou can use the API to fetch data.\u003c/p\u003e\n\n\u003c!-- After --\u003e\n\u003cp\u003eYou can use the \u003ca href=\"/glossary/api/\" class=\"glossary-term\" title=\"Application Programming Interface - a set of protocols for building software\"\u003eAPI\u003c/a\u003e to fetch data.\u003c/p\u003e\n```\n\n**Exported glossary.json:**\n```json\n{\n  \"terms\": [\n    {\n      \"term\": \"API\",\n      \"slug\": \"api\",\n      \"description\": \"Application Programming Interface - a set of protocols for building software\",\n      \"aliases\": [\"APIs\", \"Application Programming Interface\"],\n      \"href\": \"/glossary/api/\"\n    }\n  ]\n}\n```\n\n**CSS styling:**\n```css\n.glossary-term {\n    text-decoration: underline dotted;\n    text-underline-offset: 2px;\n    cursor: help;\n}\n.glossary-term:hover {\n    text-decoration: underline solid;\n}\n```\n\n---\n\n### csv_fence\n\n**Name:** `csv_fence`  \n**Stage:** Render (post_render)  \n**Purpose:** Converts CSV code blocks into HTML tables for easy data display.\n\n**Status:** Enabled by default. Set `enabled = false` to disable.\n\n**Configuration (TOML):**\n```toml\n[markata-go.csv_fence]\nenabled = true          # Enabled by default; set to false to disable\ntable_class = \"csv-table\"  # CSS class for generated tables (default)\nhas_header = true       # Treat first row as header (default: true)\ndelimiter = \",\"         # CSV field delimiter (default: \",\")\n```\n\n**Markdown usage:**\n````markdown\n```csv\nName,Age,City\nAlice,30,New York\nBob,25,Los Angeles\nCharlie,35,Chicago\n```\n````\n\n**Per-block options:**\nYou can override global settings per code block:\n\n````markdown\n```csv delimiter=\";\" has_header=\"false\" table_class=\"data-table\"\nAlice;30;New York\nBob;25;Los Angeles\n```\n````\n\n**Behavior:**\n1. Finds code blocks with `language-csv` class in `ArticleHTML`\n2. Parses the CSV content with the configured delimiter\n3. Generates an HTML table with `\u003cthead\u003e` (if `has_header`) and `\u003ctbody\u003e`\n4. Properly escapes all cell content for HTML safety\n\n**HTML output:**\n```html\n\u003ctable class=\"csv-table\"\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003eName\u003c/th\u003e\n      \u003cth\u003eAge\u003c/th\u003e\n      \u003cth\u003eCity\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eAlice\u003c/td\u003e\n      \u003ctd\u003e30\u003c/td\u003e\n      \u003ctd\u003eNew York\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eBob\u003c/td\u003e\n      \u003ctd\u003e25\u003c/td\u003e\n      \u003ctd\u003eLos Angeles\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eCharlie\u003c/td\u003e\n      \u003ctd\u003e35\u003c/td\u003e\n      \u003ctd\u003eChicago\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n```\n\n**CSS styling:**\n```css\n.csv-table {\n    border-collapse: collapse;\n    width: 100%;\n    margin: 1rem 0;\n}\n.csv-table th,\n.csv-table td {\n    border: 1px solid #ddd;\n    padding: 0.5rem;\n    text-align: left;\n}\n.csv-table th {\n    background: #f5f5f5;\n    font-weight: bold;\n}\n.csv-table tr:nth-child(even) {\n    background: #fafafa;\n}\n```\n\n**Markdown usage:**\n````markdown\n```csv\nName,Age,City\nAlice,30,New York\nBob,25,Los Angeles\nCharlie,35,Chicago\n```\n````\n\n**Per-block options:**\nYou can override global settings per code block:\n\n````markdown\n```csv delimiter=\";\" has_header=\"false\" table_class=\"data-table\"\nAlice;30;New York\nBob;25;Los Angeles\n```\n````\n\n**Behavior:**\n1. Finds code blocks with `language-csv` class in `ArticleHTML`\n2. Parses the CSV content with the configured delimiter\n3. Generates an HTML table with `\u003cthead\u003e` (if `has_header`) and `\u003ctbody\u003e`\n4. Properly escapes all cell content for HTML safety\n\n**HTML output:**\n```html\n\u003ctable class=\"csv-table\"\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003eName\u003c/th\u003e\n      \u003cth\u003eAge\u003c/th\u003e\n      \u003cth\u003eCity\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eAlice\u003c/td\u003e\n      \u003ctd\u003e30\u003c/td\u003e\n      \u003ctd\u003eNew York\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eBob\u003c/td\u003e\n      \u003ctd\u003e25\u003c/td\u003e\n      \u003ctd\u003eLos Angeles\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eCharlie\u003c/td\u003e\n      \u003ctd\u003e35\u003c/td\u003e\n      \u003ctd\u003eChicago\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n```\n\n**CSS styling:**\n```css\n.csv-table {\n    border-collapse: collapse;\n    width: 100%;\n    margin: 1rem 0;\n}\n.csv-table th,\n.csv-table td {\n    border: 1px solid #ddd;\n    padding: 0.5rem;\n    text-align: left;\n}\n.csv-table th {\n    background: #f5f5f5;\n    font-weight: bold;\n}\n.csv-table tr:nth-child(even) {\n    background: #fafafa;\n}\n```\n\n**Enabling the plugin:**\n```go\nplugins := append(plugins.DefaultPlugins(), plugins.NewCSVFencePlugin())\n```\n\nOr by name:\n```go\npluginList, _ := plugins.PluginsByNames([]string{\n    // ... default plugins ...\n    \"csv_fence\",\n})\n```\n\n---\n\n## Cleanup Stage\n\n### pagefind\n\n**Name:** `pagefind`  \n**Stage:** Cleanup  \n**Priority:** Last (runs after all files are written)  \n**Purpose:** Generates a full-text search index using [Pagefind](https://pagefind.app/) after the site is built.\n\n**Configuration (TOML):**\n```toml\n[search]\nenabled = true              # Enable/disable search (default: true)\nposition = \"navbar\"         # Search UI position: navbar, sidebar, footer, custom\nplaceholder = \"Search...\"   # Search input placeholder text\nshow_images = true          # Show thumbnails in results (default: true)\nexcerpt_length = 200        # Characters for result excerpts (default: 200)\n\n[search.pagefind]\nbundle_dir = \"_pagefind\"    # Output directory for search index (default)\nroot_selector = \"\"          # CSS selector for searchable content (optional)\nexclude_selectors = []      # CSS selectors to exclude from indexing\n```\n\n**Options:**\n| Option | Default | Description |\n|--------|---------|-------------|\n| `enabled` | `true` | Enable/disable search functionality |\n| `position` | `\"navbar\"` | Where to show search UI |\n| `placeholder` | `\"Search...\"` | Search input placeholder |\n| `show_images` | `true` | Show thumbnails in results |\n| `excerpt_length` | `200` | Characters for result excerpts |\n| `pagefind.bundle_dir` | `\"_pagefind\"` | Output directory for index |\n| `pagefind.root_selector` | `\"\"` | CSS selector for searchable content |\n| `pagefind.exclude_selectors` | `[]` | Elements to exclude from indexing |\n\n**Requirements:**\n- Pagefind CLI must be installed (standalone binary from [GitHub releases](https://github.com/Pagefind/pagefind/releases), or via `auto_install = true` in config)\n- If not installed, the plugin logs a warning but does not fail the build\n\n**Behavior:**\n1. Runs in Cleanup stage with `PriorityLast` (after all HTML files are written)\n2. Checks if search is enabled in configuration\n3. Checks if `pagefind` CLI is available in PATH\n4. Hashes the searchable corpus and skips Pagefind when indexed content is unchanged\n5. Executes `pagefind --site {output_dir}` with configured options when a refresh is needed\n6. Generates search index in `{output_dir}/_pagefind/`\n\n**Generated files:**\n```\noutput/\n  _pagefind/\n    pagefind.js           # Main search library\n    pagefind-ui.js        # UI component\n    pagefind-ui.css       # UI styles\n    pagefind.*.pf_index   # Index chunks\n    pagefind.*.pf_meta    # Metadata chunks\n```\n\n**Template integration:**\n\nThe default post template includes `data-pagefind-*` attributes for indexing:\n\n```html\n\u003carticle data-pagefind-body\u003e\n    \u003ch1 data-pagefind-meta=\"title\"\u003e{{ post.title }}\u003c/h1\u003e\n    \u003cp data-pagefind-meta=\"excerpt\"\u003e{{ post.description }}\u003c/p\u003e\n\n    {% for tag in post.tags %}\n    \u003cspan data-pagefind-filter=\"tag\" style=\"display:none\"\u003e{{ tag }}\u003c/span\u003e\n    {% endfor %}\n\n    \u003cdiv class=\"content\"\u003e{{ body | safe }}\u003c/div\u003e\n\u003c/article\u003e\n```\n\n**Search UI component:**\n\nThe base template includes the search component:\n\n```html\n{% if config.search.enabled %}\n{% include \"components/search.html\" %}\n{% endif %}\n```\n\n**Disabling search:**\n```toml\n[search]\nenabled = false\n```\n\n**Graceful degradation:**\n- If Pagefind is not installed, search UI is hidden\n- If search is disabled, no index is generated\n- Site functions normally without search functionality\n\n**Lazy loading:**\nPagefind CSS and JS are loaded on user interaction (hover on search, press `/`, press `Ctrl+K`) rather than eagerly on page load. This saves ~30-50KB on initial page load for pages where search is not used.\n\nSee [[search|Search Guide]] for detailed usage and customization.\n\n---\n\n### diagnostics_artifact\n\n**Name:** `diagnostics_artifact`\n**Stage:** Cleanup\n**Priority:** `PriorityLast + 100`\n**Purpose:** Persists the manager-owned content diagnostics snapshot for a\nsuccessful full build.\n\nThis plugin is enabled by default and has no configuration entry. It writes:\n\n```text\n\u003coutput_dir\u003e/.markata/diagnostics.json\n```\n\nThe versioned JSON contains summary counts, per-source dispositions, stable\nreason codes, diagnostics, feed-level selection details, and build identity\nmetadata. It contains no raw content, frontmatter, rendered HTML, secrets, or\nabsolute paths. Failed, dry-run, fast, incremental, and incomplete builds do not\npublish a new artifact. See the [Content Diagnostics guide](/docs/guides/content-diagnostics/)\nfor the wire format and privacy contract.\n\n---\n\n### css_minify\n\n**Name:** `css_minify`\n**Stage:** Write (PriorityLast)\n**Purpose:** Minifies all CSS files in the output directory to reduce file sizes and improve performance scores.\n\n**Configuration (TOML):**\n```toml\n[markata-go.css_minify]\nenabled = true                      # Enable CSS minification (default: true)\nexclude = [\"variables.css\"]         # Files to skip (exact names or glob patterns)\npreserve_comments = [\"Copyright\"]   # Strings that mark comments to preserve\n```\n\n**Options:**\n| Option | Default | Description |\n|--------|---------|-------------|\n| `enabled` | `true` | Enable/disable CSS minification |\n| `exclude` | `[]` | File patterns to skip (supports `*`, `?`, `[` glob syntax) |\n| `preserve_comments` | `[]` | Substrings identifying comments to keep in output |\n\n**Behavior:**\n1. Runs with `PriorityLast` in Write stage (after all CSS-generating plugins: `palette_css`, `chroma_css`, `css_bundle`)\n2. Walks the output directory recursively for `.css` files\n3. Skips files matching exclusion patterns (exact match or glob)\n4. Extracts comments containing `preserve_comments` substrings\n5. Minifies content using `tdewolff/minify/v2` CSS minifier\n6. Prepends preserved comments to minified output\n7. Writes minified content back to the same file\n8. Reuses verified exact-input persistent results and logs transformed/restored/excluded/failed counts and transformed size reduction\n\n**Example output:**\n```\n[css_minify] Completed: 8 transformed, 0 restored, 1 excluded, 0 failed\n[css_minify] Size reduction: 45230 -\u003e 28940 bytes (36.0% smaller)\n```\n\n**Related plugins:**\n- [[#palette_css|palette_css]] - Generates palette CSS (minified by this plugin)\n- [[#chroma_css|chroma_css]] - Generates syntax highlighting CSS (minified by this plugin)\n- [[#js_minify|js_minify]] - Companion JS minification plugin\n\n---\n\n### js_minify\n\n**Name:** `js_minify`\n**Stage:** Write (PriorityLast)\n**Purpose:** Minifies all JavaScript files in the output directory to reduce file sizes and improve performance scores.\n\n**Configuration (TOML):**\n```toml\n[markata-go.js_minify]\nenabled = true                      # Enable JS minification (default: true)\nexclude = [\"pagefind-ui.js\"]        # Files to skip (exact names or glob patterns)\n```\n\n**Options:**\n| Option | Default | Description |\n|--------|---------|-------------|\n| `enabled` | `true` | Enable/disable JS minification |\n| `exclude` | `[]` | File patterns to skip (supports `*`, `?`, `[` glob syntax) |\n\n**Behavior:**\n1. Runs with `PriorityLast` in Write stage (after all JS-generating plugins)\n2. Walks the output directory recursively for `.js` files\n3. Automatically skips `.min.js` files (already minified)\n4. Skips files matching exclusion patterns (exact match or glob)\n5. Minifies content using `tdewolff/minify/v2` JS minifier\n6. Writes minified content back to the same file\n7. Reuses verified exact-input persistent results and logs transformed/restored/excluded/failed counts and transformed size reduction\n\n**Example output:**\n```\n[js_minify] Completed: 12 transformed, 0 restored, 2 excluded, 0 failed\n[js_minify] Size reduction: 145337 -\u003e 72100 bytes (50.4% smaller)\n```\n\n**Typical reduction by file:**\n| File | Original | Minified | Reduction |\n|------|----------|----------|-----------|\n| `view-transitions.js` | 13.3KB | ~6.5KB | ~51% |\n| `conditional-css.js` | ~3KB | ~1.5KB | ~50% |\n| `copy-code.js` | ~2KB | ~1KB | ~50% |\n\n**Related plugins:**\n- [[#css_minify|css_minify]] - Companion CSS minification plugin\n\nBoth minifiers store private per-asset exact-input records and verified result blobs\noutside published output, under `\u003ccontent_dir\u003e/.markata/asset-minify/v1/` or the\nnonempty top-level `cache_dir` override. Only an exact current-input digest and\nmatching recipe authorize result reuse; the source hash names exact transform\ninput, not original author source. Hits atomically publish verified results with\nmode `0644` even when bytes already match, except empty JavaScript.\nThere is no processed-output shortcut: important CSS comments can make the\ntransform non-idempotent. Recopied exact inputs restore verified results without\ninvoking the engine, but retained output may need fresh transformations.\nRecipe changes include CSS comment options and maintained engine/wrapper\nidentities and always transform current stage-input bytes, never an older source\nsnapshot selected by a processed-output or retry digest. Previously stripped\ncomments need regeneration from authoritative source. Cache and transform\nfailures are explicit warnings, not fatal build\nerrors. Fast mode, disabled plugins, exclusions, and `_pagefind` retain their\nexisting behavior. Legacy sidecars are not trusted or removed; perform a\nsource-regenerating rebuild after upgrading. See the\n[performance guide](../guides/performance.md#persistent-css-and-javascript-minification)\nfor privacy, recovery limits, and measurement details.\n\n---\n\n## Disabling Plugins\n\nTo use only specific plugins, configure them explicitly:\n\n```go\nimport \"github.com/example/markata-go/pkg/plugins\"\n\n// Minimal set for basic builds\nminimalPlugins := plugins.MinimalPlugins()\n\n// Or pick specific plugins\ncustomPlugins := []lifecycle.Plugin{\n    plugins.NewGlobPlugin(),\n    plugins.NewLoadPlugin(),\n    plugins.NewRenderMarkdownPlugin(),\n    plugins.NewPublishHTMLPlugin(),\n}\n```\n\nOr use plugin names:\n\n```go\npluginList, warnings := plugins.PluginsByNames([]string{\n    \"glob\",\n    \"load\",\n    \"render_markdown\",\n    \"publish_html\",\n})\n```\n\n---\n\n## Creating Custom Plugins\n\nImplement the `lifecycle.Plugin` interface and optionally stage-specific interfaces:\n\n```go\ntype MyPlugin struct{}\n\nfunc (p *MyPlugin) Name() string {\n    return \"my_plugin\"\n}\n\n// Implement stage interfaces as needed:\n// - lifecycle.ConfigurePlugin\n// - lifecycle.GlobPlugin\n// - lifecycle.LoadPlugin\n// - lifecycle.TransformPlugin\n// - lifecycle.RenderPlugin\n// - lifecycle.CollectPlugin\n// - lifecycle.WritePlugin\n// - lifecycle.CleanupPlugin\n\nfunc (p *MyPlugin) Transform(m *lifecycle.Manager) error {\n    return m.ProcessPostsConcurrently(func(post *models.Post) error {\n        // Process each post\n        post.Set(\"my_field\", \"my_value\")\n        return nil\n    })\n}\n```\n\nRegister your plugin:\n\n```go\nplugins.RegisterPluginConstructor(\"my_plugin\", func() lifecycle.Plugin {\n    return \u0026MyPlugin{}\n})\n```\n\nSee [[plugin-development|Plugin Development Guide]] for complete instructions.\n",
      "summary": "Reference documentation for built-in markata-go plugins organized by lifecycle stage",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "reference",
        "plugins"
      ]
    },
    {
      "id": "https://markata.dev/docs/reference/cli/",
      "url": "https://markata.dev/docs/reference/cli/",
      "title": "CLI Reference",
      "content_html": "\u003cp\u003emarkata-go provides a command-line interface for building, serving, and managing your static site.\u003c/p\u003e\n\u003ch2 id=\"overview\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOverview\u003c/span\u003e \u003ca href=\"#overview\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe markata-go CLI follows a subcommand pattern similar to tools like \u003ccode\u003egit\u003c/code\u003e and \u003ccode\u003edocker\u003c/code\u003e. Each command has its own set of flags, with some global flags available across all commands.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go \u003cspan class=\"o\"\u003e[\u003c/span\u003eglobal flags\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u0026lt;command\u0026gt; \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003ecommand\u003c/span\u003e flags\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003earguments\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe common short forms are \u003ccode\u003eb\u003c/code\u003e for \u003ccode\u003ebuild\u003c/code\u003e, \u003ccode\u003es\u003c/code\u003e and \u003ccode\u003eserv\u003c/code\u003e for \u003ccode\u003eserve\u003c/code\u003e, \u003ccode\u003ea\u003c/code\u003e for\n\u003ccode\u003eadmin\u003c/code\u003e, and \u003ccode\u003els\u003c/code\u003e for \u003ccode\u003elist\u003c/code\u003e. For example, \u003ccode\u003emarkata-go s --bind 0.0.0.0\u003c/code\u003e starts the development\nserver on every network interface. \u003ccode\u003e--bind\u003c/code\u003e and \u003ccode\u003e--host\u003c/code\u003e select the same\nlistening address; if both are set, their values must agree.\nThe semantic names \u003ccode\u003edev\u003c/code\u003e and \u003ccode\u003epreview\u003c/code\u003e suggest \u003ccode\u003eserve\u003c/code\u003e but do not execute it.\u003c/p\u003e\n\u003cp\u003eIf a command, flag, or config key is misspelled, markata-go suggests close\nmatches and shows the exact help command to run. A clear alias executes; a\nsemantic synonym or typo only suggests. Suggestions are advisory: the\nCLI never executes or writes a guessed name. For example:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eError: unknown flag: --hst\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDid you mean:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --host\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eNext: Run \u0026#39;markata-go serve --help\u0026#39; to see valid flags.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUnknown command names exit with status \u003ccode\u003e2\u003c/code\u003e. The direct file shortcut accepts\nMarkdown paths such as \u003ccode\u003emarkata-go post.md\u003c/code\u003e; other unknown names produce an\nerror. Errors use color when \u003ccode\u003estderr\u003c/code\u003e is a terminal, and plain text when it is\nredirected or \u003ccode\u003e--no-color\u003c/code\u003e is set.\u003c/p\u003e\n\u003cp\u003eFor a one-file preview, pass a Markdown file directly. The file is rendered\nwith the default theme and published at the site root (\u003ccode\u003e\u0026lt;output\u0026gt;/index.html\u003c/code\u003e),\nalong with the theme\u0026rsquo;s CSS, JS, and fonts. Site-wide output is skipped: feeds,\nthe archive, tag/feed listings, sitemaps, \u003ccode\u003e.well-known\u003c/code\u003e files, the image\nlibrary, 404 page, and the Pagefind search index (search UI is hidden). The\nbuild cache is not used, so a single-file build never touches the full-site\ncache:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go pages/sample.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# equivalent:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build pages/sample.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# live preview of just that file, rebuilt on every change:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve pages/sample.md\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"agent-assisted-troubleshooting-triage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAgent-assisted troubleshooting: \u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003etriage\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#agent-assisted-troubleshooting-triage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003emarkata triage\u003c/code\u003e collects a small, privacy-conscious diagnostic summary and passes a troubleshooting prompt to an interactive coding agent, clipboard, or stdout. The default is a fuzzy picker of \u003cstrong\u003edetected installed\u003c/strong\u003e coding agents plus clipboard and stdout. When either terminal stream is redirected or \u003ccode\u003e--no-input\u003c/code\u003e is used, it prints \u003cstrong\u003eonly the Markdown prompt\u003c/strong\u003e to stdout.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata triage\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata triage --to opencode\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata triage --agent claude\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata triage --issue \u003cspan class=\"s2\"\u003e\u0026#34;My posts aren\u0026#39;t appearing\u0026#34;\u003c/span\u003e --to clipboard\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata triage --to stdout \u003cspan class=\"p\"\u003e|\u003c/span\u003e codex \u003cspan class=\"nb\"\u003eexec\u003c/span\u003e -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata triage --to stdout \u0026gt; triage-prompt.md\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--to\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eauto\u003c/code\u003e, \u003ccode\u003estdout\u003c/code\u003e, \u003ccode\u003eclipboard\u003c/code\u003e, \u003ccode\u003eopencode\u003c/code\u003e, \u003ccode\u003eclaude\u003c/code\u003e, \u003ccode\u003ecodex\u003c/code\u003e, \u003ccode\u003egemini\u003c/code\u003e, or \u003ccode\u003ecursor\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eauto\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--agent\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConvenience alias for an installed agent name; cannot be combined with \u003ccode\u003e--to\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003enone\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--issue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOptional brief user-provided problem description (up to 4000 bytes)\u003c/td\u003e\n\u003ctd\u003enone\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eOnly supported agent executables found on PATH are offered. An explicit agent launch needs a terminal so the agent can ask follow-up questions. For pipelines use stdout and the selected agent\u0026rsquo;s own noninteractive mode. Clipboard uses local platform helpers and fails clearly if unavailable. No agent is launched automatically in a noninteractive session.\u003c/p\u003e\n\u003cp\u003eThe prompt contains the \u003cstrong\u003erunning CLI\u003c/strong\u003e version, not necessarily the version where the bug occurred, plus OS, architecture, runtime, executable/install hints, project path and \u003cstrong\u003econfig filenames only\u003c/strong\u003e. It never reads config values, logs, full environment values or secrets. Review local paths before sharing a prompt. The agent should first clarify the user\u0026rsquo;s issue, confirm the actual affected version/deployment and ask before applying changes.\u003c/p\u003e\n\u003cp\u003eFor examples and privacy details, see \u003ca href=\"../guides/triage.md\"\u003eTriage a Markata problem\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"global-flags\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGlobal Flags\u003c/span\u003e \u003ca href=\"#global-flags\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThese flags are available for all commands:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eShort\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--config\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e-c\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePath to configuration file\u003c/td\u003e\n\u003ctd\u003eAuto-discovered\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--site-dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eSite directory for all site operations\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_SITE_DIR\u003c/code\u003e or current directory\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--merge-config\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e-m\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAdditional config file(s) to merge (can be used multiple times)\u003c/td\u003e\n\u003ctd\u003eNone\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--output\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e-o\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOutput directory (overrides config)\u003c/td\u003e\n\u003ctd\u003eFrom config (\u003ccode\u003eoutput\u003c/code\u003e built-in default)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--quiet\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e-q\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSuppress non-essential progress and status output\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--verbose\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e-v\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable verbose output\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--color\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eForce ANSI color output\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--no-color\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eDisable ANSI color on all streams\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--log-format\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eLog formatting: \u003ccode\u003eauto\u003c/code\u003e, \u003ccode\u003eplain\u003c/code\u003e, or \u003ccode\u003erich\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eauto\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--no-input\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eDisable prompts and interactive UI\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"config-file-discovery\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfig File Discovery\u003c/span\u003e \u003ca href=\"#config-file-discovery\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen \u003ccode\u003e--config\u003c/code\u003e is not specified, markata-go searches for configuration files in the following order:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go.toml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go.yaml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go.yml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go.json\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e~/.config/markata-go/config.toml\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eIf none is found, commands that load the full site configuration continue with\nbuilt-in defaults plus \u003ccode\u003eMARKATA_GO_*\u003c/code\u003e environment overrides. Commands that edit\nor read a value directly from a config file, such as \u003ccode\u003econfig get\u003c/code\u003e and\n\u003ccode\u003econfig set\u003c/code\u003e, require a config file.\u003c/p\u003e\n\u003cp\u003eSee [[configuration-guide|Configuration]] for details on configuration options.\u003c/p\u003e\n\u003ch3 id=\"site-directory\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSite Directory\u003c/span\u003e \u003ca href=\"#site-directory\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse \u003ccode\u003e--site-dir\u003c/code\u003e to run a command against a site from any directory. Set\n\u003ccode\u003eMARKATA_GO_SITE_DIR\u003c/code\u003e to use the same site in a shell alias or wrapper. The flag\ntakes precedence over the environment variable, which takes precedence over the\ncurrent directory.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ealias\u003c/span\u003e \u003cspan class=\"nv\"\u003eblog\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;markata-go --site-dir \u0026#34;$HOME/sites/blog\u0026#34;\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ealias\u003c/span\u003e work-notes\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;markata-go --site-dir \u0026#34;$HOME/notes/work\u0026#34;\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eblog search \u003cspan class=\"s2\"\u003e\u0026#34;release process\u0026#34;\u003c/span\u003e --format path\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ework-notes new \u003cspan class=\"s2\"\u003e\u0026#34;Weekly review\u0026#34;\u003c/span\u003e --template note --no-input\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe selected directory must exist. Configuration discovery, relative\n\u003ccode\u003e--config\u003c/code\u003e and \u003ccode\u003e--merge-config\u003c/code\u003e paths, content templates, linting, and caches\nall resolve from that directory. \u003ccode\u003elist\u003c/code\u003e and \u003ccode\u003esearch\u003c/code\u003e print absolute Markdown\nsource paths when a site directory is explicit, so their results can be edited\ndirectly.\u003c/p\u003e\n\u003ch3 id=\"cli-ux-conventions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCLI UX Conventions\u003c/span\u003e \u003ca href=\"#cli-ux-conventions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go follows a few shared CLI rules:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eprimary command results are written to \u003ccode\u003estdout\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ewarnings, progress, prompts, and errors are written to \u003ccode\u003estderr\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003einteractive terminal output uses color by default when the target stream is a TTY\u003c/li\u003e\n\u003cli\u003eoperational logs use centralized formatting; \u003ccode\u003e--log-format auto\u003c/code\u003e chooses rich logs for TTYs and plain logs otherwise\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--color\u003c/code\u003e and \u003ccode\u003eFORCE_COLOR\u003c/code\u003e force ANSI color output, while \u003ccode\u003e--no-color\u003c/code\u003e disables it everywhere\u003c/li\u003e\n\u003cli\u003erich logs can use structured metadata such as lifecycle phase, and builds/serve runs can tint log colors from the configured site palette\u003c/li\u003e\n\u003cli\u003ecolor is enabled by default for interactive terminal streams and disabled for\nredirected streams; \u003ccode\u003eNO_COLOR\u003c/code\u003e (any non-empty value) and \u003ccode\u003eTERM=dumb\u003c/code\u003e disable\nautomatic color\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--color\u003c/code\u003e or \u003ccode\u003eFORCE_COLOR\u003c/code\u003e overrides automatic detection; \u003ccode\u003e--no-color\u003c/code\u003e and\n\u003ccode\u003e--log-format plain\u003c/code\u003e always disable color\u003c/li\u003e\n\u003cli\u003eterminal logs, help, prompts, and TUIs use the configured site palette when\navailable, with one shared CLI theme as the fallback\u003c/li\u003e\n\u003cli\u003einteractive commands such as \u003ccode\u003enew\u003c/code\u003e and \u003ccode\u003einit\u003c/code\u003e honor \u003ccode\u003e--no-input\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ecommands that expose structured data should prefer explicit machine-readable\nmodes such as \u003ccode\u003e--json\u003c/code\u003e or \u003ccode\u003e--format json\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDocs: \u003ca href=\"https://github.com/WaylonWalker/markata-go/tree/main/docs\"\u003ehttps://github.com/WaylonWalker/markata-go/tree/main/docs\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eIssues: \u003ca href=\"https://github.com/WaylonWalker/markata-go/issues\"\u003ehttps://github.com/WaylonWalker/markata-go/issues\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"commands\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommands\u003c/span\u003e \u003ca href=\"#commands\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"version\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eversion\u003c/span\u003e \u003ca href=\"#version\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePrint the version, commit, build date, Go runtime, and platform for this CLI\nbinary. Release and container builds inject the version, commit, and build date\nat compile time. Use \u003ccode\u003e--short\u003c/code\u003e when a script needs only the version string.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go version --short\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"lsp\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003elsp\u003c/span\u003e \u003ca href=\"#lsp\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eStart the Markdown language server, check its local prerequisites, or print\neditor setup guidance.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lsp\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lsp doctor\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lsp doctor --no-verify-editor\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lsp setup\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lsp setup --editor neovim\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003emarkata-go lsp\u003c/code\u003e communicates using LSP over standard input and output. It\nprovides wikilink completion, broken-wikilink diagnostics, hover information,\nand go-to-definition for Markdown files.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSubcommand\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edoctor\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRead-only check of the LSP binary, active project configuration, and installed editors\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esetup --editor \u0026lt;name\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePrint a copy-paste editor configuration snippet without editing files\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003ccode\u003esetup\u003c/code\u003e supports \u003ccode\u003egeneric\u003c/code\u003e, \u003ccode\u003eneovim\u003c/code\u003e, \u003ccode\u003ehelix\u003c/code\u003e, \u003ccode\u003eemacs\u003c/code\u003e, \u003ccode\u003ezed\u003c/code\u003e, and \u003ccode\u003evscode\u003c/code\u003e.\nUse \u003ccode\u003egeneric\u003c/code\u003e for another client. Editor recipes are guidance for documented\nclient configuration surfaces, not a guarantee that every editor version can be\nconfigured automatically. See [[editor-integration|Editor Integration]] for\nfull instructions.\u003c/p\u003e\n\u003cp\u003eBy default, \u003ccode\u003edoctor\u003c/code\u003e performs headless validation for installed Neovim, Helix,\nand Emacs configurations. This can load user startup/plugin code. Pass\n\u003ccode\u003e--no-verify-editor\u003c/code\u003e to only detect installed editors. VS Code, Cursor, and\nZed detection is advisory because their LSP clients do not expose stable\nheadless verification APIs.\u003c/p\u003e\n\u003cp\u003eWhen verification is skipped and a deeper check is available, \u003ccode\u003edoctor\u003c/code\u003e prints\nthe default follow-up command to stderr.\u003c/p\u003e\n\u003cp\u003eOn an interactive terminal, the doctor report derives its status colors from\nthe configured site palette while retaining text labels for each status.\u003c/p\u003e\n\u003cp\u003eInteractive help and human-facing setup headings also use the configured site\npalette. If a site palette cannot be resolved, Markata falls back to its default\nCLI theme; structured command output remains uncolored for scripting.\u003c/p\u003e\n\u003cp\u003eWhen \u003ccode\u003e--editor\u003c/code\u003e is omitted, \u003ccode\u003esetup\u003c/code\u003e prints snippets for each supported editor\ninstalled on \u003ccode\u003ePATH\u003c/code\u003e; it prints the generic integration contract if none are\nfound. Multiple snippets have editor headings and are syntax highlighted on an\ninteractive terminal; redirected output remains plain text.\u003c/p\u003e\n\u003cp\u003eThe LSP server reads TOML and \u003ccode\u003e.yaml\u003c/code\u003e configuration for mention indexing. If\nyour valid site configuration is \u003ccode\u003e.yml\u003c/code\u003e or \u003ccode\u003e.json\u003c/code\u003e, \u003ccode\u003edoctor\u003c/code\u003e warns that those\nLSP-specific mentions are unavailable.\u003c/p\u003e\n\u003ch3 id=\"agent\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eagent\u003c/span\u003e \u003ca href=\"#agent\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eInstall bundled agent integrations for markata-go site repositories.\u003c/p\u003e\n\u003ch4 id=\"usage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go agent install \u003cspan class=\"o\"\u003e[\u003c/span\u003esite-path\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go agent setup \u003cspan class=\"o\"\u003e[\u003c/span\u003esite-path\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"subcommands\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSubcommands\u003c/span\u003e \u003ca href=\"#subcommands\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ch5 id=\"list-agents\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003elist-agents\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eList the supported agent identifiers and their project/global skill directories.\u003c/p\u003e\n\u003ch5 id=\"install\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003einstall\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eInstall the bundled \u003ccode\u003emarkata-go-site\u003c/code\u003e skill into a repository.\n\u003ccode\u003esetup\u003c/code\u003e is an alias for \u003ccode\u003einstall\u003c/code\u003e.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--agent\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInstall for a specific agent such as \u003ccode\u003eopencode\u003c/code\u003e, \u003ccode\u003eclaude-code\u003c/code\u003e, or \u003ccode\u003ecursor\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eauto-detected, else \u003ccode\u003euniversal\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e-g\u003c/code\u003e, \u003ccode\u003e--global\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInstall into the selected agent\u0026rsquo;s user-level skill directory\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--name\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInstalled skill directory name\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emarkata-go-site\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--force\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOverwrite bundled skill files if they already exist\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--dry-run\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow what would be installed without writing files\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eOn an interactive terminal with no explicit agent, the command detects installed\nagents and offers to install for all of them. Declining opens the fuzzy picker.\nAgents that share an installation directory are installed only once. EOF cancels\nthe confirmation. If one installation fails, prior successful installations\nremain and the error names the failed agent.\u003c/p\u003e\n\u003cp\u003eWith \u003ccode\u003e--global\u003c/code\u003e and no agent, an interactive terminal opens a fuzzy picker when\nno detected agents are available.\nThe picker places the prompt below the results, like fzf, and colors the selection and matching characters.\n\u003ccode\u003e--no-color\u003c/code\u003e and \u003ccode\u003eNO_COLOR\u003c/code\u003e disable the colors.\nType to filter, use Up/Down to navigate, and press Enter to select.\nEscape or Ctrl+C cancels without an installation.\nNon-interactive project installs keep the environment-detected agent or fall\nback to \u003ccode\u003euniversal\u003c/code\u003e. Non-interactive global installs require an explicit agent,\nsuch as \u003ccode\u003e--agent github-copilot\u003c/code\u003e.\nUnknown names show close matches without selecting one automatically.\nFor example, \u003ccode\u003e--agent copilot\u003c/code\u003e suggests \u003ccode\u003e--agent github-copilot\u003c/code\u003e.\u003c/p\u003e\n\u003ch5 id=\"update\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eupdate\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eUpdate the installed \u003ccode\u003emarkata-go-site\u003c/code\u003e skill in place.\u003c/p\u003e\n\u003cp\u003eThis is the user-friendly equivalent of reinstalling with \u003ccode\u003e--force\u003c/code\u003e.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--agent\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUpdate a specific agent install such as \u003ccode\u003eopencode\u003c/code\u003e or \u003ccode\u003eclaude-code\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eauto-detected, else \u003ccode\u003euniversal\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e-g\u003c/code\u003e, \u003ccode\u003e--global\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUpdate the selected agent\u0026rsquo;s user-level skill directory\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--name\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInstalled skill directory name\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emarkata-go-site\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--dry-run\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow what would be updated without writing files\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch5 id=\"doctor\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003edoctor\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eCheck the installed skill for drift against the versions bundled in the current binary. Reports files that are modified, missing, or newly added since the skill was installed.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--agent\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCheck a specific agent install such as \u003ccode\u003eopencode\u003c/code\u003e or \u003ccode\u003eclaude-code\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eauto-detected, else \u003ccode\u003euniversal\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e-g\u003c/code\u003e, \u003ccode\u003e--global\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCheck the selected agent\u0026rsquo;s user-level skill directory\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--name\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInstalled skill directory name\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emarkata-go-site\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eExit codes:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCode\u003c/th\u003e\n\u003cth\u003eMeaning\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e0\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSkill is up to date\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDrift detected\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e2\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eError (skill not installed, manifest unreadable)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch5 id=\"remove\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eremove\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eRemove the installed \u003ccode\u003emarkata-go-site\u003c/code\u003e skill directory.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003euninstall\u003c/code\u003e is an alias for \u003ccode\u003eremove\u003c/code\u003e.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--agent\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRemove a specific agent install such as \u003ccode\u003eopencode\u003c/code\u003e or \u003ccode\u003eclaude-code\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eauto-detected, else \u003ccode\u003euniversal\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e-g\u003c/code\u003e, \u003ccode\u003e--global\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRemove from the selected agent\u0026rsquo;s user-level skill directory\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--name\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInstalled skill directory name\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emarkata-go-site\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Install into the detected agent\u0026#39;s project layout\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go agent install\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List supported agent ids and paths\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go agent list-agents\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Install into Claude Code\u0026#39;s .claude layout\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go agent install --agent claude-code\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Install into OpenCode\u0026#39;s global skill directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go agent install --agent opencode -g\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Preview files without writing\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go agent install --dry-run\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Install into a different repository\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go agent install ../my-site\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Replace an existing installed skill\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go agent install --force\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Update an installed skill in place\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go agent update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Preview an update without writing\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go agent update --dry-run\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check for drift after upgrading the binary\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go agent doctor\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check a Claude Code layout\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go agent doctor --agent claude-code\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check a global OpenCode install\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go agent doctor --agent opencode -g\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check a different repository\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go agent doctor ../my-site\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Remove an installed skill\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go agent remove\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Alias for remove\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go agent uninstall\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Remove a Claude Code install\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go agent remove --agent claude-code\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Remove a global OpenCode install\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go agent remove --agent opencode -g\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"installed-layouts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInstalled Layouts\u003c/span\u003e \u003ca href=\"#installed-layouts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003edetected agent or \u003ccode\u003euniversal\u003c/code\u003e: project install into that agent\u0026rsquo;s project skill path\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--agent claude-code\u003c/code\u003e: \u003ccode\u003e.claude/skills/markata-go-site/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--agent opencode\u003c/code\u003e: \u003ccode\u003e.agents/skills/markata-go-site/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--agent opencode -g\u003c/code\u003e: \u003ccode\u003e~/.config/opencode/skills/markata-go-site/\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe installed skill is split into \u003ccode\u003eSKILL.md\u003c/code\u003e plus focused topic files under \u003ccode\u003etopics/\u003c/code\u003e, reference material under \u003ccode\u003ereference/\u003c/code\u003e, starter files under \u003ccode\u003eexamples/\u003c/code\u003e, and regression prompts under \u003ccode\u003eevals/\u003c/code\u003e so agents can read only the sections relevant to the current task while maintainers still have a starter eval set for bundled-skill reviews. A \u003ccode\u003e.manifest.json\u003c/code\u003e file is written alongside the skill for drift detection via \u003ccode\u003eagent doctor\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eWhen \u003ccode\u003e-g\u003c/code\u003e is used, \u003ccode\u003e--agent\u003c/code\u003e is required and \u003ccode\u003esite-path\u003c/code\u003e is not accepted.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003eagent\u003c/code\u003e command group is intentionally generic so future subcommands can add export or MCP-oriented integrations without changing the bundled skill format.\u003c/p\u003e\n\u003ch3 id=\"assets\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eassets\u003c/span\u003e \u003ca href=\"#assets\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eManage external CDN assets used by self-hosted/vendor asset mode.\u003c/p\u003e\n\u003ch4 id=\"usage-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go assets \u0026lt;subcommand\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"subcommands-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSubcommands\u003c/span\u003e \u003ca href=\"#subcommands-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ch5 id=\"download\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003edownload\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eDownload all registered external assets into the configured asset cache, defaulting to \u003ccode\u003e.markata/assets-cache\u003c/code\u003e. This includes the Web Awesome npm archive so builder images can pre-seed the cache for offline site builds.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go assets download\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch5 id=\"list\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003elist\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eList registered assets and whether each one is available in the asset cache.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go assets list\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch5 id=\"clean\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eclean\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eRemove the asset cache so assets are fetched again on the next download/build.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go assets clean\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"build\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ebuild\u003c/span\u003e \u003ca href=\"#build\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBuild the static site by processing all content files through the plugin lifecycle.\u003c/p\u003e\n\u003ch4 id=\"usage-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"flags\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFlags\u003c/span\u003e \u003ca href=\"#flags\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eShort\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--clean\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eRemove output directory and build cache before building\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--clean-all\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eAlso remove external plugin caches before building\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--dry-run\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eShow what would be built without writing files\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--fast\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eSkip minification, CSS purge, Tailwind rebuilds, and Pagefind indexing\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--dag\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eUse the experimental serial DAG executor\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--benchmark-json\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eWrite benchmark details as JSON; use \u003ccode\u003e-\u003c/code\u003e for stdout\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--benchmark-summary-json\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eWrite compact benchmark JSON without content entries; use \u003ccode\u003e-\u003c/code\u003e for stdout\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--benchmark-detailed\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003ePrint per-stage benchmark resource summaries\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--verbose\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e-v\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable verbose logging\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--output\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e-o\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOverride output directory\u003c/td\u003e\n\u003ctd\u003efrom config\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"examples-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Standard build\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Clean build (replaces output after the new build succeeds)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Also clear external plugin caches\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean-all\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Preview what would be built\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --dry-run\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Fast dev build\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --fast\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Experimental serial task graph\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --dag\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build with verbose output\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build to a custom output directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build -o dist\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build with a specific config file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build -c production.toml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Combine flags\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean -v -o dist\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"content-diagnostics\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContent diagnostics\u003c/span\u003e \u003ca href=\"#content-diagnostics\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eEvery build prints a \u003ccode\u003eContent:\u003c/code\u003e summary. It counts discovered files, content\ncandidates, loaded sources, valid frontmatter, posts, eligible posts, rendered\nposts, emitted outputs, exclusions, warnings, and errors.\u003c/p\u003e\n\u003cp\u003eContent diagnostics identify the source path, line, stable reason code, and a\nshort message. For example, a frontmatter opening of \u003ccode\u003e----\u003c/code\u003e reports\n\u003ccode\u003efrontmatter.suspicious_delimiter\u003c/code\u003e; it does not silently discard the file.\nMalformed author content is isolated to that source, but source stat, read, and\nother filesystem errors still fail the build.\u003c/p\u003e\n\u003cp\u003eUse \u003ccode\u003e-v\u003c/code\u003e to show the final disposition and reason codes for every excluded or\nshadow source:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent dispositions:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  posts/draft.md [excluded]: content.draft\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  posts/review.md [shadow]: content.published_false\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe JSON written by \u003ccode\u003e--benchmark-json\u003c/code\u003e includes the same sanitized content\nsnapshot under \u003ccode\u003econtent\u003c/code\u003e. It does not include raw frontmatter, environment\nvalues, secrets, or build logs.\u003c/p\u003e\n\u003cp\u003eA successful full build writes the sanitized\ncontent diagnostics artifact to \u003ccode\u003e\u0026lt;output_dir\u0026gt;/.markata/diagnostics.json\u003c/code\u003e. It includes a versioned schema,\nsummary counts, per-source dispositions, stable reason codes, and feed-level\nselection details. Inspect it with a JSON tool such as:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejq . output/.markata/diagnostics.json\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse the configured output directory instead of \u003ccode\u003eoutput\u003c/code\u003e when it differs. The\nartifact is not written by \u003ccode\u003ebuild --dry-run\u003c/code\u003e, \u003ccode\u003ebuild --fast\u003c/code\u003e, fast or incremental\n\u003ccode\u003eserve\u003c/code\u003e, or an incomplete or failed build. A normal \u003ccode\u003eserve\u003c/code\u003e build can write the\nartifact after a successful full lifecycle. See [[content-diagnostics|Content Diagnostics]]\nfor the field and privacy contract.\u003c/p\u003e\n\u003ch3 id=\"buildlab\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ebuildlab\u003c/span\u003e \u003ca href=\"#buildlab\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCompare baseline and candidate builds in isolated workspaces.\u003c/p\u003e\n\u003ch4 id=\"usage-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go buildlab run --fixture PATH \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBuild Lab runs ordinary \u003ccode\u003ebuild\u003c/code\u003e commands. It does not use a task graph or an\nexperimental scheduler. Each checkpoint compares clean baseline output with\nclean candidate output, candidate incremental output when available, and a\nsecond clean candidate build when determinism checks are enabled.\u003c/p\u003e\n\u003ch4 id=\"flags-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFlags\u003c/span\u003e \u003ca href=\"#flags-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--fixture\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite fixture directory\u003c/td\u003e\n\u003ctd\u003erequired\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--baseline\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBaseline markata-go binary\u003c/td\u003e\n\u003ctd\u003ecurrent executable\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--candidate\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCandidate markata-go binary\u003c/td\u003e\n\u003ctd\u003ecurrent executable\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--build-config\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConfig path relative to the fixture\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emarkata-go.toml\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--scenario\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eVersioned scenario JSON file\u003c/td\u003e\n\u003ctd\u003eclean/no-op scenario\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--result\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWrite the JSON result to this path\u003c/td\u003e\n\u003ctd\u003enone\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--seed\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eScenario seed\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--timeout\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePer-build timeout\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e10m\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--gomaxprocs\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGOMAXPROCS for child builds\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--check-determinism\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCompare two clean candidate builds\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--volatile\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eComma-separated volatile output paths\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.well-known/time\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--fast\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAdd \u003ccode\u003e--fast\u003c/code\u003e to both child builds\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--tool-version\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eExternal tool metadata, such as \u003ccode\u003epagefind=1.5.2\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003enone\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--env\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAllowed entries: \u003ccode\u003ePATH\u003c/code\u003e, \u003ccode\u003eMARKATA_GO_ENCRYPTION_ENABLED\u003c/code\u003e, or \u003ccode\u003eMARKATA_GO_OFFLINE\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003enone\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eBuild Lab copies the fixture, redirects cache and temporary paths, disables\nfixture \u003ccode\u003e.env\u003c/code\u003e loading, and pins children to UTC, \u003ccode\u003eC.UTF-8\u003c/code\u003e, and\n\u003ccode\u003eSOURCE_DATE_EPOCH=0\u003c/code\u003e. It rejects paths and environment entries that escape the\nworkspace. Setup failures emit a versioned harness result to stdout and a\nconcise diagnostic to stderr. See [[build-lab|Build Lab]] for scenario and\noutput-class details.\u003c/p\u003e\n\u003ch3 id=\"builder-admin\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ebuilder-admin\u003c/span\u003e \u003ca href=\"#builder-admin\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eRun the long-lived builder admin HTTP service for Kubernetes and authoring workflows.\u003c/p\u003e\n\u003ch4 id=\"usage-4\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-4\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go builder-admin \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"flags-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFlags\u003c/span\u003e \u003ca href=\"#flags-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--host\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHost to bind to\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e127.0.0.1\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--port\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePort to listen on\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e8080\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--source-dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMounted source directory to watch and build from\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--release-dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMounted release root that contains \u003ccode\u003ereleases/\u003c/code\u003e and \u003ccode\u003ecurrent\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epublic\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--watch\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable recursive file watching and queued rebuilds\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--watch-debounce\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDebounce window for coalescing file changes\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e2s\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--fast\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUse \u003ccode\u003emarkata-go build --fast\u003c/code\u003e for queued builds\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--mermaid-mode\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOverride \u003ccode\u003e[markata-go.mermaid].mode\u003c/code\u003e for queued builds\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--cache-mount\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOptional dedicated cache mount used for \u003ccode\u003e.markata\u003c/code\u003e and \u003ccode\u003e.markata-cache\u003c/code\u003e symlinks\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--history-dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDirectory for persisted admin state and logs\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026lt;release-dir\u0026gt;/.builder-admin\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--releases-keep\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNumber of rendered releases to keep on disk\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e25\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--refresh-task\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRepeatable task spec in the form `name\u003c/td\u003e\n\u003ctd\u003eevery\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--trusted-proxy-cidr\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRepeatable CIDR allowed to supply trusted identity headers\u003c/td\u003e\n\u003ctd\u003enone\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--auth-user-id-header\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTrusted header containing the durable operator ID\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eX-Hlab-User-Id\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--auth-username-header\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTrusted header containing the operator username\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eX-Hlab-Username\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--auth-display-name-header\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTrusted header containing the operator display name\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eX-Hlab-Display-Name\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--auth-email-header\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTrusted header containing the operator email\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eX-Hlab-Email\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--auth-groups-header\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTrusted header containing operator groups\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eX-Hlab-Groups\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--auth-roles-header\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTrusted header containing operator roles\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eX-Hlab-Roles\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--auth-scopes-header\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTrusted header containing operator scopes\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eX-Hlab-Scopes\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--auth-method-header\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTrusted ForwardAuth assertion for bearer-authenticated API requests\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eX-Hlab-Auth-Method\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eHeader mappings may also be set in \u003ccode\u003e[markata-go.builder_admin.auth.headers]\u003c/code\u003e or with\n\u003ccode\u003eMARKATA_GO_BUILDER_ADMIN_AUTH_HEADERS_*\u003c/code\u003e environment variables. Explicit CLI flags override\nenvironment and file configuration. See \u003ca href=\"../guides/deployment/builder-admin.md\"\u003eBuilder Admin\u003c/a\u003e\nfor a complete ForwardAuth and Authentik example.\u003c/p\u003e\n\u003ch4 id=\"examples-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run locally against mounted source and site paths\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go builder-admin \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --config /data/source/markata-go.toml \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --source-dir /data/source \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --release-dir /data/site \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --cache-mount /data/cache \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --fast \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --watch\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Add a scheduled reader refresh that enqueues a build when complete\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go builder-admin \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --refresh-task \u003cspan class=\"s1\"\u003e\u0026#39;reader-update|30m|true|markata-go|--config|/data/source/markata-go.toml|reader|update\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"exit-codes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExit Codes\u003c/span\u003e \u003ca href=\"#exit-codes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCode\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e0\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBuild completed successfully\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBuild failed (configuration error, plugin error, etc.)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e2\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo content files found\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"build-process\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Process\u003c/span\u003e \u003ca href=\"#build-process\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eThe build command executes the full 9-stage lifecycle:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eConfigure\u003c/strong\u003e - Load and merge configuration\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eValidate\u003c/strong\u003e - Validate configuration settings\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGlob\u003c/strong\u003e - Discover content files\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLoad\u003c/strong\u003e - Parse markdown files and frontmatter\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTransform\u003c/strong\u003e - Pre-render processing (wikilinks, jinja-md, etc.)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRender\u003c/strong\u003e - Convert markdown to HTML\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCollect\u003c/strong\u003e - Build feeds and collections\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eWrite\u003c/strong\u003e - Output files to disk\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCleanup\u003c/strong\u003e - Release resources\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eWhen \u003ccode\u003e--verbose\u003c/code\u003e is enabled, build output includes per-stage timing to highlight slow stages.\n\u003ccode\u003e--fast\u003c/code\u003e keeps the same HTML output path but skips minification, CSS purge, Tailwind rebuilds,\nand Pagefind indexing for a tighter dev loop.\u003c/p\u003e\n\u003cp\u003eSuccessful builds also print a compact benchmark summary with:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eestimated wall-time spent on CPU work, network wait, disk read wait, disk write wait, and idle time\u003c/li\u003e\n\u003cli\u003ethe slowest lifecycle hotspots so you can spot expensive plugins quickly\u003c/li\u003e\n\u003cli\u003ethe slowest outbound HTTP requests so network-bound plugins stop hiding in aggregate wait time\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFor deeper analysis:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go build --benchmark-json=benchmark.json\u003c/code\u003e writes machine-readable benchmark data to a file\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go build --benchmark-json=-\u003c/code\u003e writes only the benchmark JSON to stdout\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go build --benchmark-summary-json=/tmp/benchmark.json\u003c/code\u003e writes timing and aggregate content statistics without the large per-content entry matrix\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go build -v --benchmark-detailed\u003c/code\u003e adds per-stage resource summaries to the build footer\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWhen requests are present, the footer prints the 10 slowest network waits with stage, plugin, method, sanitized URL, duration, and either HTTP status or the request error.\u003c/p\u003e\n\u003cp\u003eThe resource profile is approximate. It is intended for local hotspot hunting, not precise system profiling.\u003c/p\u003e\n\u003cp\u003eThe experimental \u003ccode\u003e--dag\u003c/code\u003e flag is available on \u003ccode\u003ebuild\u003c/code\u003e, \u003ccode\u003eserve\u003c/code\u003e, and\n\u003ccode\u003ebuilder-admin\u003c/code\u003e. It retains serial plugin ordering and is not a parallel-build\nswitch. \u003ccode\u003eMARKATA_GO_DAG=true\u003c/code\u003e also opts in; an explicit \u003ccode\u003e--dag=false\u003c/code\u003e overrides\nthe environment, including queued Builder Admin child builds. Invalid\nenvironment boolean values report an error unless an explicit flag overrides\nthem. \u003ccode\u003ebuild --dry-run\u003c/code\u003e still uses the legacy partial lifecycle and does not\nclaim a DAG build ran. Benchmark JSON records the executor that actually ran.\nSee [[dag-builds|Experimental DAG builds]] for comparison guidance.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"reader\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ereader\u003c/span\u003e \u003ca href=\"#reader\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eRefresh the cached external feed data used by the \u003ccode\u003e/reader/\u003c/code\u003e page without running a build.\u003c/p\u003e\n\u003ch4 id=\"usage-5\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-5\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go reader update\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch5 id=\"flags-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFlags\u003c/span\u003e\u003c/h5\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--concurrency\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOverride feed refresh concurrency for this run\u003c/td\u003e\n\u003ctd\u003econfig value, else \u003ccode\u003e5\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"subcommands-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSubcommands\u003c/span\u003e \u003ca href=\"#subcommands-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ch5 id=\"update-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eupdate\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eFetch all configured blogroll feeds and rewrite the on-disk reader cache so the next build can reuse fresh reader data.\u003c/p\u003e\n\u003cp\u003eThis command does not render pages or write site output. It only updates the external feed cache used by the blogroll and reader features.\u003c/p\u003e\n\u003ch4 id=\"examples-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Refresh reader cache using the auto-discovered config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go reader update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Refresh reader cache with higher parallelism for this run\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go reader update --concurrency \u003cspan class=\"m\"\u003e12\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Refresh reader cache using a specific config file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go reader update -c production.toml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"notes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNotes\u003c/span\u003e \u003ca href=\"#notes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003erequires \u003ccode\u003e[markata-go.blogroll] enabled = true\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003erequires at least one \u003ccode\u003e[[markata-go.blogroll.feeds]]\u003c/code\u003e entry\u003c/li\u003e\n\u003cli\u003ebypasses normal cache age checks so it can fetch fresh remote feed data immediately\u003c/li\u003e\n\u003cli\u003ereuses stale cached feed data on fetch failures when available\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"editor\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eeditor\u003c/span\u003e \u003ca href=\"#editor\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe editor accepts \u003ccode\u003e--port\u003c/code\u003e (\u003ccode\u003e-p\u003c/code\u003e) to select its HTTP port. When a port is occupied,\n\u003ccode\u003eeditor\u003c/code\u003e and \u003ccode\u003eserve\u003c/code\u003e suggest a rerun command. In an interactive terminal, Enter\naccepts an available port; \u003ccode\u003eq\u003c/code\u003e followed by Enter or Ctrl+C cancels.\u003c/p\u003e\n\u003cp\u003eRun the browser-based Go Markdown editor against a selected workspace.\u003c/p\u003e\n\u003ch4 id=\"usage-6\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-6\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata editor \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe editor uses Markata\u0026rsquo;s Go renderer and LSP in the same process. It binds to\nloopback by default and prints its local URL. Browser drafts stay in memory;\nuse \u003cstrong\u003eDownload .md\u003c/strong\u003e to save a copy. The file tree opens discovered workspace sources. Edits remain browser drafts;\nthe command does not save changes to source files.\u003c/p\u003e\n\u003ch4 id=\"flags-4\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFlags\u003c/span\u003e \u003ca href=\"#flags-4\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--workspace\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMarkdown workspace used for language assistance\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--listen\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLoopback HTTP address\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e127.0.0.1:8766\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--port\u003c/code\u003e, \u003ccode\u003e-p\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHTTP port (overrides the port in \u003ccode\u003e--listen\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e8766\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"examples-4\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-4\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Open the editor for the current workspace\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata editor\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Select a site workspace\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata editor --workspace ~/sites/blog\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Change the local port\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata editor --listen 127.0.0.1:8767\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe listener accepts only \u003ccode\u003elocalhost\u003c/code\u003e or a loopback IP address. See the\n\u003ca href=\"/docs/guides/go-workbench/\"\u003eGo editor guide\u003c/a\u003e for browser behavior and LSP completions.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"serve\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eserve\u003c/span\u003e \u003ca href=\"#serve\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eStart a development server with live reload support.\u003c/p\u003e\n\u003ch4 id=\"usage-7\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-7\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003emarkdown-file\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePass a Markdown file to serve only that page at \u003ccode\u003e/\u003c/code\u003e, using the same single-file mode as \u003ccode\u003ebuild\u003c/code\u003e. Every rebuild stays in single-file mode.\u003c/p\u003e\n\u003ch4 id=\"flags-5\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFlags\u003c/span\u003e \u003ca href=\"#flags-5\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eShort\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--port\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e-p\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePort to listen on\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e8000\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--host\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eHost address to bind to\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003elocalhost\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--bind\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eAddress to listen on (alias for \u003ccode\u003e--host\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003elocalhost\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--admin\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eExplicitly enable the local Control Center on loopback\u003c/td\u003e\n\u003ctd\u003eLoopback default\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--no-admin\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eDisable the local Control Center\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--no-tui\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eUse line-oriented output\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--watch\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eEnable file watching and auto-rebuild\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--no-watch\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eDisable file watching (legacy, overrides \u0026ndash;watch)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--fast\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eSkip minification/CSS purge, Tailwind rebuilds, Pagefind indexing, and disable blogroll/mentions\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--incremental\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eReuse unchanged posts and dependencies while keeping normal output processing\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--verbose\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e-v\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable verbose logging\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"examples-5\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-5\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Serve on default port (localhost:8000)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Serve on a custom port\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve -p \u003cspan class=\"m\"\u003e3000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve --port \u003cspan class=\"m\"\u003e3000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Bind to all network interfaces (accessible from other devices)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve --host 0.0.0.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Disable the local Control Center on a loopback listener\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve --no-admin\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Explicitly enable file watching (default behavior)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve --watch\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Serve without file watching\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve --watch\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve --no-watch\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Serve with production-style incremental rebuilds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve --incremental\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Serve with verbose logging\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Combine options\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve -p \u003cspan class=\"m\"\u003e8080\u003c/span\u003e --host 0.0.0.0 -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"features\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeatures\u003c/span\u003e \u003ca href=\"#features\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eAutomatic rebuild\u003c/strong\u003e: File changes trigger a rebuild automatically\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLive reload\u003c/strong\u003e: Connected browsers refresh when content changes\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eStatic file serving\u003c/strong\u003e: Serves the output directory\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMIME type detection\u003c/strong\u003e: Correct content types for all file types\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eImmediate serve\u003c/strong\u003e: Server starts before the initial build completes\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLocal Control Center\u003c/strong\u003e: \u003ccode\u003ehttp://localhost:8000/_markata/\u003c/code\u003e is available by default on loopback. A non-loopback bind leaves it disabled. \u003ccode\u003e--admin\u003c/code\u003e is rejected there, and \u003ccode\u003e--admin --no-admin\u003c/code\u003e is invalid. The TUI shows \u003ccode\u003e⚙ Admin\u003c/code\u003e; press \u003ccode\u003ea\u003c/code\u003e to open it in a browser.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBuild status banner\u003c/strong\u003e: Shows build progress and errors during serve\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eEarly 404\u003c/strong\u003e: Minimal 404 is served until the generated 404.html exists\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eIncremental mode\u003c/strong\u003e: \u003ccode\u003eserve --incremental\u003c/code\u003e rebuilds only changed posts and dependents while retaining minification, CSS purging, Tailwind, redirects, and Pagefind processing\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFast mode\u003c/strong\u003e: \u003ccode\u003eserve --fast\u003c/code\u003e rebuilds only changed posts and dependents, but skips production output steps for iteration speed\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBake theme\u003c/strong\u003e: the theme picker gains a \u003cstrong\u003eBake\u003c/strong\u003e button that writes your current palette, style, and font (and text size or color mode when you picked them) into \u003ccode\u003e[markata-go.theme]\u003c/code\u003e. It edits the config file (including \u003ccode\u003einclude\u003c/code\u003ed files) that already holds the theme, keeping comments, then rebuilds. It never writes your global \u003ccode\u003e~/.config/markata-go/config.toml\u003c/code\u003e. Only \u003ccode\u003eserve\u003c/code\u003e offers it. See \u003ca href=\"/docs/guides/themes/#baking-a-look-into-your-config\"\u003eThemes Guide\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSettings sidebar\u003c/strong\u003e: a gear button at the bottom left (or \u003ccode\u003eAlt+,\u003c/code\u003e) opens a sidebar with every config setting, its current value, and its description. Changes preview live on the site right away without touching your files; click \u003cstrong\u003eBake\u003c/strong\u003e to review a diff and write them into the config file that owns each one, or \u003cstrong\u003eReset\u003c/strong\u003e to discard them. \u003cstrong\u003eReset to default\u003c/strong\u003e removes a setting from your config. Settings with fixed values are dropdowns, and invalid values are rejected. Previews build into \u003ccode\u003e.markata/serve-preview/\u003c/code\u003e so your main build cache is kept. Only \u003ccode\u003eserve\u003c/code\u003e shows it. See \u003ca href=\"/docs/guides/configuration/#edit-settings-while-serving\"\u003eConfiguration Guide\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLocal only\u003c/strong\u003e: the settings and Bake endpoints accept requests only from the machine running \u003ccode\u003eserve\u003c/code\u003e (a loopback client address). With \u003ccode\u003e--host 0.0.0.0\u003c/code\u003e, other devices can browse the site but cannot change your config.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"development-workflow\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDevelopment Workflow\u003c/span\u003e \u003ca href=\"#development-workflow\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Terminal 1: Start the server\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# The server will:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# - Start serving at http://localhost:8000 immediately\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# - Build your site in the background\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# - Watch for file changes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# - Rebuild and reload on changes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"tui\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003etui\u003c/span\u003e \u003ca href=\"#tui\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eInteractive terminal UI for browsing and managing your markata site. Inspired by \u003ca href=\"https://k9scli.io/\"\u003ek9s\u003c/a\u003e.\u003c/p\u003e\n\u003ch4 id=\"usage-8\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-8\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go tui \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"description\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDescription\u003c/span\u003e \u003ca href=\"#description\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eThe TUI provides a keyboard-driven interface for exploring your site\u0026rsquo;s posts, tags, and feeds. It features a k9s-style table layout with filtering, sorting, and quick actions.\u003c/p\u003e\n\u003ch4 id=\"views\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eViews\u003c/span\u003e \u003ca href=\"#views\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eThe TUI has three main views, accessible via number keys:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eKey\u003c/th\u003e\n\u003cth\u003eView\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePosts\u003c/td\u003e\n\u003ctd\u003eBrowse all posts in a table\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e2\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTags\u003c/td\u003e\n\u003ctd\u003eView and filter by tags\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e3\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFeeds\u003c/td\u003e\n\u003ctd\u003eView configured feeds\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"global-keybindings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGlobal Keybindings\u003c/span\u003e \u003ca href=\"#global-keybindings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eThese keys work in all views:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eKey\u003c/th\u003e\n\u003cth\u003eAction\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e1\u003c/code\u003e, \u003ccode\u003e2\u003c/code\u003e, \u003ccode\u003e3\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSwitch between views\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnter filter mode\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eEsc\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eClear filter / exit current mode\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e?\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow help\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eq\u003c/code\u003e, \u003ccode\u003eCtrl+C\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eQuit\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"posts-view\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePosts View\u003c/span\u003e \u003ca href=\"#posts-view\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eThe posts view displays all posts in a table with columns for title, date, word count, tags, and path.\u003c/p\u003e\n\u003ch5 id=\"posts-keybindings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePosts Keybindings\u003c/span\u003e\u003c/h5\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eKey\u003c/th\u003e\n\u003cth\u003eAction\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e↑\u003c/code\u003e/\u003ccode\u003e↓\u003c/code\u003e, \u003ccode\u003ej\u003c/code\u003e/\u003ccode\u003ek\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNavigate up/down\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eEnter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eView post details\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ee\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEdit post in $EDITOR\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003es\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOpen sort menu\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFilter posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch5 id=\"post-detail-view\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePost Detail View\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003ePress \u003ccode\u003eEnter\u003c/code\u003e on any post to see its full details including:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTitle, path, and date\u003c/li\u003e\n\u003cli\u003ePublished status and tags\u003c/li\u003e\n\u003cli\u003eWord count and description\u003c/li\u003e\n\u003cli\u003eContent preview\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePress \u003ccode\u003eEsc\u003c/code\u003e to return to the post list, or \u003ccode\u003ee\u003c/code\u003e to edit the post.\u003c/p\u003e\n\u003ch4 id=\"sorting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSorting\u003c/span\u003e \u003ca href=\"#sorting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003ePress \u003ccode\u003es\u003c/code\u003e in the posts view to open the sort menu:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSort Option\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eDate\u003c/td\u003e\n\u003ctd\u003eSort by post date (default)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTitle\u003c/td\u003e\n\u003ctd\u003eSort alphabetically by title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWord Count\u003c/td\u003e\n\u003ctd\u003eSort by word count\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePath\u003c/td\u003e\n\u003ctd\u003eSort by file path\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eUse \u003ccode\u003ea\u003c/code\u003e for ascending order, \u003ccode\u003ed\u003c/code\u003e for descending order.\u003c/p\u003e\n\u003ch4 id=\"filtering\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFiltering\u003c/span\u003e \u003ca href=\"#filtering\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003ePress \u003ccode\u003e/\u003c/code\u003e to enter filter mode. Type a filter expression and press \u003ccode\u003eEnter\u003c/code\u003e to apply.\u003c/p\u003e\n\u003ch5 id=\"filter-expression-examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFilter Expression Examples\u003c/span\u003e\u003c/h5\u003e\n\u003cpre\u003e\u003ccode\u003epublished==true           # Only published posts\ntags contains \u0026quot;go\u0026quot;        # Posts tagged with \u0026quot;go\u0026quot;  \ndate \u0026gt; \u0026quot;2024-01-01\u0026quot;       # Posts after a specific date\ntitle startswith \u0026quot;How\u0026quot;    # Titles starting with \u0026quot;How\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSee \u003ca href=\"/docs/guides/filters\"\u003eFilter Expressions\u003c/a\u003e for the complete filter syntax.\u003c/p\u003e\n\u003ch4 id=\"feeds-view\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeeds View\u003c/span\u003e \u003ca href=\"#feeds-view\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eThe feeds view displays all configured feeds with:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFeed name\u003c/li\u003e\n\u003cli\u003eNumber of posts in the feed\u003c/li\u003e\n\u003cli\u003eFilter expression used\u003c/li\u003e\n\u003cli\u003eOutput path\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"environment-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment Variables\u003c/span\u003e \u003ca href=\"#environment-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eEDITOR\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePrimary editor for \u003ccode\u003ee\u003c/code\u003e key (falls back to \u003ccode\u003evim\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eVISUAL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSecondary editor if \u003ccode\u003eEDITOR\u003c/code\u003e is not set\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"examples-6\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-6\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Launch the TUI\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go tui\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# The TUI will display your posts in a table format\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Use j/k to navigate, Enter to view details, e to edit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"list-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003elist\u003c/span\u003e \u003ca href=\"#list-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eList posts, tags, or feeds in table, JSON, CSV, or path-only formats.\u003c/p\u003e\n\u003ch4 id=\"usage-9\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-9\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list posts \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list tags \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list feeds \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list feeds posts \u0026lt;feed\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"shared-flags\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eShared Flags\u003c/span\u003e \u003ca href=\"#shared-flags\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--format\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOutput format: \u003ccode\u003etable\u003c/code\u003e, \u003ccode\u003ejson\u003c/code\u003e, \u003ccode\u003ecsv\u003c/code\u003e, \u003ccode\u003epath\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etable\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--sort\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSort field (varies by subcommand)\u003c/td\u003e\n\u003ctd\u003eposts: \u003ccode\u003edate\u003c/code\u003e, tags: \u003ccode\u003ecount\u003c/code\u003e, feeds: \u003ccode\u003ename\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--order\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSort order: \u003ccode\u003easc\u003c/code\u003e or \u003ccode\u003edesc\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eposts/tags: \u003ccode\u003edesc\u003c/code\u003e, feeds: \u003ccode\u003easc\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"posts-flags\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePosts Flags\u003c/span\u003e \u003ca href=\"#posts-flags\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--filter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFilter expression for posts\u003c/td\u003e\n\u003ctd\u003enone\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--feed\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLimit posts to a feed by name\u003c/td\u003e\n\u003ctd\u003enone\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"examples-7\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-7\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List posts as a table\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list posts\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Path-only output for piping\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list posts --format path\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List tags as JSON\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list tags --format json\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List feeds as CSV\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list feeds --format csv\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List posts for a feed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list posts --feed blog\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List posts for a feed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list feeds posts blog\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List post paths for a feed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go list feeds posts blog --format path\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"cache\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCache\u003c/span\u003e \u003ca href=\"#cache\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003elist\u003c/code\u003e and \u003ccode\u003etui\u003c/code\u003e use a persistent cache at \u003ccode\u003e.markata/cache/list.json\u003c/code\u003e. Delete this file to force a full refresh.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"search\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003esearch\u003c/span\u003e \u003ca href=\"#search\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFull-text search across post content, titles, descriptions, and tags. Uses a bleve full-text index for BM25-ranked results with optional fuzzy matching.\u003c/p\u003e\n\u003ch4 id=\"usage-10\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-10\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search \u0026lt;query\u0026gt; \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"flags-6\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFlags\u003c/span\u003e \u003ca href=\"#flags-6\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--format\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOutput format: \u003ccode\u003etable\u003c/code\u003e, \u003ccode\u003ejson\u003c/code\u003e, \u003ccode\u003ecsv\u003c/code\u003e, \u003ccode\u003epath\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etable\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--sort\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSort field: \u003ccode\u003escore\u003c/code\u003e, \u003ccode\u003edate\u003c/code\u003e, \u003ccode\u003etitle\u003c/code\u003e, \u003ccode\u003ewords\u003c/code\u003e, \u003ccode\u003epath\u003c/code\u003e, \u003ccode\u003ereading_time\u003c/code\u003e, \u003ccode\u003etags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003escore\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--order\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSort order: \u003ccode\u003easc\u003c/code\u003e or \u003ccode\u003edesc\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edesc\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--filter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAdditional filter expression to narrow results\u003c/td\u003e\n\u003ctd\u003enone\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--fields\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFields to search: \u003ccode\u003etitle,content,description,tags\u003c/code\u003e (default: all)\u003c/td\u003e\n\u003ctd\u003eall\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--fuzzy\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable fuzzy matching (tolerates typos)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--limit\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMaximum number of results (0 = no limit)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e0\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"examples-8\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-8\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Search for posts about golang (BM25-ranked)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search golang\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Search with JSON output for scripting\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search \u003cspan class=\"s2\"\u003e\u0026#34;error handling\u0026#34;\u003c/span\u003e --format json\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Search with a filter and limit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search docker --filter \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e --limit \u003cspan class=\"m\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Search only in titles and tags\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search golang --fields title,tags\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Fuzzy search (tolerates typos like \u0026#34;tutoral\u0026#34; → \u0026#34;tutorial\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search tutoral --fuzzy\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Search and sort by date instead of relevance\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search cli --sort date --order desc\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Get matching file paths for piping\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search kubernetes --format path\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Combine filter expressions with search\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search tutorial --filter \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#34;go\u0026#34; in tags and date \u0026gt;= \u0026#34;2024-01-01\u0026#34;\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"search-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSearch Behavior\u003c/span\u003e \u003ca href=\"#search-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eUses bleve full-text index with BM25 ranking (results sorted by relevance by default)\u003c/li\u003e\n\u003cli\u003eFalls back to substring matching if the bleve index cannot be built\u003c/li\u003e\n\u003cli\u003eIndex is cached at \u003ccode\u003e.markata/cache/search.bleve\u003c/code\u003e and rebuilt when content changes\u003c/li\u003e\n\u003cli\u003eCombines with \u003ccode\u003e--filter\u003c/code\u003e to narrow results before searching (filter applied first)\u003c/li\u003e\n\u003cli\u003eTable output shows relevance scores when using ranked search\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--fuzzy\u003c/code\u003e enables edit-distance matching for typo tolerance\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSynonym expansion\u003c/strong\u003e is enabled by default — searching \u0026ldquo;land\u0026rdquo; also finds posts about \u0026ldquo;shore\u0026rdquo; (powered by a bundled WordNet thesaurus with 10,000+ synonym groups)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePrivacy-safe\u003c/strong\u003e — private posts are searchable by public metadata, while their body content and media remain excluded from search\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"search-build-index\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003esearch build-index\u003c/span\u003e \u003ca href=\"#search-build-index\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBuild a reusable bleve index artifact without starting the search server.\u003c/p\u003e\n\u003ch4 id=\"usage-11\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-11\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search build-index \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"flags-7\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFlags\u003c/span\u003e \u003ca href=\"#flags-7\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--index-dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDirectory to write the bleve index\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.markata/cache/search.bleve\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--hash-path\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePath for the content hash file\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.markata/cache/search.hash\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--index-name\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNamed index suffix inside the default cache directory\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--force\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRebuild even if content hash is unchanged\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"examples-9\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-9\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build the default cached index\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search build-index\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build a reusable artifact at a custom path\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search build-index --index-dir /data/search.bleve --hash-path /data/search.hash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build a named index alongside other local indexes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search build-index --index-name server --force\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBehavior\u003c/span\u003e \u003ca href=\"#behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eLoads the site content the same way as \u003ccode\u003emarkata-go search\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eWrites or refreshes a bleve index on disk\u003c/li\u003e\n\u003cli\u003eIntended for CI, builder jobs, and future read-only search server deployments\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"search-server\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003esearch-server\u003c/span\u003e \u003ca href=\"#search-server\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eStart a standalone bleve-backed search API server.\u003c/p\u003e\n\u003ch4 id=\"usage-12\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-12\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search-server \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"flags-8\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFlags\u003c/span\u003e \u003ca href=\"#flags-8\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--port\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePort to listen on\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e3001\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--host\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHost to bind to\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003elocalhost\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--mode\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eServer mode: \u003ccode\u003eruntime-index\u003c/code\u003e, \u003ccode\u003ewatch-content\u003c/code\u003e, or \u003ccode\u003eread-only-index\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eruntime-index\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--index-dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDirectory of the bleve index\u003c/td\u003e\n\u003ctd\u003eruntime default\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--hash-path\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePath for the content hash file in runtime-index mode\u003c/td\u003e\n\u003ctd\u003eruntime default\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--index-name\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNamed index suffix inside the default cache directory\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eserver\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--rebuild-index\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eForce a rebuild in runtime-index mode\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--watch-debounce\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDebounce duration for watch-content reloads\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e750ms\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"examples-10\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-10\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Start the search API server\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search-server\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Start on a custom port\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search-server --port \u003cspan class=\"m\"\u003e8081\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Start in watch mode\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search-server --mode watch-content\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Serve a prebuilt index artifact without loading content\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search-server --mode read-only-index --index-dir /data/search.bleve\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Query the API\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl \u003cspan class=\"s2\"\u003e\u0026#34;http://localhost:3001/api/search?q=golang\u0026amp;fuzzy=true\u0026amp;limit=10\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl \u003cspan class=\"s2\"\u003e\u0026#34;http://localhost:3001/api/search?q=docker\u0026amp;tags=devops\u0026amp;from=2024-01-01\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"api-parameters\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAPI Parameters\u003c/span\u003e \u003ca href=\"#api-parameters\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eParameter\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eq\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSearch query (required)\u003c/td\u003e\n\u003ctd\u003e—\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efuzzy\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable fuzzy matching (\u003ccode\u003etrue\u003c/code\u003e/\u003ccode\u003efalse\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elimit\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMax results\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e20\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eComma-separated tag filter\u003c/td\u003e\n\u003ctd\u003enone\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efrom\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDate range start (\u003ccode\u003eYYYY-MM-DD\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003enone\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eto\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDate range end (\u003ccode\u003eYYYY-MM-DD\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003enone\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"search-api-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSearch API Behavior\u003c/span\u003e \u003ca href=\"#search-api-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eReturns JSON with \u003ccode\u003equery\u003c/code\u003e, \u003ccode\u003etotal\u003c/code\u003e, \u003ccode\u003eresults\u003c/code\u003e fields\u003c/li\u003e\n\u003cli\u003ePrivate post content is never searchable — only metadata (title, description, tags)\u003c/li\u003e\n\u003cli\u003eCORS follows \u003ccode\u003esearch.bleve.cors_origins\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAlso available at the configured endpoint during \u003ccode\u003emarkata-go serve\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eHealth check at \u003ccode\u003e/health\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"modes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eModes\u003c/span\u003e \u003ca href=\"#modes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eruntime-index\u003c/code\u003e loads site content and builds or refreshes a local bleve index\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ewatch-content\u003c/code\u003e reloads content and refreshes the local index when source files change\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eread-only-index\u003c/code\u003e opens an existing prebuilt index without loading or rebuilding site content\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebackend\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;bleve\u0026#34;\u003c/span\u003e           \u003cspan class=\"c\"\u003e# \u0026#34;pagefind\u0026#34; (default) or \u0026#34;bleve\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eendpoint\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/api/search\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# API endpoint path\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebleve\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eendpoint\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://search.example.com/api/search\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Optional remote endpoint for navbar client\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efuzzy\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e               \u003cspan class=\"c\"\u003e# Default fuzzy matching\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elimit\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# Default result limit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_limit\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e             \u003cspan class=\"c\"\u003e# Maximum allowed limit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecors_origins\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;*\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Allowed CORS origins\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"init\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003einit\u003c/span\u003e \u003ca href=\"#init\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eInitialize a new markata-go project with interactive setup.\u003c/p\u003e\n\u003ch4 id=\"usage-13\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-13\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go init \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"flags-9\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFlags\u003c/span\u003e \u003ca href=\"#flags-9\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--force\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOverwrite existing files\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--plain\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUse plain text prompts instead of the TUI wizard\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e (auto-detected)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"examples-11\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-11\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Start interactive project setup (uses TUI wizard when available)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go init\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Overwrite existing configuration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go init --force\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Use plain text prompts (for scripts or non-TTY environments)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go init --plain\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"interactive-flow\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInteractive Flow\u003c/span\u003e \u003ca href=\"#interactive-flow\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eThe \u003ccode\u003einit\u003c/code\u003e command provides a rich TUI (Text User Interface) wizard powered by \u003ca href=\"https://github.com/charmbracelet/huh\"\u003echarmbracelet/huh\u003c/a\u003e for an enhanced user experience. The wizard automatically falls back to plain text prompts when:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe \u003ccode\u003e--plain\u003c/code\u003e flag is specified\u003c/li\u003e\n\u003cli\u003estdin is not a TTY (e.g., when piping input or running in CI)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eTUI Mode Features:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSearchable palette selection\u003c/li\u003e\n\u003cli\u003eMulti-select for features\u003c/li\u003e\n\u003cli\u003eForm validation\u003c/li\u003e\n\u003cli\u003eStyled using your site\u0026rsquo;s configured palette (for existing projects)\u003c/li\u003e\n\u003cli\u003ePost format prompts include optional ANSI terminal output\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003ePlain mode example:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e$ markata-go init --plain\n\nWelcome to markata-go!\n\nSite title [My Site]: My Awesome Blog\nDescription [A site built with markata-go]: A blog about things\nAuthor []: Your Name\nURL [https://example.com]: https://myblog.com\n\nCreating project structure...\n  ✓ Created posts/\n  ✓ Created static/\n  ✓ Created markata-go.toml\n\nCreate your first post? (Y/n): y\nPost title [Hello World]: My First Post\n\n  ✓ Created pages/post/my-first-post.md\n\nDone! Run 'markata-go serve' to start.\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch4 id=\"what-gets-created\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat Gets Created\u003c/span\u003e \u003ca href=\"#what-gets-created\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eThe command creates:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003emarkata-go.toml\u003c/strong\u003e - Configuration file with your site settings\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eposts/\u003c/strong\u003e - Directory for your blog posts\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003estatic/\u003c/strong\u003e - Directory for static assets (images, CSS, etc.)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e(Optional) First post\u003c/strong\u003e - A starter markdown file\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch3 id=\"new\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003enew\u003c/span\u003e \u003ca href=\"#new\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate a new content file with frontmatter template.\u003c/p\u003e\n\u003ch4 id=\"usage-14\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-14\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new \u003cspan class=\"o\"\u003e[\u003c/span\u003etitle\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"arguments\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eArguments\u003c/span\u003e \u003ca href=\"#arguments\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eArgument\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eRequired\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe title of the new content\u003c/td\u003e\n\u003ctd\u003eNo (prompted if not provided)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"flags-10\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFlags\u003c/span\u003e \u003ca href=\"#flags-10\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eShort\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--template\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e-t\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eContent template to use\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epost\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--list\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e-l\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eList available templates\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eDirectory to create the content in (overrides template)\u003c/td\u003e\n\u003ctd\u003eTemplate\u0026rsquo;s default\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--draft\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eCreate as a draft\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--tags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eComma-separated list of tags\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--plain\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eUse plain text prompts instead of TUI wizard\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"built-in-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuilt-in Templates\u003c/span\u003e \u003ca href=\"#built-in-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTemplate\u003c/th\u003e\n\u003cth\u003eDirectory\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epages/post/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBlog posts with standard frontmatter\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epage\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epages/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eStatic pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edocs\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edocs/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDocumentation pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003earticle\u003c/code\u003e (\u003ccode\u003eblog-post\u003c/code\u003e, \u003ccode\u003eessay\u003c/code\u003e, \u003ccode\u003etutorial\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epages/article/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLong-form article content\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enote\u003c/code\u003e (\u003ccode\u003eping\u003c/code\u003e, \u003ccode\u003ethought\u003c/code\u003e, \u003ccode\u003estatus\u003c/code\u003e, \u003ccode\u003etweet\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epages/note/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShort note and micro-post content\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ephoto\u003c/code\u003e (\u003ccode\u003eshot\u003c/code\u003e, \u003ccode\u003eshots\u003c/code\u003e, \u003ccode\u003eimage\u003c/code\u003e, \u003ccode\u003egallery\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epages/photo/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eImage-focused posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003evideo\u003c/code\u003e (\u003ccode\u003eclip\u003c/code\u003e, \u003ccode\u003ecast\u003c/code\u003e, \u003ccode\u003estream\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epages/video/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eVideo posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elink\u003c/code\u003e (\u003ccode\u003ebookmark\u003c/code\u003e, \u003ccode\u003etil\u003c/code\u003e, \u003ccode\u003estars\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epages/link/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLink and bookmark posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003equote\u003c/code\u003e (\u003ccode\u003equotation\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epages/quote/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eQuote posts with attribution\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eguide\u003c/code\u003e (\u003ccode\u003eseries\u003c/code\u003e, \u003ccode\u003estep\u003c/code\u003e, \u003ccode\u003echapter\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epages/guide/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGuides and multi-part content\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einline\u003c/code\u003e (\u003ccode\u003egratitude\u003c/code\u003e, \u003ccode\u003emicro\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epages/inline/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInline feed-first content\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econtact\u003c/code\u003e (\u003ccode\u003echaracter\u003c/code\u003e, \u003ccode\u003eperson\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epages/contact/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eProfile/contact pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eauthor\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epages/author/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAuthor profile pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"examples-12\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-12\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create a new post (creates pages/post/my-first-post.md)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new \u003cspan class=\"s2\"\u003e\u0026#34;My First Post\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Use a different template\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new \u003cspan class=\"s2\"\u003e\u0026#34;About\u0026#34;\u003c/span\u003e --template page\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Creates: pages/about.md\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new \u003cspan class=\"s2\"\u003e\u0026#34;Getting Started\u0026#34;\u003c/span\u003e -t docs\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Creates: docs/getting-started.md\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List available templates\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new --list\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Override the template\u0026#39;s directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new \u003cspan class=\"s2\"\u003e\u0026#34;Hello World\u0026#34;\u003c/span\u003e --template post --dir blog\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Creates: blog/hello-world.md\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create as a draft (opt-in, default is published)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new \u003cspan class=\"s2\"\u003e\u0026#34;Work in Progress\u0026#34;\u003c/span\u003e --draft\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Creates: pages/post/work-in-progress.md with draft: true\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create as published (default behavior)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new \u003cspan class=\"s2\"\u003e\u0026#34;Ready to Publish\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Creates: pages/post/ready-to-publish.md with draft: false, published: true\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create with tags\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new \u003cspan class=\"s2\"\u003e\u0026#34;Go Tutorial\u0026#34;\u003c/span\u003e --tags \u003cspan class=\"s2\"\u003e\u0026#34;go,tutorial,programming\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Creates: pages/post/go-tutorial.md with tags: [\u0026#34;go\u0026#34;, \u0026#34;tutorial\u0026#34;, \u0026#34;programming\u0026#34;]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create content in another site from any directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go --site-dir ~/sites/blog new \u003cspan class=\"s2\"\u003e\u0026#34;Release notes\u0026#34;\u003c/span\u003e --no-input\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Interactive mode (no arguments) - launches TUI wizard\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# TUI wizard prompts for: template, title, directory, tags, privacy, authors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Interactive mode with plain text prompts (no TUI)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new --plain\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"template-system\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate System\u003c/span\u003e \u003ca href=\"#template-system\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eTemplates control the default frontmatter and output directory for new content.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eTemplate Discovery:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eBuilt-in templates\u003c/strong\u003e - \u003ccode\u003epost\u003c/code\u003e, \u003ccode\u003epage\u003c/code\u003e, \u003ccode\u003edocs\u003c/code\u003e, \u003ccode\u003earticle\u003c/code\u003e, \u003ccode\u003enote\u003c/code\u003e, \u003ccode\u003ephoto\u003c/code\u003e, \u003ccode\u003evideo\u003c/code\u003e, \u003ccode\u003elink\u003c/code\u003e, \u003ccode\u003equote\u003c/code\u003e, \u003ccode\u003eguide\u003c/code\u003e, \u003ccode\u003einline\u003c/code\u003e, \u003ccode\u003econtact\u003c/code\u003e, and \u003ccode\u003eauthor\u003c/code\u003e are always available\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eConfig templates\u003c/strong\u003e - Defined in \u003ccode\u003emarkata-go.toml\u003c/code\u003e under \u003ccode\u003e[content_templates]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFile templates\u003c/strong\u003e - Markdown files in \u003ccode\u003econtent-templates/\u003c/code\u003e directory\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eBuilt-in content types with aliases are shown in \u003ccode\u003emarkata-go new --list\u003c/code\u003e as \u003ccode\u003etype (aka: alias1, alias2)\u003c/code\u003e. You can also pass those aliases directly to \u003ccode\u003e--template\u003c/code\u003e; for example, \u003ccode\u003e--template ping\u003c/code\u003e resolves to the built-in \u003ccode\u003enote\u003c/code\u003e template while preserving \u003ccode\u003etemplate: ping\u003c/code\u003e in frontmatter.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration Example:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent_templates\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edirectory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;content-templates\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent_templates\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eplacement\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e       \u003cspan class=\"c\"\u003e# Override: posts go to blog/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epage\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pages\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edocs\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;documentation\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent_templates\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorial\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edirectory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebody\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;## Prerequisites\\n\\n## Steps\\n\\n## Summary\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent_templates\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efrontmatter\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplateKey\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorial\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eseries\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eFile Template Example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCreate \u003ccode\u003econtent-templates/recipe.md\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplateKey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003erecipe\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e_directory\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003erecipes\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eprep_time\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecook_time\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eservings\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Ingredients\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Instructions\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e1.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe \u003ccode\u003e_directory\u003c/code\u003e field in frontmatter sets the output directory (removed from generated content).\u003c/p\u003e\n\u003cp\u003eThe same Markdown starter files are available to the interactive TUI and web\nworkbench. Starter metadata may include \u003ccode\u003estarter.name\u003c/code\u003e,\n\u003ccode\u003estarter.description\u003c/code\u003e, and \u003ccode\u003estarter.aliases\u003c/code\u003e; this mapping is for discovery\nand does not become page frontmatter. Use\n\u003ccode\u003e{{title}}\u003c/code\u003e, \u003ccode\u003e{{slug}}\u003c/code\u003e, \u003ccode\u003e{{date}}\u003c/code\u003e, and \u003ccode\u003e{{datetime}}\u003c/code\u003e for shared substitutions\nin frontmatter values and body text. See the \u003ca href=\"../guides/content-starters.md\"\u003econtent starters guide\u003c/a\u003e\nfor an example and the \u003ca href=\"../../spec/spec/CONTENT_TEMPLATES.md\"\u003estarter specification\u003c/a\u003e\nfor compatibility and precedence rules.\u003c/p\u003e\n\u003ch4 id=\"interactive-mode\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInteractive Mode\u003c/span\u003e \u003ca href=\"#interactive-mode\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eWhen called without a title argument (or no arguments at all), the command launches an\ninteractive TUI wizard powered by \u003ca href=\"https://github.com/charmbracelet/huh\"\u003echarmbracelet/huh\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe wizard guides you through:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eTemplate selection\u003c/strong\u003e - Pick from built-in, config, and file-based templates\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTitle\u003c/strong\u003e - Enter the post title\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDirectory\u003c/strong\u003e - Choose from existing directories or enter a custom one, with config-driven defaults per template type\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTags\u003c/strong\u003e - Select from existing site tags and/or type custom tags\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePrivacy\u003c/strong\u003e - Mark the post as private\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAuthors\u003c/strong\u003e - If multiple authors are configured, choose whether to use the default or select specific authors\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSummary\u003c/strong\u003e - Review all choices before creating the file\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre\u003e\u003ccode\u003e$ markata-go new\n\n? Select a template\n  \u0026gt; post - Blog post (pages/post/)\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    page - Static page (pages/)\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    docs - Documentation (docs/)\n\n? Title: My New Post\n? Select a directory: pages/post (default)\n? Select tags: [go, tutorial]\n? Make this post private? No\n? Create my-new-post.md in pages/post/? Yes\n\nCreated: pages/post/my-new-post.md\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003ePlain text mode:\u003c/strong\u003e Use \u003ccode\u003e--plain\u003c/code\u003e or pipe input to get simple text prompts instead of the TUI.\nFalls back automatically when stdin is not a TTY.\u003c/p\u003e\n\u003ch4 id=\"generated-file\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGenerated File\u003c/span\u003e \u003ca href=\"#generated-file\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eThe command creates a markdown file with template-specific frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eMy First Post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emy-first-post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;2024-01-15\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edraft\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplateKey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epost\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ego\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003etutorial\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWrite your content here...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe generated body does not include a starter H1. markata-go renders the page title from frontmatter, so content should start with regular body text or an \u003ccode\u003e##\u003c/code\u003e heading.\u003c/p\u003e\n\u003cp\u003eThe slug is automatically generated from the title by:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eConverting to lowercase\u003c/li\u003e\n\u003cli\u003eReplacing spaces with hyphens\u003c/li\u003e\n\u003cli\u003eRemoving special characters\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"lint\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003elint\u003c/span\u003e \u003ca href=\"#lint\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eLint markdown files for common issues that can cause build failures.\u003c/p\u003e\n\u003ch4 id=\"usage-15\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-15\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lint \u003cspan class=\"o\"\u003e[\u003c/span\u003efiles...\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"arguments-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eArguments\u003c/span\u003e \u003ca href=\"#arguments-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eArgument\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eRequired\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efiles\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGlob patterns or file paths to lint\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"flags-11\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFlags\u003c/span\u003e \u003ca href=\"#flags-11\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--fix\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAutomatically fix detected issues\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"detected-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDetected Issues\u003c/span\u003e \u003ca href=\"#detected-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eThe linter checks for these common problems:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eIssue\u003c/th\u003e\n\u003cth\u003eSeverity\u003c/th\u003e\n\u003cth\u003eAuto-fixable\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eduplicate-key\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eError\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eDuplicate YAML keys in frontmatter\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einvalid-date\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWarning\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eNon-ISO 8601 date formats\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emissing-alt-text\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWarning\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eImage links without alt text \u003ccode\u003e![]()\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eprotocol-less-url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWarning\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eURLs starting with \u003ccode\u003e//\u003c/code\u003e instead of \u003ccode\u003ehttps://\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eencryption-key-policy\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eError\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eMissing or weak encryption keys based on \u003ccode\u003eencryption.*\u003c/code\u003e policy\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"examples-13\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-13\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Lint all markdown files in posts directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lint posts/*.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Lint with glob pattern (recursive)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lint \u003cspan class=\"s1\"\u003e\u0026#39;posts/**/*.md\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Lint multiple patterns\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lint posts/*.md pages/*.md docs/**/*.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Lint and auto-fix issues\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lint posts/*.md --fix\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Lint a specific file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lint posts/hello-world.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Lint with verbose output\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lint posts/*.md -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"output-format\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOutput Format\u003c/span\u003e \u003ca href=\"#output-format\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre\u003e\u003ccode\u003eposts/example.md:\n  error [line 5]: duplicate key 'title' (first occurrence at line 2)\n  warning [line 3]: invalid date format for 'date': 2020-1-15 (single-digit month/day)\n  warning [line 12, col 1]: image link missing alt text\n\n✗ 5 file(s) linted, 3 issue(s) in 1 file(s)\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch4 id=\"auto-fix-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuto-fix Behavior\u003c/span\u003e \u003ca href=\"#auto-fix-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eWhen \u003ccode\u003e--fix\u003c/code\u003e is enabled:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eIssue\u003c/th\u003e\n\u003cth\u003eFix Applied\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eduplicate-key\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eKeeps last occurrence, removes earlier duplicates\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einvalid-date\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePads single-digit months/days (e.g., \u003ccode\u003e2020-1-5\u003c/code\u003e → \u003ccode\u003e2020-01-05\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emissing-alt-text\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAdds placeholder alt text: \u003ccode\u003e![]()\u003c/code\u003e → \u003ccode\u003e![image]()\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eprotocol-less-url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAdds HTTPS protocol: \u003ccode\u003e//example.com\u003c/code\u003e → \u003ccode\u003ehttps://example.com\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"exit-codes-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExit Codes\u003c/span\u003e \u003ca href=\"#exit-codes-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCode\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e0\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo errors found (warnings are allowed)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eErrors found (or file read errors)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"use-cases\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUse Cases\u003c/span\u003e \u003ca href=\"#use-cases\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003eMigration from Python markata:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Find and fix common issues when migrating content\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lint content/**/*.md --fix\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCI/CD integration:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Fail CI if markdown has errors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lint posts/**/*.md \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"nb\"\u003eexit\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePre-commit hook:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lint \u003cspan class=\"k\"\u003e$(\u003c/span\u003egit diff --cached --name-only -- \u003cspan class=\"s1\"\u003e\u0026#39;*.md\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"config\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003econfig\u003c/span\u003e \u003ca href=\"#config\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfiguration management commands for viewing, validating, and initializing configuration.\u003c/p\u003e\n\u003ch4 id=\"usage-16\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-16\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config \u0026lt;subcommand\u0026gt; \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRunning \u003ccode\u003emarkata-go config\u003c/code\u003e with no subcommand behaves like \u003ccode\u003emarkata-go config show\u003c/code\u003e.\u003c/p\u003e\n\u003ch4 id=\"subcommands-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSubcommands\u003c/span\u003e \u003ca href=\"#subcommands-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ch5 id=\"show\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eshow\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eDisplay the resolved configuration after merging defaults, config file, and environment variables.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003econfig show\u003c/code\u003e honors the root \u003ccode\u003e--config\u003c/code\u003e and \u003ccode\u003e--merge-config\u003c/code\u003e flags, so it reports the same effective configuration used by \u003ccode\u003ebuild\u003c/code\u003e and \u003ccode\u003eserve\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config show \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--format\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOutput format: \u003ccode\u003eyaml\u003c/code\u003e, \u003ccode\u003ejson\u003c/code\u003e, or \u003ccode\u003etoml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eyaml\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--json\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOutput as JSON\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--toml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOutput as TOML\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e(none)\u003c/td\u003e\n\u003ctd\u003eOutput as YAML\u003c/td\u003e\n\u003ctd\u003edefault\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eExamples:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Show config as YAML (default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config show\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Show config as JSON\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config show --json\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Show config as TOML\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config show --toml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Show config from specific file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config show -c production.toml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Show config with merged overrides\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config show -m fast.toml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNotes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go config\u003c/code\u003e is equivalent to \u003ccode\u003emarkata-go config show\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--json\u003c/code\u003e and \u003ccode\u003e--toml\u003c/code\u003e are shorthands for \u003ccode\u003e--format json\u003c/code\u003e and \u003ccode\u003e--format toml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003econflicting combinations such as \u003ccode\u003e--json --toml\u003c/code\u003e fail with usage error exit code \u003ccode\u003e2\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch5 id=\"get\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eget\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eGet a specific configuration value using dot notation for nested keys.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config get \u0026lt;key\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eExamples:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Get top-level value\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config get output_dir\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Output: output\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Get nested value (list values print one item per line)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config get glob.patterns\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Output:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# pages/**/*.md\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# posts/**/*.md\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Get deeply nested value\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config get feed_defaults.items_per_page\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Output: 10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Get from specific config file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config get url -c production.toml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Output: https://example.com\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNotes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eValues are read directly from the config file; \u003ccode\u003econfig get\u003c/code\u003e does not synthesize absent defaults.\u003c/li\u003e\n\u003cli\u003eTOML/YAML are parsed with tree-sitter in CGO-enabled builds to preserve formatting.\u003c/li\u003e\n\u003cli\u003eCGO-disabled builds parse TOML/YAML via full decode.\u003c/li\u003e\n\u003cli\u003eJSON values may be re-emitted for structured output.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch5 id=\"set\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eset\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eSet a configuration value using dot notation for nested keys.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config \u003cspan class=\"nb\"\u003eset\u003c/span\u003e \u0026lt;key\u0026gt; \u0026lt;value\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eExamples:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Set a string value\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config \u003cspan class=\"nb\"\u003eset\u003c/span\u003e url \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Set an integer value\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config \u003cspan class=\"nb\"\u003eset\u003c/span\u003e concurrency \u003cspan class=\"m\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Set an array value (JSON syntax)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config \u003cspan class=\"nb\"\u003eset\u003c/span\u003e glob.patterns \u003cspan class=\"s1\"\u003e\u0026#39;[\u0026#34;pages/**/*.md\u0026#34;, \u0026#34;posts/**/*.md\u0026#34;]\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNotes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTOML/YAML are updated with byte-range edits to preserve formatting and comments in CGO-enabled builds.\u003c/li\u003e\n\u003cli\u003eCGO-disabled builds re-emit TOML/YAML with standard encoders.\u003c/li\u003e\n\u003cli\u003eJSON is re-emitted with stable indentation.\u003c/li\u003e\n\u003cli\u003eFile permissions are preserved.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch5 id=\"validate\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003evalidate\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eValidate the configuration file and report any errors or warnings.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003econfig validate\u003c/code\u003e honors the root \u003ccode\u003e--config\u003c/code\u003e and \u003ccode\u003e--merge-config\u003c/code\u003e flags.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config validate \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eShort\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--config\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e-c\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConfig file to validate\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eExamples:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Validate auto-discovered config, or built-in defaults if no config exists\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config validate\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Validate specific config file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config validate -c production.toml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config validate -c custom.yaml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Validate with merged overrides\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config validate -m fast.toml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eConfiguration is valid: markata-go.toml\n\n# Or with errors:\nErrors:\n  - output_dir: directory does not exist\n  - glob.patterns: at least one pattern required\n  - feeds[0].filter: invalid filter expression\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch5 id=\"init-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003einit\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eCreate a new configuration file with sensible defaults.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config init \u003cspan class=\"o\"\u003e[\u003c/span\u003efilename\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--force\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOverwrite existing config file\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eExamples:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create markata-go.toml with defaults\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config init\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create YAML config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config init markata-go.yaml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Create with specific name\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config init site.toml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Overwrite existing config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config init --force\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"aesthetic\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eaesthetic\u003c/span\u003e \u003ca href=\"#aesthetic\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eManage and inspect aesthetic presets for your site\u0026rsquo;s visual styling.\u003c/p\u003e\n\u003ch4 id=\"usage-17\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-17\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go aesthetic \u0026lt;subcommand\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"subcommands-4\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSubcommands\u003c/span\u003e \u003ca href=\"#subcommands-4\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ch5 id=\"list-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003elist\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eList all available aesthetic presets.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go aesthetic list\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eExample Output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eAvailable aesthetics:\n\n  balanced    Default. Comfortable rounding, subtle shadows, normal spacing\n  brutal      Sharp corners, thick borders, tight spacing, no shadows\n  elevated    Generous rounding, layered shadows, generous spacing\n  minimal     No rounding, maximum whitespace, no shadows, hairline borders\n  precision   Subtle corners, compact spacing, hairline borders, minimal shadows\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch5 id=\"show-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eshow\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eDisplay the details of a specific aesthetic preset.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go aesthetic show \u0026lt;name\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eArguments:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eArgument\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eRequired\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eName of the aesthetic to show\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eExamples:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Show details of the elevated aesthetic\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go aesthetic show elevated\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Show details of the brutal aesthetic\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go aesthetic show brutal\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eExample Output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eAesthetic: elevated\n\nDescription: Generous rounding, layered shadows, generous spacing\n\nValues:\n  border_radius:    16px\n  spacing_scale:    1.5\n  border_width:     0px\n  border_style:     none\n  shadow_intensity: 0.6\n  shadow_size:      lg\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch4 id=\"available-aesthetics\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAvailable Aesthetics\u003c/span\u003e \u003ca href=\"#available-aesthetics\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAesthetic\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebalanced\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault. Comfortable rounding, subtle shadows, normal spacing\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebrutal\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSharp corners, thick borders, tight spacing, no shadows\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eelevated\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerous rounding, layered shadows, generous spacing\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eminimal\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo rounding, maximum whitespace, no shadows, hairline borders\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eprecision\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSubtle corners, compact spacing, hairline borders, minimal shadows\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eSee [[themes-and-styling|Themes Guide]] for detailed aesthetic customization.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"palette\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003epalette\u003c/span\u003e \u003ca href=\"#palette\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eManage, browse, and select color palettes for your site\u0026rsquo;s theme.\u003c/p\u003e\n\u003ch4 id=\"usage-18\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-18\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette \u0026lt;subcommand\u0026gt; \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"subcommands-5\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSubcommands\u003c/span\u003e \u003ca href=\"#subcommands-5\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ch5 id=\"list-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003elist\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eList all available palettes from built-in, user, and project sources.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette list\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette list --variant dark\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette list --json\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch5 id=\"info\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003einfo\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eShow detailed information about a specific palette including colors, semantic mappings, and component colors.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette info catppuccin-mocha\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette info catppuccin-mocha --json\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch5 id=\"pick\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003epick\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eOpen an interactive full-screen TUI to browse and select a palette with live color previews. Sets the chosen palette in your config by default.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Pick and set in your config (default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette pick\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Only print the name without updating config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette pick --no-set\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eFlags:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--no-set\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOnly print the palette name without updating the config file\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe picker shows a two-panel layout with a fuzzy-filterable palette list on the left and a live color swatch preview on the right. Type to filter, arrow keys to navigate, Enter to select, Esc to cancel.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eComposability:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# View info for the palette you pick (without setting it)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette info \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003emarkata-go palette pick --no-set\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch5 id=\"check\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003echeck\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eCheck a palette for accessibility (WCAG contrast ratios).\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette check catppuccin-mocha\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch5 id=\"preview\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003epreview\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003ePreview a palette\u0026rsquo;s colors in the terminal.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette preview catppuccin-mocha\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch5 id=\"new-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003enew\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eCreate a new custom palette interactively.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette new my-brand\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch5 id=\"clone\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eclone\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eClone an existing palette as a starting point for customization.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette clone catppuccin-mocha my-custom\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch5 id=\"export\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eexport\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eExport a palette to different formats (CSS, SCSS, JSON).\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette \u003cspan class=\"nb\"\u003eexport\u003c/span\u003e catppuccin-mocha --format css\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch5 id=\"fetch\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003efetch\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eImport a palette from \u003ca href=\"https://lospec.com/palette-list\"\u003eLospec.com\u003c/a\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette fetch https://lospec.com/palette-list/sweetie-16.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSee [[themes-and-styling|Themes Guide]] for detailed palette customization.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"environment-variables-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment Variables\u003c/span\u003e \u003ca href=\"#environment-variables-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go configuration can be overridden using environment variables with the \u003ccode\u003eMARKATA_GO_\u003c/code\u003e prefix.\u003c/p\u003e\n\u003ch3 id=\"variable-naming-convention\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVariable Naming Convention\u003c/span\u003e \u003ca href=\"#variable-naming-convention\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnvironment variables follow this pattern:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePrefix: \u003ccode\u003eMARKATA_GO_\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eKey names: UPPERCASE with underscores\u003c/li\u003e\n\u003cli\u003eNested keys: Use single underscore separation\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"common-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Variables\u003c/span\u003e \u003ca href=\"#common-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_OUTPUT_DIR\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOutput directory\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edist\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_URL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite base URL\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehttps://staging.example.com\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_TITLE\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite title\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eMy Staging Site\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_CONCURRENCY\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWorker count (0=auto)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e4\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_TEMPLATES_DIR\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTemplates directory\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ethemes/custom/templates\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_ASSETS_DIR\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eStatic assets directory\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eassets\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"examples-14\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-14\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build to a different directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_OUTPUT_DIR\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003edist markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build for staging environment\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://staging.example.com markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Limit concurrency for debugging\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_CONCURRENCY\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e markata-go build -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Multiple overrides\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_OUTPUT_DIR\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003edist \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://prod.example.com \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# In CI/CD pipelines\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eDEPLOY_URL\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_OUTPUT_DIR\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;build\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"override-precedence\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOverride Precedence\u003c/span\u003e \u003ca href=\"#override-precedence\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfiguration values are resolved in this order (later sources override earlier):\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eBuilt-in defaults\u003c/li\u003e\n\u003cli\u003eConfiguration file\u003c/li\u003e\n\u003cli\u003eEnvironment variables\u003c/li\u003e\n\u003cli\u003eCommand-line flags\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"exit-codes-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExit Codes\u003c/span\u003e \u003ca href=\"#exit-codes-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go uses these common exit code patterns:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCode\u003c/th\u003e\n\u003cth\u003eName\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e0\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSuccess\u003c/td\u003e\n\u003ctd\u003eCommand completed successfully\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eError\u003c/td\u003e\n\u003ctd\u003eGeneral error (configuration, plugin, I/O, etc.)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e2\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUsage / Command-specific\u003c/td\u003e\n\u003ctd\u003eInvalid CLI usage such as unknown flags or missing args, or command-specific non-success states documented by that command\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e130\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInterrupted\u003c/td\u003e\n\u003ctd\u003eCommand interrupted by user (Ctrl+C)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"using-exit-codes-in-scripts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing Exit Codes in Scripts\u003c/span\u003e \u003ca href=\"#using-exit-codes-in-scripts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build and check for success\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e markata-go build --clean\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Build successful!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    rsync -av output/ user@server:/var/www/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Build failed with exit code \u003c/span\u003e\u003cspan class=\"nv\"\u003e$?\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eexit\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Validate before deploying\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config validate\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e \u003cspan class=\"nv\"\u003e$?\u003c/span\u003e -eq \u003cspan class=\"m\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    markata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"common-workflows\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Workflows\u003c/span\u003e \u003ca href=\"#common-workflows\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"development\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDevelopment\u003c/span\u003e \u003ca href=\"#development\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Start development server\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# In another terminal, create new content\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new \u003cspan class=\"s2\"\u003e\u0026#34;My New Post\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"production-build\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProduction Build\u003c/span\u003e \u003ca href=\"#production-build\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Clean build for production\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Or with environment-specific URL\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com markata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"ci-cd-pipeline\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCI/CD Pipeline\u003c/span\u003e \u003ca href=\"#ci-cd-pipeline\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eset\u003c/span\u003e -e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Validate configuration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config validate\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build with production settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eDEPLOY_URL\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e markata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Deploy (example)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eaws s3 sync output/ s3://my-bucket/ --delete\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSee [[deployment-guide|Deployment]] for detailed deployment guides.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"migrate\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003emigrate\u003c/span\u003e \u003ca href=\"#migrate\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eMigrate from Python markata to markata-go. Analyzes configuration files, filter expressions, and templates for compatibility.\u003c/p\u003e\n\u003ch4 id=\"usage-19\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-19\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate config \u003cspan class=\"o\"\u003e[\u003c/span\u003eflags\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate filter \u003cspan class=\"o\"\u003e[\u003c/span\u003eexpression\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate templates \u003cspan class=\"o\"\u003e[\u003c/span\u003epath\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"flags-12\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFlags\u003c/span\u003e \u003ca href=\"#flags-12\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eShort\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--input\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e-i\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInput config file path\u003c/td\u003e\n\u003ctd\u003eAuto-detect\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--output\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e-o\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOutput config file path\u003c/td\u003e\n\u003ctd\u003eNone\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--dry-run\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e-n\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow changes without writing\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--format\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e-f\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOutput format (toml, yaml)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etoml\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--json\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eOutput results as JSON\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"subcommands-6\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSubcommands\u003c/span\u003e \u003ca href=\"#subcommands-6\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ch5 id=\"config-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003econfig\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eMigrate configuration file only.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate config -i markata.toml -o markata-go.toml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch5 id=\"filter\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003efilter\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eCheck and migrate filter expressions.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check a specific expression\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate filter \u003cspan class=\"s2\"\u003e\u0026#34;published == \u0026#39;True\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check all filters in config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate filter\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch5 id=\"templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003etemplates\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eCheck template compatibility with pongo2.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate templates\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate templates ./my-templates\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"examples-15\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-15\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Full migration analysis\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Dry run to see what would change\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate --dry-run\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Migrate and write output\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate -o markata-go.toml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Migrate from pyproject.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate -i pyproject.toml -o markata-go.toml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check a filter expression\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate filter \u003cspan class=\"s2\"\u003e\u0026#34;templateKey in [\u0026#39;blog\u0026#39;, \u0026#39;til\u0026#39;]\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check templates for compatibility\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate templates\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"exit-codes-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExit Codes\u003c/span\u003e \u003ca href=\"#exit-codes-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCode\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e0\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMigration successful, no issues\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMigration completed with warnings\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e2\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMigration has incompatibilities\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e3\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMigration failed (invalid input)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eSee [[migration-guide|Migration Guide]] for detailed migration instructions.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"explain\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eexplain\u003c/span\u003e \u003ca href=\"#explain\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eShow detailed information about markata-go for AI agents and developers.\u003c/p\u003e\n\u003ch4 id=\"usage-20\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-20\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go explain \u003cspan class=\"o\"\u003e[\u003c/span\u003etopic\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"arguments-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eArguments\u003c/span\u003e \u003ca href=\"#arguments-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eArgument\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eRequired\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etopic\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe topic to explain\u003c/td\u003e\n\u003ctd\u003eNo (shows overview if omitted)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"available-topics\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAvailable Topics\u003c/span\u003e \u003ca href=\"#available-topics\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTopic\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e(none)\u003c/td\u003e\n\u003ctd\u003eGeneral overview of markata-go\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebuild\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe build command and build process\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eserve\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe development server\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enew\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCreating new content\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econtent\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFinding, creating, and editing site content\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einit\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInitializing projects\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConfiguration system\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eagents\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAgent skill installation and usage\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eplugins\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePlugin system and development\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elifecycle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBuild lifecycle stages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etemplates\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTemplate system\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeeds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFeed generation system\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"examples-16\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-16\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Show general overview\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go explain\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Get detailed info about the build process\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go explain build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Learn about the plugin system\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go explain plugins\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Learn about the bundled agent skill\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go explain agents\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Follow the agent-oriented content workflow\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go explain content\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Understand the build lifecycle\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go explain lifecycle\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Learn about feeds and filtering\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go explain feeds\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"use-cases-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUse Cases\u003c/span\u003e \u003ca href=\"#use-cases-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eThe \u003ccode\u003eexplain\u003c/code\u003e command is particularly useful for:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eAI coding agents\u003c/strong\u003e: Provides comprehensive context about markata-go\u0026rsquo;s architecture and commands\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eContent work from any directory\u003c/strong\u003e: \u003ccode\u003eexplain content\u003c/code\u003e documents how to select a site, search, edit returned source paths, create content, and validate changes\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSite maintainers installing the bundled skill\u003c/strong\u003e: Shows how \u003ccode\u003emarkata-go agent install\u003c/code\u003e fits into agent workflows\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNew developers\u003c/strong\u003e: Quick reference for understanding how different parts work together\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDebugging\u003c/strong\u003e: Understanding the build process and configuration options\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eWriting plugins\u003c/strong\u003e: Learning the plugin interfaces and lifecycle stages\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"encryption\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eencryption\u003c/span\u003e \u003ca href=\"#encryption\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUtilities for managing encryption passwords.\u003c/p\u003e\n\u003ch4 id=\"subcommands-7\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSubcommands\u003c/span\u003e \u003ca href=\"#subcommands-7\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ch5 id=\"generate-password\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003egenerate-password\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eGenerate a password that satisfies the default encryption policy (≥ 14 characters, strong entropy).\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emarkata-go encryption generate-password [--length \u0026lt;n\u0026gt;]\n\u003c/code\u003e\u003c/pre\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eShort\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--length\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eDesired password length (must be at least the configured minimum)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e14\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe command prints only the generated password to stdout, making it easy to pipe into environment files or password managers. The optional \u003ccode\u003e--length\u003c/code\u003e flag requests a longer password; the minimum is always at least the configured \u003ccode\u003emin_password_length\u003c/code\u003e.\u003c/p\u003e\n\u003ch4 id=\"examples-17\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-17\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre\u003e\u003ccode\u003e# Generate a default length password\nmarkata-go encryption generate-password\n\n# Generate a longer password for a stricter key\nmarkata-go encryption generate-password --length 20\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch5 id=\"check-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003echeck\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eCheck configured encryption keys against the active policy.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emarkata-go encryption check [--key \u0026lt;name\u0026gt;]\n\u003c/code\u003e\u003c/pre\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eShort\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--key\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eCheck a specific key name instead of all configured keys\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eBy default this command checks all keys referenced by \u003ccode\u003eencryption.default_key\u003c/code\u003e and \u003ccode\u003eencryption.private_tags\u003c/code\u003e.\nIt fails with a non-zero exit code if any key is missing from environment variables or too weak for the configured policy.\u003c/p\u003e\n\u003ch5 id=\"encrypt-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eencrypt-posts\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eEncrypt all private Markdown source bodies matched by the active content glob configuration.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emarkata-go encryption encrypt-posts [--dry-run]\n\u003c/code\u003e\u003c/pre\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eShort\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--dry-run\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eReport files that would be encrypted without modifying them\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe command rewrites matching private posts in place by default. It skips draft, skipped, public, and already source-encrypted posts. Missing or weak keys fail before any files are written.\u003c/p\u003e\n\u003ch5 id=\"decrypt-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003edecrypt-posts\u003c/span\u003e\u003c/h5\u003e\n\u003cp\u003eDecrypt source-encrypted Markdown bodies back to plaintext. This is the inverse of \u003ccode\u003eencrypt-posts\u003c/code\u003e.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emarkata-go encryption decrypt-posts [path...] [--dry-run]\n\u003c/code\u003e\u003c/pre\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFlag\u003c/th\u003e\n\u003cth\u003eShort\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--dry-run\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eReport files that would be decrypted without modifying them\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eWith no path arguments the command scans the active content glob configuration. Explicit paths may be files or\ndirectories (directories are scanned recursively for \u003ccode\u003e.md\u003c/code\u003e files).\u003c/p\u003e\n\u003cp\u003eThe key name is read from the \u003ccode\u003e\u0026lt;!-- markata-encrypted-source:v1 key=... --\u0026gt;\u003c/code\u003e marker, falling back to\n\u003ccode\u003eencryption.default_key\u003c/code\u003e. The password is read from \u003ccode\u003eMARKATA_GO_ENCRYPTION_KEY_\u0026lt;KEY\u0026gt;\u003c/code\u003e. Files that are not\nsource-encrypted are skipped, and frontmatter is preserved exactly as written.\u003c/p\u003e\n\u003ch4 id=\"examples-18\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-18\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre\u003e\u003ccode\u003e# Preview source encryption changes\nmarkata-go encryption encrypt-posts --dry-run\n\n# Encrypt private post source bodies in place\nmarkata-go encryption encrypt-posts\n\n# Decrypt a single file so you can edit it\nexport MARKATA_GO_ENCRYPTION_KEY_DEFAULT='your-password'\nmarkata-go encryption decrypt-posts pages/ar-calibration.md\n\n# Preview decrypting every encrypted post\nmarkata-go encryption decrypt-posts --dry-run\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[[getting-started|Getting Started]] - Quick introduction to markata-go\u003c/li\u003e\n\u003cli\u003e[[configuration-guide|Configuration]] - Detailed configuration reference\u003c/li\u003e\n\u003cli\u003e[[deployment-guide|Deployment]] - Deployment guides for various platforms\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"editorial-authoring\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEditorial authoring\u003c/span\u003e \u003ca href=\"#editorial-authoring\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCommit selected post edits with transparent contributor credit and exact\nrevision links. These commands preserve unrelated staged and unstaged work.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go editorial start posts/article.md --author editor-id --role copy-editor\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go editorial finish --session UUID --summary \u003cspan class=\"s2\"\u003e\u0026#34;Corrected grammar\u0026#34;\u003c/span\u003e --json\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go editorial commit posts/article.md --author human-id \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --role internal-link-editor --summary \u003cspan class=\"s2\"\u003e\u0026#34;Added related links\u0026#34;\u003c/span\u003e --dry-run\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003estart\u003c/code\u003e requires clean tracked posts; \u003ccode\u003ecommit\u003c/code\u003e explicitly attributes existing\nowned changes. \u003ccode\u003efinish\u003c/code\u003e appends revision records after the content SHA exists.\nUse \u003ccode\u003e--json\u003c/code\u003e to obtain the full list of resulting commits. See\n\u003ca href=\"../../guides/editorial-authoring/\"\u003eEditorial authoring\u003c/a\u003e and\n\u003ca href=\"../../guides/editorial-history/\"\u003eEditorial history\u003c/a\u003e for ownership rules,\nprimary author configuration, and the built-site comparison view.\u003c/p\u003e\n\u003ch2 id=\"render-markdown-without-a-site\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRender Markdown without a site\u003c/span\u003e \u003ca href=\"#render-markdown-without-a-site\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprintf\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;# Hello\\n\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e markata render\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprintf\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;# Hello\\n\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e markata render --json --inline-assets\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003erender\u003c/code\u003e reads stdin. \u003ccode\u003e--json\u003c/code\u003e returns the HTML fragment, feature signals and\nordered CSS/JS assets. \u003ccode\u003e--inline-assets\u003c/code\u003e embeds all bundled assets, including\nMermaid and Chart.js libraries, into the returned asset tags. \u003ccode\u003e--asset-base\u003c/code\u003e\nsets the linked asset URL prefix (default \u003ccode\u003e/markata-assets\u003c/code\u003e). \u003ccode\u003e--unsafe\u003c/code\u003e permits\nraw authored HTML for trusted content. No site build or configuration is needed.\nSee \u003ca href=\"/docs/guides/python-renderer/\"\u003ePython and FastAPI rendering\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003emarkata render --appearance\u003c/code\u003e emits versioned JSON with reusable appearance picker\nmarkup, ordered style/script paths, and base64 asset bytes. It does not read stdin.\nHost applications serve these assets and insert the controls in their own layouts.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003emarkata render --capabilities\u003c/code\u003e emits the standalone renderer\u0026rsquo;s versioned JSON\ncontract without reading stdin. Check its \u003ccode\u003efeatures\u003c/code\u003e, \u003ccode\u003ediagram_modes\u003c/code\u003e, and\n\u003ccode\u003easset_modes\u003c/code\u003e before selecting an integration path. The report describes the\nstandalone renderer, not site-build plugins or a selected workspace. Do not\ncombine this flag with \u003ccode\u003e--appearance\u003c/code\u003e or \u003ccode\u003e--workspace\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eUse \u003ccode\u003emarkata render --stdio\u003c/code\u003e for a long-running JSON Lines session. Send one\nJSON request per line with \u003ccode\u003eid\u003c/code\u003e, \u003ccode\u003eop\u003c/code\u003e, and, for rendering, \u003ccode\u003esource\u003c/code\u003e. Each\nnonempty request receives one JSON response line. Use \u003ccode\u003eop: \u0026quot;capabilities\u0026quot;\u003c/code\u003e to\ninspect support and \u003ccode\u003eop: \u0026quot;shutdown\u0026quot;\u003c/code\u003e to stop the process. Set render options\nper request in \u003ccode\u003eoptions\u003c/code\u003e; the command rejects \u003ccode\u003e--workspace\u003c/code\u003e and other render\nmode flags with \u003ccode\u003e--stdio\u003c/code\u003e. See the \u003ca href=\"../../spec/spec/RENDERER_STDIO.md\"\u003estdio protocol\u003c/a\u003e\nfor framing, limits, errors, and a working example.\u003c/p\u003e\n\u003ch2 id=\"go-markdown-workbench-demo\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGo Markdown workbench demo\u003c/span\u003e \u003ca href=\"#go-markdown-workbench-demo\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFrom a source checkout, run the separate demo command:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego run ./cmd/markata-workbench --listen 127.0.0.1:8767\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe default listen address is \u003ccode\u003e127.0.0.1:8766\u003c/code\u003e. Use \u003ccode\u003e--help\u003c/code\u003e for command help.\nThe \u003ca href=\"../guides/go-workbench/\"\u003eGo workbench guide\u003c/a\u003e covers editing, the render API,\nand embedding its HTTP handler in a Go application.\u003c/p\u003e\n\u003ch3 id=\"browser-lsp-bridge\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBrowser LSP bridge\u003c/span\u003e \u003ca href=\"#browser-lsp-bridge\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lsp --browser-workspace /absolute/path/to/site\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis option keeps the stdio transport and confines a browser bridge to a server-selected workspace.\nIt accepts the synthetic \u003ccode\u003e.markata/browser-draft.md\u003c/code\u003e URI and ignores browser requests to read watched files.\nThe \u003ca href=\"../guides/fastapi-editor/\"\u003eFastAPI editor\u003c/a\u003e uses this option behind its WebSocket endpoint.\nOrdinary editor clients continue to use \u003ccode\u003emarkata-go lsp\u003c/code\u003e without this option.\u003c/p\u003e\n\u003cp\u003eThe \u003ca href=\"../guides/go-workbench/\"\u003eGo editor example\u003c/a\u003e provides its own launch command:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego run ./cmd/markata-workbench --workspace /absolute/path/to/site\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003e--workspace\u003c/code\u003e selects the Markdown directory for completion. It defaults to the current directory.\u003c/p\u003e\n\u003ch3 id=\"workspace\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eworkspace\u003c/span\u003e \u003ca href=\"#workspace\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eList discovered source metadata as JSON with \u003ccode\u003emarkata workspace --workspace PATH\u003c/code\u003e.\nRead original source with \u003ccode\u003emarkata workspace --workspace PATH --file posts/hello.md\u003c/code\u003e.\nSee the \u003ca href=\"/docs/guides/renderer-site-tree/\"\u003eworkspace file tree guide\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eUse \u003ccode\u003emarkata workspace --paths --workspace PATH\u003c/code\u003e to list discovered source paths\nwithout loading document metadata. The editor uses this fast path on startup and\nloads titles and tags in the background.\u003c/p\u003e\n",
      "content_text": "\n\nmarkata-go provides a command-line interface for building, serving, and managing your static site.\n\n## Overview\n\nThe markata-go CLI follows a subcommand pattern similar to tools like `git` and `docker`. Each command has its own set of flags, with some global flags available across all commands.\n\n```bash\nmarkata-go [global flags] \u003ccommand\u003e [command flags] [arguments]\n```\n\nThe common short forms are `b` for `build`, `s` and `serv` for `serve`, `a` for\n`admin`, and `ls` for `list`. For example, `markata-go s --bind 0.0.0.0` starts the development\nserver on every network interface. `--bind` and `--host` select the same\nlistening address; if both are set, their values must agree.\nThe semantic names `dev` and `preview` suggest `serve` but do not execute it.\n\nIf a command, flag, or config key is misspelled, markata-go suggests close\nmatches and shows the exact help command to run. A clear alias executes; a\nsemantic synonym or typo only suggests. Suggestions are advisory: the\nCLI never executes or writes a guessed name. For example:\n\n```text\nError: unknown flag: --hst\nDid you mean:\n  --host\nNext: Run 'markata-go serve --help' to see valid flags.\n```\n\nUnknown command names exit with status `2`. The direct file shortcut accepts\nMarkdown paths such as `markata-go post.md`; other unknown names produce an\nerror. Errors use color when `stderr` is a terminal, and plain text when it is\nredirected or `--no-color` is set.\n\nFor a one-file preview, pass a Markdown file directly. The file is rendered\nwith the default theme and published at the site root (`\u003coutput\u003e/index.html`),\nalong with the theme's CSS, JS, and fonts. Site-wide output is skipped: feeds,\nthe archive, tag/feed listings, sitemaps, `.well-known` files, the image\nlibrary, 404 page, and the Pagefind search index (search UI is hidden). The\nbuild cache is not used, so a single-file build never touches the full-site\ncache:\n\n```bash\nmarkata-go pages/sample.md\n# equivalent:\nmarkata-go build pages/sample.md\n# live preview of just that file, rebuilt on every change:\nmarkata-go serve pages/sample.md\n```\n\n## Agent-assisted troubleshooting: `triage`\n\n`markata triage` collects a small, privacy-conscious diagnostic summary and passes a troubleshooting prompt to an interactive coding agent, clipboard, or stdout. The default is a fuzzy picker of **detected installed** coding agents plus clipboard and stdout. When either terminal stream is redirected or `--no-input` is used, it prints **only the Markdown prompt** to stdout.\n\n```sh\nmarkata triage\nmarkata triage --to opencode\nmarkata triage --agent claude\nmarkata triage --issue \"My posts aren't appearing\" --to clipboard\nmarkata triage --to stdout | codex exec -\nmarkata triage --to stdout \u003e triage-prompt.md\n```\n\n| Flag | Description | Default |\n| --- | --- | --- |\n| `--to` | `auto`, `stdout`, `clipboard`, `opencode`, `claude`, `codex`, `gemini`, or `cursor` | `auto` |\n| `--agent` | Convenience alias for an installed agent name; cannot be combined with `--to` | none |\n| `--issue` | Optional brief user-provided problem description (up to 4000 bytes) | none |\n\nOnly supported agent executables found on PATH are offered. An explicit agent launch needs a terminal so the agent can ask follow-up questions. For pipelines use stdout and the selected agent's own noninteractive mode. Clipboard uses local platform helpers and fails clearly if unavailable. No agent is launched automatically in a noninteractive session.\n\nThe prompt contains the **running CLI** version, not necessarily the version where the bug occurred, plus OS, architecture, runtime, executable/install hints, project path and **config filenames only**. It never reads config values, logs, full environment values or secrets. Review local paths before sharing a prompt. The agent should first clarify the user's issue, confirm the actual affected version/deployment and ask before applying changes.\n\nFor examples and privacy details, see [Triage a Markata problem](../guides/triage.md).\n\n## Global Flags\n\nThese flags are available for all commands:\n\n| Flag | Short | Description | Default |\n|------|-------|-------------|---------|\n| `--config` | `-c` | Path to configuration file | Auto-discovered |\n| `--site-dir` | | Site directory for all site operations | `MARKATA_GO_SITE_DIR` or current directory |\n| `--merge-config` | `-m` | Additional config file(s) to merge (can be used multiple times) | None |\n| `--output` | `-o` | Output directory (overrides config) | From config (`output` built-in default) |\n| `--quiet` | `-q` | Suppress non-essential progress and status output | `false` |\n| `--verbose` | `-v` | Enable verbose output | `false` |\n| `--color` | | Force ANSI color output | `false` |\n| `--no-color` | | Disable ANSI color on all streams | `false` |\n| `--log-format` | | Log formatting: `auto`, `plain`, or `rich` | `auto` |\n| `--no-input` | | Disable prompts and interactive UI | `false` |\n\n### Config File Discovery\n\nWhen `--config` is not specified, markata-go searches for configuration files in the following order:\n\n1. `markata-go.toml`\n2. `markata-go.yaml`\n3. `markata-go.yml`\n4. `markata-go.json`\n5. `~/.config/markata-go/config.toml`\n\nIf none is found, commands that load the full site configuration continue with\nbuilt-in defaults plus `MARKATA_GO_*` environment overrides. Commands that edit\nor read a value directly from a config file, such as `config get` and\n`config set`, require a config file.\n\nSee [[configuration-guide|Configuration]] for details on configuration options.\n\n### Site Directory\n\nUse `--site-dir` to run a command against a site from any directory. Set\n`MARKATA_GO_SITE_DIR` to use the same site in a shell alias or wrapper. The flag\ntakes precedence over the environment variable, which takes precedence over the\ncurrent directory.\n\n```bash\nalias blog='markata-go --site-dir \"$HOME/sites/blog\"'\nalias work-notes='markata-go --site-dir \"$HOME/notes/work\"'\n\nblog search \"release process\" --format path\nwork-notes new \"Weekly review\" --template note --no-input\n```\n\nThe selected directory must exist. Configuration discovery, relative\n`--config` and `--merge-config` paths, content templates, linting, and caches\nall resolve from that directory. `list` and `search` print absolute Markdown\nsource paths when a site directory is explicit, so their results can be edited\ndirectly.\n\n### CLI UX Conventions\n\nmarkata-go follows a few shared CLI rules:\n\n- primary command results are written to `stdout`\n- warnings, progress, prompts, and errors are written to `stderr`\n- interactive terminal output uses color by default when the target stream is a TTY\n- operational logs use centralized formatting; `--log-format auto` chooses rich logs for TTYs and plain logs otherwise\n- `--color` and `FORCE_COLOR` force ANSI color output, while `--no-color` disables it everywhere\n- rich logs can use structured metadata such as lifecycle phase, and builds/serve runs can tint log colors from the configured site palette\n- color is enabled by default for interactive terminal streams and disabled for\n  redirected streams; `NO_COLOR` (any non-empty value) and `TERM=dumb` disable\n  automatic color\n- `--color` or `FORCE_COLOR` overrides automatic detection; `--no-color` and\n  `--log-format plain` always disable color\n- terminal logs, help, prompts, and TUIs use the configured site palette when\n  available, with one shared CLI theme as the fallback\n- interactive commands such as `new` and `init` honor `--no-input`\n- commands that expose structured data should prefer explicit machine-readable\n  modes such as `--json` or `--format json`\n\nDocs: https://github.com/WaylonWalker/markata-go/tree/main/docs\n\nIssues: https://github.com/WaylonWalker/markata-go/issues\n\n---\n\n## Commands\n\n### version\n\nPrint the version, commit, build date, Go runtime, and platform for this CLI\nbinary. Release and container builds inject the version, commit, and build date\nat compile time. Use `--short` when a script needs only the version string.\n\n```bash\nmarkata-go version\nmarkata-go version --short\n```\n\n### lsp\n\nStart the Markdown language server, check its local prerequisites, or print\neditor setup guidance.\n\n```bash\nmarkata-go lsp\nmarkata-go lsp doctor\nmarkata-go lsp doctor --no-verify-editor\nmarkata-go lsp setup\nmarkata-go lsp setup --editor neovim\n```\n\n`markata-go lsp` communicates using LSP over standard input and output. It\nprovides wikilink completion, broken-wikilink diagnostics, hover information,\nand go-to-definition for Markdown files.\n\n| Subcommand | Description |\n| --- | --- |\n| `doctor` | Read-only check of the LSP binary, active project configuration, and installed editors |\n| `setup --editor \u003cname\u003e` | Print a copy-paste editor configuration snippet without editing files |\n\n`setup` supports `generic`, `neovim`, `helix`, `emacs`, `zed`, and `vscode`.\nUse `generic` for another client. Editor recipes are guidance for documented\nclient configuration surfaces, not a guarantee that every editor version can be\nconfigured automatically. See [[editor-integration|Editor Integration]] for\nfull instructions.\n\nBy default, `doctor` performs headless validation for installed Neovim, Helix,\nand Emacs configurations. This can load user startup/plugin code. Pass\n`--no-verify-editor` to only detect installed editors. VS Code, Cursor, and\nZed detection is advisory because their LSP clients do not expose stable\nheadless verification APIs.\n\nWhen verification is skipped and a deeper check is available, `doctor` prints\nthe default follow-up command to stderr.\n\nOn an interactive terminal, the doctor report derives its status colors from\nthe configured site palette while retaining text labels for each status.\n\nInteractive help and human-facing setup headings also use the configured site\npalette. If a site palette cannot be resolved, Markata falls back to its default\nCLI theme; structured command output remains uncolored for scripting.\n\nWhen `--editor` is omitted, `setup` prints snippets for each supported editor\ninstalled on `PATH`; it prints the generic integration contract if none are\nfound. Multiple snippets have editor headings and are syntax highlighted on an\ninteractive terminal; redirected output remains plain text.\n\nThe LSP server reads TOML and `.yaml` configuration for mention indexing. If\nyour valid site configuration is `.yml` or `.json`, `doctor` warns that those\nLSP-specific mentions are unavailable.\n\n### agent\n\nInstall bundled agent integrations for markata-go site repositories.\n\n#### Usage\n\n```bash\nmarkata-go agent install [site-path] [flags]\nmarkata-go agent setup [site-path] [flags]\n```\n\n#### Subcommands\n\n##### list-agents\n\nList the supported agent identifiers and their project/global skill directories.\n\n##### install\n\nInstall the bundled `markata-go-site` skill into a repository.\n`setup` is an alias for `install`.\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `--agent` | Install for a specific agent such as `opencode`, `claude-code`, or `cursor` | auto-detected, else `universal` |\n| `-g`, `--global` | Install into the selected agent's user-level skill directory | `false` |\n| `--name` | Installed skill directory name | `markata-go-site` |\n| `--force` | Overwrite bundled skill files if they already exist | `false` |\n| `--dry-run` | Show what would be installed without writing files | `false` |\n\nOn an interactive terminal with no explicit agent, the command detects installed\nagents and offers to install for all of them. Declining opens the fuzzy picker.\nAgents that share an installation directory are installed only once. EOF cancels\nthe confirmation. If one installation fails, prior successful installations\nremain and the error names the failed agent.\n\nWith `--global` and no agent, an interactive terminal opens a fuzzy picker when\nno detected agents are available.\nThe picker places the prompt below the results, like fzf, and colors the selection and matching characters.\n`--no-color` and `NO_COLOR` disable the colors.\nType to filter, use Up/Down to navigate, and press Enter to select.\nEscape or Ctrl+C cancels without an installation.\nNon-interactive project installs keep the environment-detected agent or fall\nback to `universal`. Non-interactive global installs require an explicit agent,\nsuch as `--agent github-copilot`.\nUnknown names show close matches without selecting one automatically.\nFor example, `--agent copilot` suggests `--agent github-copilot`.\n\n##### update\n\nUpdate the installed `markata-go-site` skill in place.\n\nThis is the user-friendly equivalent of reinstalling with `--force`.\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `--agent` | Update a specific agent install such as `opencode` or `claude-code` | auto-detected, else `universal` |\n| `-g`, `--global` | Update the selected agent's user-level skill directory | `false` |\n| `--name` | Installed skill directory name | `markata-go-site` |\n| `--dry-run` | Show what would be updated without writing files | `false` |\n\n##### doctor\n\nCheck the installed skill for drift against the versions bundled in the current binary. Reports files that are modified, missing, or newly added since the skill was installed.\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `--agent` | Check a specific agent install such as `opencode` or `claude-code` | auto-detected, else `universal` |\n| `-g`, `--global` | Check the selected agent's user-level skill directory | `false` |\n| `--name` | Installed skill directory name | `markata-go-site` |\n\nExit codes:\n\n| Code | Meaning |\n|------|---------|\n| `0` | Skill is up to date |\n| `1` | Drift detected |\n| `2` | Error (skill not installed, manifest unreadable) |\n\n##### remove\n\nRemove the installed `markata-go-site` skill directory.\n\n`uninstall` is an alias for `remove`.\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `--agent` | Remove a specific agent install such as `opencode` or `claude-code` | auto-detected, else `universal` |\n| `-g`, `--global` | Remove from the selected agent's user-level skill directory | `false` |\n| `--name` | Installed skill directory name | `markata-go-site` |\n\n#### Examples\n\n```bash\n# Install into the detected agent's project layout\nmarkata-go agent install\n\n# List supported agent ids and paths\nmarkata-go agent list-agents\n\n# Install into Claude Code's .claude layout\nmarkata-go agent install --agent claude-code\n\n# Install into OpenCode's global skill directory\nmarkata-go agent install --agent opencode -g\n\n# Preview files without writing\nmarkata-go agent install --dry-run\n\n# Install into a different repository\nmarkata-go agent install ../my-site\n\n# Replace an existing installed skill\nmarkata-go agent install --force\n\n# Update an installed skill in place\nmarkata-go agent update\n\n# Preview an update without writing\nmarkata-go agent update --dry-run\n\n# Check for drift after upgrading the binary\nmarkata-go agent doctor\n\n# Check a Claude Code layout\nmarkata-go agent doctor --agent claude-code\n\n# Check a global OpenCode install\nmarkata-go agent doctor --agent opencode -g\n\n# Check a different repository\nmarkata-go agent doctor ../my-site\n\n# Remove an installed skill\nmarkata-go agent remove\n\n# Alias for remove\nmarkata-go agent uninstall\n\n# Remove a Claude Code install\nmarkata-go agent remove --agent claude-code\n\n# Remove a global OpenCode install\nmarkata-go agent remove --agent opencode -g\n```\n\n#### Installed Layouts\n\n- detected agent or `universal`: project install into that agent's project skill path\n- `--agent claude-code`: `.claude/skills/markata-go-site/`\n- `--agent opencode`: `.agents/skills/markata-go-site/`\n- `--agent opencode -g`: `~/.config/opencode/skills/markata-go-site/`\n\nThe installed skill is split into `SKILL.md` plus focused topic files under `topics/`, reference material under `reference/`, starter files under `examples/`, and regression prompts under `evals/` so agents can read only the sections relevant to the current task while maintainers still have a starter eval set for bundled-skill reviews. A `.manifest.json` file is written alongside the skill for drift detection via `agent doctor`.\n\nWhen `-g` is used, `--agent` is required and `site-path` is not accepted.\n\nThe `agent` command group is intentionally generic so future subcommands can add export or MCP-oriented integrations without changing the bundled skill format.\n\n### assets\n\nManage external CDN assets used by self-hosted/vendor asset mode.\n\n#### Usage\n\n```bash\nmarkata-go assets \u003csubcommand\u003e\n```\n\n#### Subcommands\n\n##### download\n\nDownload all registered external assets into the configured asset cache, defaulting to `.markata/assets-cache`. This includes the Web Awesome npm archive so builder images can pre-seed the cache for offline site builds.\n\n```bash\nmarkata-go assets download\n```\n\n##### list\n\nList registered assets and whether each one is available in the asset cache.\n\n```bash\nmarkata-go assets list\n```\n\n##### clean\n\nRemove the asset cache so assets are fetched again on the next download/build.\n\n```bash\nmarkata-go assets clean\n```\n\n### build\n\nBuild the static site by processing all content files through the plugin lifecycle.\n\n#### Usage\n\n```bash\nmarkata-go build [flags]\n```\n\n#### Flags\n\n| Flag | Short | Description | Default |\n|------|-------|-------------|---------|\n| `--clean` | | Remove output directory and build cache before building | `false` |\n| `--clean-all` | | Also remove external plugin caches before building | `false` |\n| `--dry-run` | | Show what would be built without writing files | `false` |\n| `--fast` | | Skip minification, CSS purge, Tailwind rebuilds, and Pagefind indexing | `false` |\n| `--dag` | | Use the experimental serial DAG executor | `false` |\n| `--benchmark-json` | | Write benchmark details as JSON; use `-` for stdout | `\"\"` |\n| `--benchmark-summary-json` | | Write compact benchmark JSON without content entries; use `-` for stdout | `\"\"` |\n| `--benchmark-detailed` | | Print per-stage benchmark resource summaries | `false` |\n| `--verbose` | `-v` | Enable verbose logging | `false` |\n| `--output` | `-o` | Override output directory | from config |\n\n#### Examples\n\n```bash\n# Standard build\nmarkata-go build\n\n# Clean build (replaces output after the new build succeeds)\nmarkata-go build --clean\n\n# Also clear external plugin caches\nmarkata-go build --clean-all\n\n# Preview what would be built\nmarkata-go build --dry-run\n\n# Fast dev build\nmarkata-go build --fast\n\n# Experimental serial task graph\nmarkata-go build --dag\n\n# Build with verbose output\nmarkata-go build -v\n\n# Build to a custom output directory\nmarkata-go build -o dist\n\n# Build with a specific config file\nmarkata-go build -c production.toml\n\n# Combine flags\nmarkata-go build --clean -v -o dist\n```\n\n#### Content diagnostics\n\nEvery build prints a `Content:` summary. It counts discovered files, content\ncandidates, loaded sources, valid frontmatter, posts, eligible posts, rendered\nposts, emitted outputs, exclusions, warnings, and errors.\n\nContent diagnostics identify the source path, line, stable reason code, and a\nshort message. For example, a frontmatter opening of `----` reports\n`frontmatter.suspicious_delimiter`; it does not silently discard the file.\nMalformed author content is isolated to that source, but source stat, read, and\nother filesystem errors still fail the build.\n\nUse `-v` to show the final disposition and reason codes for every excluded or\nshadow source:\n\n```text\nContent dispositions:\n  posts/draft.md [excluded]: content.draft\n  posts/review.md [shadow]: content.published_false\n```\n\nThe JSON written by `--benchmark-json` includes the same sanitized content\nsnapshot under `content`. It does not include raw frontmatter, environment\nvalues, secrets, or build logs.\n\nA successful full build writes the sanitized\ncontent diagnostics artifact to `\u003coutput_dir\u003e/.markata/diagnostics.json`. It includes a versioned schema,\nsummary counts, per-source dispositions, stable reason codes, and feed-level\nselection details. Inspect it with a JSON tool such as:\n\n```bash\njq . output/.markata/diagnostics.json\n```\n\nUse the configured output directory instead of `output` when it differs. The\nartifact is not written by `build --dry-run`, `build --fast`, fast or incremental\n`serve`, or an incomplete or failed build. A normal `serve` build can write the\nartifact after a successful full lifecycle. See [[content-diagnostics|Content Diagnostics]]\nfor the field and privacy contract.\n\n### buildlab\n\nCompare baseline and candidate builds in isolated workspaces.\n\n#### Usage\n\n```bash\nmarkata-go buildlab run --fixture PATH [flags]\n```\n\nBuild Lab runs ordinary `build` commands. It does not use a task graph or an\nexperimental scheduler. Each checkpoint compares clean baseline output with\nclean candidate output, candidate incremental output when available, and a\nsecond clean candidate build when determinism checks are enabled.\n\n#### Flags\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `--fixture` | Site fixture directory | required |\n| `--baseline` | Baseline markata-go binary | current executable |\n| `--candidate` | Candidate markata-go binary | current executable |\n| `--build-config` | Config path relative to the fixture | `markata-go.toml` |\n| `--scenario` | Versioned scenario JSON file | clean/no-op scenario |\n| `--result` | Write the JSON result to this path | none |\n| `--seed` | Scenario seed | `1` |\n| `--timeout` | Per-build timeout | `10m` |\n| `--gomaxprocs` | GOMAXPROCS for child builds | `1` |\n| `--check-determinism` | Compare two clean candidate builds | `true` |\n| `--volatile` | Comma-separated volatile output paths | `.well-known/time` |\n| `--fast` | Add `--fast` to both child builds | `false` |\n| `--tool-version` | External tool metadata, such as `pagefind=1.5.2` | none |\n| `--env` | Allowed entries: `PATH`, `MARKATA_GO_ENCRYPTION_ENABLED`, or `MARKATA_GO_OFFLINE` | none |\n\nBuild Lab copies the fixture, redirects cache and temporary paths, disables\nfixture `.env` loading, and pins children to UTC, `C.UTF-8`, and\n`SOURCE_DATE_EPOCH=0`. It rejects paths and environment entries that escape the\nworkspace. Setup failures emit a versioned harness result to stdout and a\nconcise diagnostic to stderr. See [[build-lab|Build Lab]] for scenario and\noutput-class details.\n\n### builder-admin\n\nRun the long-lived builder admin HTTP service for Kubernetes and authoring workflows.\n\n#### Usage\n\n```bash\nmarkata-go builder-admin [flags]\n```\n\n#### Flags\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `--host` | Host to bind to | `127.0.0.1` |\n| `--port` | Port to listen on | `8080` |\n| `--source-dir` | Mounted source directory to watch and build from | `.` |\n| `--release-dir` | Mounted release root that contains `releases/` and `current` | `public` |\n| `--watch` | Enable recursive file watching and queued rebuilds | `true` |\n| `--watch-debounce` | Debounce window for coalescing file changes | `2s` |\n| `--fast` | Use `markata-go build --fast` for queued builds | `false` |\n| `--mermaid-mode` | Override `[markata-go.mermaid].mode` for queued builds | `\"\"` |\n| `--cache-mount` | Optional dedicated cache mount used for `.markata` and `.markata-cache` symlinks | `\"\"` |\n| `--history-dir` | Directory for persisted admin state and logs | `\u003crelease-dir\u003e/.builder-admin` |\n| `--releases-keep` | Number of rendered releases to keep on disk | `25` |\n| `--refresh-task` | Repeatable task spec in the form `name|every|enqueue|arg1|arg2...` | none |\n| `--trusted-proxy-cidr` | Repeatable CIDR allowed to supply trusted identity headers | none |\n| `--auth-user-id-header` | Trusted header containing the durable operator ID | `X-Hlab-User-Id` |\n| `--auth-username-header` | Trusted header containing the operator username | `X-Hlab-Username` |\n| `--auth-display-name-header` | Trusted header containing the operator display name | `X-Hlab-Display-Name` |\n| `--auth-email-header` | Trusted header containing the operator email | `X-Hlab-Email` |\n| `--auth-groups-header` | Trusted header containing operator groups | `X-Hlab-Groups` |\n| `--auth-roles-header` | Trusted header containing operator roles | `X-Hlab-Roles` |\n| `--auth-scopes-header` | Trusted header containing operator scopes | `X-Hlab-Scopes` |\n| `--auth-method-header` | Trusted ForwardAuth assertion for bearer-authenticated API requests | `X-Hlab-Auth-Method` |\n\nHeader mappings may also be set in `[markata-go.builder_admin.auth.headers]` or with\n`MARKATA_GO_BUILDER_ADMIN_AUTH_HEADERS_*` environment variables. Explicit CLI flags override\nenvironment and file configuration. See [Builder Admin](../guides/deployment/builder-admin.md)\nfor a complete ForwardAuth and Authentik example.\n\n#### Examples\n\n```bash\n# Run locally against mounted source and site paths\nmarkata-go builder-admin \\\n  --config /data/source/markata-go.toml \\\n  --source-dir /data/source \\\n  --release-dir /data/site \\\n  --cache-mount /data/cache \\\n  --fast \\\n  --watch\n\n# Add a scheduled reader refresh that enqueues a build when complete\nmarkata-go builder-admin \\\n  --refresh-task 'reader-update|30m|true|markata-go|--config|/data/source/markata-go.toml|reader|update'\n```\n\n#### Exit Codes\n\n| Code | Description |\n|------|-------------|\n| `0` | Build completed successfully |\n| `1` | Build failed (configuration error, plugin error, etc.) |\n| `2` | No content files found |\n\n#### Build Process\n\nThe build command executes the full 9-stage lifecycle:\n\n1. **Configure** - Load and merge configuration\n2. **Validate** - Validate configuration settings\n3. **Glob** - Discover content files\n4. **Load** - Parse markdown files and frontmatter\n5. **Transform** - Pre-render processing (wikilinks, jinja-md, etc.)\n6. **Render** - Convert markdown to HTML\n7. **Collect** - Build feeds and collections\n8. **Write** - Output files to disk\n9. **Cleanup** - Release resources\n\nWhen `--verbose` is enabled, build output includes per-stage timing to highlight slow stages.\n`--fast` keeps the same HTML output path but skips minification, CSS purge, Tailwind rebuilds,\nand Pagefind indexing for a tighter dev loop.\n\nSuccessful builds also print a compact benchmark summary with:\n\n- estimated wall-time spent on CPU work, network wait, disk read wait, disk write wait, and idle time\n- the slowest lifecycle hotspots so you can spot expensive plugins quickly\n- the slowest outbound HTTP requests so network-bound plugins stop hiding in aggregate wait time\n\nFor deeper analysis:\n\n- `markata-go build --benchmark-json=benchmark.json` writes machine-readable benchmark data to a file\n- `markata-go build --benchmark-json=-` writes only the benchmark JSON to stdout\n- `markata-go build --benchmark-summary-json=/tmp/benchmark.json` writes timing and aggregate content statistics without the large per-content entry matrix\n- `markata-go build -v --benchmark-detailed` adds per-stage resource summaries to the build footer\n\nWhen requests are present, the footer prints the 10 slowest network waits with stage, plugin, method, sanitized URL, duration, and either HTTP status or the request error.\n\nThe resource profile is approximate. It is intended for local hotspot hunting, not precise system profiling.\n\nThe experimental `--dag` flag is available on `build`, `serve`, and\n`builder-admin`. It retains serial plugin ordering and is not a parallel-build\nswitch. `MARKATA_GO_DAG=true` also opts in; an explicit `--dag=false` overrides\nthe environment, including queued Builder Admin child builds. Invalid\nenvironment boolean values report an error unless an explicit flag overrides\nthem. `build --dry-run` still uses the legacy partial lifecycle and does not\nclaim a DAG build ran. Benchmark JSON records the executor that actually ran.\nSee [[dag-builds|Experimental DAG builds]] for comparison guidance.\n\n---\n\n### reader\n\nRefresh the cached external feed data used by the `/reader/` page without running a build.\n\n#### Usage\n\n```bash\nmarkata-go reader update\n```\n\n##### Flags\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `--concurrency` | Override feed refresh concurrency for this run | config value, else `5` |\n\n#### Subcommands\n\n##### update\n\nFetch all configured blogroll feeds and rewrite the on-disk reader cache so the next build can reuse fresh reader data.\n\nThis command does not render pages or write site output. It only updates the external feed cache used by the blogroll and reader features.\n\n#### Examples\n\n```bash\n# Refresh reader cache using the auto-discovered config\nmarkata-go reader update\n\n# Refresh reader cache with higher parallelism for this run\nmarkata-go reader update --concurrency 12\n\n# Refresh reader cache using a specific config file\nmarkata-go reader update -c production.toml\n```\n\n#### Notes\n\n- requires `[markata-go.blogroll] enabled = true`\n- requires at least one `[[markata-go.blogroll.feeds]]` entry\n- bypasses normal cache age checks so it can fetch fresh remote feed data immediately\n- reuses stale cached feed data on fetch failures when available\n\n---\n\n### editor\n\nThe editor accepts `--port` (`-p`) to select its HTTP port. When a port is occupied,\n`editor` and `serve` suggest a rerun command. In an interactive terminal, Enter\naccepts an available port; `q` followed by Enter or Ctrl+C cancels.\n\n\nRun the browser-based Go Markdown editor against a selected workspace.\n\n#### Usage\n\n```bash\nmarkata editor [flags]\n```\n\nThe editor uses Markata's Go renderer and LSP in the same process. It binds to\nloopback by default and prints its local URL. Browser drafts stay in memory;\nuse **Download .md** to save a copy. The file tree opens discovered workspace sources. Edits remain browser drafts;\nthe command does not save changes to source files.\n\n#### Flags\n\n| Flag | Description | Default |\n| --- | --- | --- |\n| `--workspace` | Markdown workspace used for language assistance | `.` |\n| `--listen` | Loopback HTTP address | `127.0.0.1:8766` |\n| `--port`, `-p` | HTTP port (overrides the port in `--listen`) | `8766` |\n\n#### Examples\n\n```bash\n# Open the editor for the current workspace\nmarkata editor\n\n# Select a site workspace\nmarkata editor --workspace ~/sites/blog\n\n# Change the local port\nmarkata editor --listen 127.0.0.1:8767\n```\n\nThe listener accepts only `localhost` or a loopback IP address. See the\n[Go editor guide](/docs/guides/go-workbench/) for browser behavior and LSP completions.\n\n---\n\n### serve\n\nStart a development server with live reload support.\n\n#### Usage\n\n```bash\nmarkata-go serve [flags] [markdown-file]\n```\n\nPass a Markdown file to serve only that page at `/`, using the same single-file mode as `build`. Every rebuild stays in single-file mode.\n\n#### Flags\n\n| Flag | Short | Description | Default |\n|------|-------|-------------|---------|\n| `--port` | `-p` | Port to listen on | `8000` |\n| `--host` | | Host address to bind to | `localhost` |\n| `--bind` | | Address to listen on (alias for `--host`) | `localhost` |\n| `--admin` | | Explicitly enable the local Control Center on loopback | Loopback default |\n| `--no-admin` | | Disable the local Control Center | `false` |\n| `--no-tui` | | Use line-oriented output | `false` |\n| `--watch` | | Enable file watching and auto-rebuild | `true` |\n| `--no-watch` | | Disable file watching (legacy, overrides --watch) | `false` |\n| `--fast` | | Skip minification/CSS purge, Tailwind rebuilds, Pagefind indexing, and disable blogroll/mentions | `false` |\n| `--incremental` | | Reuse unchanged posts and dependencies while keeping normal output processing | `false` |\n| `--verbose` | `-v` | Enable verbose logging | `false` |\n\n#### Examples\n\n```bash\n# Serve on default port (localhost:8000)\nmarkata-go serve\n\n# Serve on a custom port\nmarkata-go serve -p 3000\nmarkata-go serve --port 3000\n\n# Bind to all network interfaces (accessible from other devices)\nmarkata-go serve --host 0.0.0.0\n\n# Disable the local Control Center on a loopback listener\nmarkata-go serve --no-admin\n\n# Explicitly enable file watching (default behavior)\nmarkata-go serve --watch\n\n# Serve without file watching\nmarkata-go serve --watch=false\nmarkata-go serve --no-watch\n\n# Serve with production-style incremental rebuilds\nmarkata-go serve --incremental\n\n# Serve with verbose logging\nmarkata-go serve -v\n\n# Combine options\nmarkata-go serve -p 8080 --host 0.0.0.0 -v\n```\n\n#### Features\n\n- **Automatic rebuild**: File changes trigger a rebuild automatically\n- **Live reload**: Connected browsers refresh when content changes\n- **Static file serving**: Serves the output directory\n- **MIME type detection**: Correct content types for all file types\n- **Immediate serve**: Server starts before the initial build completes\n- **Local Control Center**: `http://localhost:8000/_markata/` is available by default on loopback. A non-loopback bind leaves it disabled. `--admin` is rejected there, and `--admin --no-admin` is invalid. The TUI shows `⚙ Admin`; press `a` to open it in a browser.\n- **Build status banner**: Shows build progress and errors during serve\n- **Early 404**: Minimal 404 is served until the generated 404.html exists\n- **Incremental mode**: `serve --incremental` rebuilds only changed posts and dependents while retaining minification, CSS purging, Tailwind, redirects, and Pagefind processing\n- **Fast mode**: `serve --fast` rebuilds only changed posts and dependents, but skips production output steps for iteration speed\n- **Bake theme**: the theme picker gains a **Bake** button that writes your current palette, style, and font (and text size or color mode when you picked them) into `[markata-go.theme]`. It edits the config file (including `include`d files) that already holds the theme, keeping comments, then rebuilds. It never writes your global `~/.config/markata-go/config.toml`. Only `serve` offers it. See [Themes Guide](/docs/guides/themes/#baking-a-look-into-your-config).\n- **Settings sidebar**: a gear button at the bottom left (or `Alt+,`) opens a sidebar with every config setting, its current value, and its description. Changes preview live on the site right away without touching your files; click **Bake** to review a diff and write them into the config file that owns each one, or **Reset** to discard them. **Reset to default** removes a setting from your config. Settings with fixed values are dropdowns, and invalid values are rejected. Previews build into `.markata/serve-preview/` so your main build cache is kept. Only `serve` shows it. See [Configuration Guide](/docs/guides/configuration/#edit-settings-while-serving).\n- **Local only**: the settings and Bake endpoints accept requests only from the machine running `serve` (a loopback client address). With `--host 0.0.0.0`, other devices can browse the site but cannot change your config.\n\n#### Development Workflow\n\n```bash\n# Terminal 1: Start the server\nmarkata-go serve -v\n\n# The server will:\n# - Start serving at http://localhost:8000 immediately\n# - Build your site in the background\n# - Watch for file changes\n# - Rebuild and reload on changes\n```\n\n---\n\n### tui\n\nInteractive terminal UI for browsing and managing your markata site. Inspired by [k9s](https://k9scli.io/).\n\n#### Usage\n\n```bash\nmarkata-go tui [flags]\n```\n\n#### Description\n\nThe TUI provides a keyboard-driven interface for exploring your site's posts, tags, and feeds. It features a k9s-style table layout with filtering, sorting, and quick actions.\n\n#### Views\n\nThe TUI has three main views, accessible via number keys:\n\n| Key | View | Description |\n|-----|------|-------------|\n| `1` | Posts | Browse all posts in a table |\n| `2` | Tags | View and filter by tags |\n| `3` | Feeds | View configured feeds |\n\n#### Global Keybindings\n\nThese keys work in all views:\n\n| Key | Action |\n|-----|--------|\n| `1`, `2`, `3` | Switch between views |\n| `/` | Enter filter mode |\n| `Esc` | Clear filter / exit current mode |\n| `?` | Show help |\n| `q`, `Ctrl+C` | Quit |\n\n#### Posts View\n\nThe posts view displays all posts in a table with columns for title, date, word count, tags, and path.\n\n##### Posts Keybindings\n\n| Key | Action |\n|-----|--------|\n| `↑`/`↓`, `j`/`k` | Navigate up/down |\n| `Enter` | View post details |\n| `e` | Edit post in $EDITOR |\n| `s` | Open sort menu |\n| `/` | Filter posts |\n\n##### Post Detail View\n\nPress `Enter` on any post to see its full details including:\n- Title, path, and date\n- Published status and tags\n- Word count and description\n- Content preview\n\nPress `Esc` to return to the post list, or `e` to edit the post.\n\n#### Sorting\n\nPress `s` in the posts view to open the sort menu:\n\n| Sort Option | Description |\n|-------------|-------------|\n| Date | Sort by post date (default) |\n| Title | Sort alphabetically by title |\n| Word Count | Sort by word count |\n| Path | Sort by file path |\n\nUse `a` for ascending order, `d` for descending order.\n\n#### Filtering\n\nPress `/` to enter filter mode. Type a filter expression and press `Enter` to apply.\n\n##### Filter Expression Examples\n\n```\npublished==true           # Only published posts\ntags contains \"go\"        # Posts tagged with \"go\"  \ndate \u003e \"2024-01-01\"       # Posts after a specific date\ntitle startswith \"How\"    # Titles starting with \"How\"\n```\n\nSee [Filter Expressions](/docs/guides/filters) for the complete filter syntax.\n\n#### Feeds View\n\nThe feeds view displays all configured feeds with:\n- Feed name\n- Number of posts in the feed\n- Filter expression used\n- Output path\n\n#### Environment Variables\n\n| Variable | Description |\n|----------|-------------|\n| `EDITOR` | Primary editor for `e` key (falls back to `vim`) |\n| `VISUAL` | Secondary editor if `EDITOR` is not set |\n\n#### Examples\n\n```bash\n# Launch the TUI\nmarkata-go tui\n\n# The TUI will display your posts in a table format\n# Use j/k to navigate, Enter to view details, e to edit\n```\n\n---\n\n### list\n\nList posts, tags, or feeds in table, JSON, CSV, or path-only formats.\n\n#### Usage\n\n```bash\nmarkata-go list posts [flags]\nmarkata-go list tags [flags]\nmarkata-go list feeds [flags]\nmarkata-go list feeds posts \u003cfeed\u003e\n```\n\n#### Shared Flags\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `--format` | Output format: `table`, `json`, `csv`, `path` | `table` |\n| `--sort` | Sort field (varies by subcommand) | posts: `date`, tags: `count`, feeds: `name` |\n| `--order` | Sort order: `asc` or `desc` | posts/tags: `desc`, feeds: `asc` |\n\n#### Posts Flags\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `--filter` | Filter expression for posts | none |\n| `--feed` | Limit posts to a feed by name | none |\n\n#### Examples\n\n```bash\n# List posts as a table\nmarkata-go list posts\n\n# Path-only output for piping\nmarkata-go list posts --format path\n\n# List tags as JSON\nmarkata-go list tags --format json\n\n# List feeds as CSV\nmarkata-go list feeds --format csv\n\n# List posts for a feed\nmarkata-go list posts --feed blog\n\n# List posts for a feed\nmarkata-go list feeds posts blog\n\n# List post paths for a feed\nmarkata-go list feeds posts blog --format path\n```\n\n#### Cache\n\n`list` and `tui` use a persistent cache at `.markata/cache/list.json`. Delete this file to force a full refresh.\n\n---\n\n### search\n\nFull-text search across post content, titles, descriptions, and tags. Uses a bleve full-text index for BM25-ranked results with optional fuzzy matching.\n\n#### Usage\n\n```bash\nmarkata-go search \u003cquery\u003e [flags]\n```\n\n#### Flags\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `--format` | Output format: `table`, `json`, `csv`, `path` | `table` |\n| `--sort` | Sort field: `score`, `date`, `title`, `words`, `path`, `reading_time`, `tags` | `score` |\n| `--order` | Sort order: `asc` or `desc` | `desc` |\n| `--filter` | Additional filter expression to narrow results | none |\n| `--fields` | Fields to search: `title,content,description,tags` (default: all) | all |\n| `--fuzzy` | Enable fuzzy matching (tolerates typos) | `false` |\n| `--limit` | Maximum number of results (0 = no limit) | `0` |\n\n#### Examples\n\n```bash\n# Search for posts about golang (BM25-ranked)\nmarkata-go search golang\n\n# Search with JSON output for scripting\nmarkata-go search \"error handling\" --format json\n\n# Search with a filter and limit\nmarkata-go search docker --filter \"published == True\" --limit 10\n\n# Search only in titles and tags\nmarkata-go search golang --fields title,tags\n\n# Fuzzy search (tolerates typos like \"tutoral\" → \"tutorial\")\nmarkata-go search tutoral --fuzzy\n\n# Search and sort by date instead of relevance\nmarkata-go search cli --sort date --order desc\n\n# Get matching file paths for piping\nmarkata-go search kubernetes --format path\n\n# Combine filter expressions with search\nmarkata-go search tutorial --filter '\"go\" in tags and date \u003e= \"2024-01-01\"'\n```\n\n#### Search Behavior\n\n- Uses bleve full-text index with BM25 ranking (results sorted by relevance by default)\n- Falls back to substring matching if the bleve index cannot be built\n- Index is cached at `.markata/cache/search.bleve` and rebuilt when content changes\n- Combines with `--filter` to narrow results before searching (filter applied first)\n- Table output shows relevance scores when using ranked search\n- `--fuzzy` enables edit-distance matching for typo tolerance\n- **Synonym expansion** is enabled by default — searching \"land\" also finds posts about \"shore\" (powered by a bundled WordNet thesaurus with 10,000+ synonym groups)\n- **Privacy-safe** — private posts are searchable by public metadata, while their body content and media remain excluded from search\n\n---\n\n### search build-index\n\nBuild a reusable bleve index artifact without starting the search server.\n\n#### Usage\n\n```bash\nmarkata-go search build-index [flags]\n```\n\n#### Flags\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `--index-dir` | Directory to write the bleve index | `.markata/cache/search.bleve` |\n| `--hash-path` | Path for the content hash file | `.markata/cache/search.hash` |\n| `--index-name` | Named index suffix inside the default cache directory | `\"\"` |\n| `--force` | Rebuild even if content hash is unchanged | `false` |\n\n#### Examples\n\n```bash\n# Build the default cached index\nmarkata-go search build-index\n\n# Build a reusable artifact at a custom path\nmarkata-go search build-index --index-dir /data/search.bleve --hash-path /data/search.hash\n\n# Build a named index alongside other local indexes\nmarkata-go search build-index --index-name server --force\n```\n\n#### Behavior\n\n- Loads the site content the same way as `markata-go search`\n- Writes or refreshes a bleve index on disk\n- Intended for CI, builder jobs, and future read-only search server deployments\n\n---\n\n### search-server\n\nStart a standalone bleve-backed search API server.\n\n#### Usage\n\n```bash\nmarkata-go search-server [flags]\n```\n\n#### Flags\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `--port` | Port to listen on | `3001` |\n| `--host` | Host to bind to | `localhost` |\n| `--mode` | Server mode: `runtime-index`, `watch-content`, or `read-only-index` | `runtime-index` |\n| `--index-dir` | Directory of the bleve index | runtime default |\n| `--hash-path` | Path for the content hash file in runtime-index mode | runtime default |\n| `--index-name` | Named index suffix inside the default cache directory | `server` |\n| `--rebuild-index` | Force a rebuild in runtime-index mode | `false` |\n| `--watch-debounce` | Debounce duration for watch-content reloads | `750ms` |\n\n#### Examples\n\n```bash\n# Start the search API server\nmarkata-go search-server\n\n# Start on a custom port\nmarkata-go search-server --port 8081\n\n# Start in watch mode\nmarkata-go search-server --mode watch-content\n\n# Serve a prebuilt index artifact without loading content\nmarkata-go search-server --mode read-only-index --index-dir /data/search.bleve\n\n# Query the API\ncurl \"http://localhost:3001/api/search?q=golang\u0026fuzzy=true\u0026limit=10\"\ncurl \"http://localhost:3001/api/search?q=docker\u0026tags=devops\u0026from=2024-01-01\"\n```\n\n#### API Parameters\n\n| Parameter | Description | Default |\n|-----------|-------------|---------|\n| `q` | Search query (required) | — |\n| `fuzzy` | Enable fuzzy matching (`true`/`false`) | `false` |\n| `limit` | Max results | `20` |\n| `tags` | Comma-separated tag filter | none |\n| `from` | Date range start (`YYYY-MM-DD`) | none |\n| `to` | Date range end (`YYYY-MM-DD`) | none |\n\n#### Search API Behavior\n\n- Returns JSON with `query`, `total`, `results` fields\n- Private post content is never searchable — only metadata (title, description, tags)\n- CORS follows `search.bleve.cors_origins`\n- Also available at the configured endpoint during `markata-go serve`\n- Health check at `/health`\n\n#### Modes\n\n- `runtime-index` loads site content and builds or refreshes a local bleve index\n- `watch-content` reloads content and refreshes the local index when source files change\n- `read-only-index` opens an existing prebuilt index without loading or rebuilding site content\n\n#### Configuration\n\n```toml\n[search]\nbackend = \"bleve\"           # \"pagefind\" (default) or \"bleve\"\nendpoint = \"/api/search\"    # API endpoint path\n\n[search.bleve]\nendpoint = \"https://search.example.com/api/search\"  # Optional remote endpoint for navbar client\nfuzzy = false               # Default fuzzy matching\nlimit = 20                  # Default result limit\nmax_limit = 100             # Maximum allowed limit\ncors_origins = [\"*\"]        # Allowed CORS origins\n```\n\n---\n\n### init\n\nInitialize a new markata-go project with interactive setup.\n\n#### Usage\n\n```bash\nmarkata-go init [flags]\n```\n\n#### Flags\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `--force` | Overwrite existing files | `false` |\n| `--plain` | Use plain text prompts instead of the TUI wizard | `false` (auto-detected) |\n\n#### Examples\n\n```bash\n# Start interactive project setup (uses TUI wizard when available)\nmarkata-go init\n\n# Overwrite existing configuration\nmarkata-go init --force\n\n# Use plain text prompts (for scripts or non-TTY environments)\nmarkata-go init --plain\n```\n\n#### Interactive Flow\n\nThe `init` command provides a rich TUI (Text User Interface) wizard powered by [charmbracelet/huh](https://github.com/charmbracelet/huh) for an enhanced user experience. The wizard automatically falls back to plain text prompts when:\n\n- The `--plain` flag is specified\n- stdin is not a TTY (e.g., when piping input or running in CI)\n\n**TUI Mode Features:**\n- Searchable palette selection\n- Multi-select for features\n- Form validation\n- Styled using your site's configured palette (for existing projects)\n- Post format prompts include optional ANSI terminal output\n\n**Plain mode example:**\n\n```\n$ markata-go init --plain\n\nWelcome to markata-go!\n\nSite title [My Site]: My Awesome Blog\nDescription [A site built with markata-go]: A blog about things\nAuthor []: Your Name\nURL [https://example.com]: https://myblog.com\n\nCreating project structure...\n  ✓ Created posts/\n  ✓ Created static/\n  ✓ Created markata-go.toml\n\nCreate your first post? (Y/n): y\nPost title [Hello World]: My First Post\n\n  ✓ Created pages/post/my-first-post.md\n\nDone! Run 'markata-go serve' to start.\n```\n\n#### What Gets Created\n\nThe command creates:\n\n1. **markata-go.toml** - Configuration file with your site settings\n2. **posts/** - Directory for your blog posts\n3. **static/** - Directory for static assets (images, CSS, etc.)\n4. **(Optional) First post** - A starter markdown file\n\n---\n\n### new\n\nCreate a new content file with frontmatter template.\n\n#### Usage\n\n```bash\nmarkata-go new [title] [flags]\n```\n\n#### Arguments\n\n| Argument | Description | Required |\n|----------|-------------|----------|\n| `title` | The title of the new content | No (prompted if not provided) |\n\n#### Flags\n\n| Flag | Short | Description | Default |\n|------|-------|-------------|---------|\n| `--template` | `-t` | Content template to use | `post` |\n| `--list` | `-l` | List available templates | `false` |\n| `--dir` | | Directory to create the content in (overrides template) | Template's default |\n| `--draft` | | Create as a draft | `false` |\n| `--tags` | | Comma-separated list of tags | `\"\"` |\n| `--plain` | | Use plain text prompts instead of TUI wizard | `false` |\n\n#### Built-in Templates\n\n| Template | Directory | Description |\n|----------|-----------|-------------|\n| `post` | `pages/post/` | Blog posts with standard frontmatter |\n| `page` | `pages/` | Static pages |\n| `docs` | `docs/` | Documentation pages |\n| `article` (`blog-post`, `essay`, `tutorial`) | `pages/article/` | Long-form article content |\n| `note` (`ping`, `thought`, `status`, `tweet`) | `pages/note/` | Short note and micro-post content |\n| `photo` (`shot`, `shots`, `image`, `gallery`) | `pages/photo/` | Image-focused posts |\n| `video` (`clip`, `cast`, `stream`) | `pages/video/` | Video posts |\n| `link` (`bookmark`, `til`, `stars`) | `pages/link/` | Link and bookmark posts |\n| `quote` (`quotation`) | `pages/quote/` | Quote posts with attribution |\n| `guide` (`series`, `step`, `chapter`) | `pages/guide/` | Guides and multi-part content |\n| `inline` (`gratitude`, `micro`) | `pages/inline/` | Inline feed-first content |\n| `contact` (`character`, `person`) | `pages/contact/` | Profile/contact pages |\n| `author` | `pages/author/` | Author profile pages |\n\n#### Examples\n\n```bash\n# Create a new post (creates pages/post/my-first-post.md)\nmarkata-go new \"My First Post\"\n\n# Use a different template\nmarkata-go new \"About\" --template page\n# Creates: pages/about.md\n\nmarkata-go new \"Getting Started\" -t docs\n# Creates: docs/getting-started.md\n\n# List available templates\nmarkata-go new --list\n\n# Override the template's directory\nmarkata-go new \"Hello World\" --template post --dir blog\n# Creates: blog/hello-world.md\n\n# Create as a draft (opt-in, default is published)\nmarkata-go new \"Work in Progress\" --draft\n# Creates: pages/post/work-in-progress.md with draft: true\n\n# Create as published (default behavior)\nmarkata-go new \"Ready to Publish\"\n# Creates: pages/post/ready-to-publish.md with draft: false, published: true\n\n# Create with tags\nmarkata-go new \"Go Tutorial\" --tags \"go,tutorial,programming\"\n# Creates: pages/post/go-tutorial.md with tags: [\"go\", \"tutorial\", \"programming\"]\n\n# Create content in another site from any directory\nmarkata-go --site-dir ~/sites/blog new \"Release notes\" --no-input\n\n# Interactive mode (no arguments) - launches TUI wizard\nmarkata-go new\n# TUI wizard prompts for: template, title, directory, tags, privacy, authors\n\n# Interactive mode with plain text prompts (no TUI)\nmarkata-go new --plain\n```\n\n#### Template System\n\nTemplates control the default frontmatter and output directory for new content.\n\n**Template Discovery:**\n\n1. **Built-in templates** - `post`, `page`, `docs`, `article`, `note`, `photo`, `video`, `link`, `quote`, `guide`, `inline`, `contact`, and `author` are always available\n2. **Config templates** - Defined in `markata-go.toml` under `[content_templates]`\n3. **File templates** - Markdown files in `content-templates/` directory\n\nBuilt-in content types with aliases are shown in `markata-go new --list` as `type (aka: alias1, alias2)`. You can also pass those aliases directly to `--template`; for example, `--template ping` resolves to the built-in `note` template while preserving `template: ping` in frontmatter.\n\n**Configuration Example:**\n\n```toml\n[content_templates]\ndirectory = \"content-templates\"\n\n[content_templates.placement]\npost = \"blog\"       # Override: posts go to blog/\npage = \"pages\"\ndocs = \"documentation\"\n\n[[content_templates.templates]]\nname = \"tutorial\"\ndirectory = \"tutorials\"\nbody = \"## Prerequisites\\n\\n## Steps\\n\\n## Summary\"\n\n[content_templates.templates.frontmatter]\ntemplateKey = \"tutorial\"\nseries = \"\"\n```\n\n**File Template Example:**\n\nCreate `content-templates/recipe.md`:\n\n```markdown\n---\ntemplateKey: recipe\n_directory: recipes\nprep_time: \"\"\ncook_time: \"\"\nservings: 4\n---\n\n## Ingredients\n\n-\n\n## Instructions\n\n1.\n```\n\nThe `_directory` field in frontmatter sets the output directory (removed from generated content).\n\nThe same Markdown starter files are available to the interactive TUI and web\nworkbench. Starter metadata may include `starter.name`,\n`starter.description`, and `starter.aliases`; this mapping is for discovery\nand does not become page frontmatter. Use\n`{{title}}`, `{{slug}}`, `{{date}}`, and `{{datetime}}` for shared substitutions\nin frontmatter values and body text. See the [content starters guide](../guides/content-starters.md)\nfor an example and the [starter specification](../../spec/spec/CONTENT_TEMPLATES.md)\nfor compatibility and precedence rules.\n\n#### Interactive Mode\n\nWhen called without a title argument (or no arguments at all), the command launches an\ninteractive TUI wizard powered by [charmbracelet/huh](https://github.com/charmbracelet/huh).\n\nThe wizard guides you through:\n\n1. **Template selection** - Pick from built-in, config, and file-based templates\n2. **Title** - Enter the post title\n3. **Directory** - Choose from existing directories or enter a custom one, with config-driven defaults per template type\n4. **Tags** - Select from existing site tags and/or type custom tags\n5. **Privacy** - Mark the post as private\n6. **Authors** - If multiple authors are configured, choose whether to use the default or select specific authors\n7. **Summary** - Review all choices before creating the file\n\n```\n$ markata-go new\n\n? Select a template\n  \u003e post - Blog post (pages/post/)\n    page - Static page (pages/)\n    docs - Documentation (docs/)\n\n? Title: My New Post\n? Select a directory: pages/post (default)\n? Select tags: [go, tutorial]\n? Make this post private? No\n? Create my-new-post.md in pages/post/? Yes\n\nCreated: pages/post/my-new-post.md\n```\n\n**Plain text mode:** Use `--plain` or pipe input to get simple text prompts instead of the TUI.\nFalls back automatically when stdin is not a TTY.\n\n#### Generated File\n\nThe command creates a markdown file with template-specific frontmatter:\n\n```markdown\n---\ntitle: My First Post\nslug: my-first-post\ndate: \"2024-01-15\"\npublished: true\ndraft: false\ntemplateKey: post\ntags:\n  - go\n  - tutorial\ndescription: \"\"\n---\n\nWrite your content here...\n```\n\nThe generated body does not include a starter H1. markata-go renders the page title from frontmatter, so content should start with regular body text or an `##` heading.\n\nThe slug is automatically generated from the title by:\n- Converting to lowercase\n- Replacing spaces with hyphens\n- Removing special characters\n\n---\n\n### lint\n\nLint markdown files for common issues that can cause build failures.\n\n#### Usage\n\n```bash\nmarkata-go lint [files...] [flags]\n```\n\n#### Arguments\n\n| Argument | Description | Required |\n|----------|-------------|----------|\n| `files` | Glob patterns or file paths to lint | Yes |\n\n#### Flags\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `--fix` | Automatically fix detected issues | `false` |\n\n#### Detected Issues\n\nThe linter checks for these common problems:\n\n| Issue | Severity | Auto-fixable | Description |\n|-------|----------|--------------|-------------|\n| `duplicate-key` | Error | Yes | Duplicate YAML keys in frontmatter |\n| `invalid-date` | Warning | Yes | Non-ISO 8601 date formats |\n| `missing-alt-text` | Warning | Yes | Image links without alt text `![]()` |\n| `protocol-less-url` | Warning | Yes | URLs starting with `//` instead of `https://` |\n| `encryption-key-policy` | Error | No | Missing or weak encryption keys based on `encryption.*` policy |\n\n#### Examples\n\n```bash\n# Lint all markdown files in posts directory\nmarkata-go lint posts/*.md\n\n# Lint with glob pattern (recursive)\nmarkata-go lint 'posts/**/*.md'\n\n# Lint multiple patterns\nmarkata-go lint posts/*.md pages/*.md docs/**/*.md\n\n# Lint and auto-fix issues\nmarkata-go lint posts/*.md --fix\n\n# Lint a specific file\nmarkata-go lint posts/hello-world.md\n\n# Lint with verbose output\nmarkata-go lint posts/*.md -v\n```\n\n#### Output Format\n\n```\nposts/example.md:\n  error [line 5]: duplicate key 'title' (first occurrence at line 2)\n  warning [line 3]: invalid date format for 'date': 2020-1-15 (single-digit month/day)\n  warning [line 12, col 1]: image link missing alt text\n\n✗ 5 file(s) linted, 3 issue(s) in 1 file(s)\n```\n\n#### Auto-fix Behavior\n\nWhen `--fix` is enabled:\n\n| Issue | Fix Applied |\n|-------|-------------|\n| `duplicate-key` | Keeps last occurrence, removes earlier duplicates |\n| `invalid-date` | Pads single-digit months/days (e.g., `2020-1-5` → `2020-01-05`) |\n| `missing-alt-text` | Adds placeholder alt text: `![]()` → `![image]()` |\n| `protocol-less-url` | Adds HTTPS protocol: `//example.com` → `https://example.com` |\n\n#### Exit Codes\n\n| Code | Description |\n|------|-------------|\n| `0` | No errors found (warnings are allowed) |\n| `1` | Errors found (or file read errors) |\n\n#### Use Cases\n\n**Migration from Python markata:**\n```bash\n# Find and fix common issues when migrating content\nmarkata-go lint content/**/*.md --fix\n```\n\n**CI/CD integration:**\n```bash\n# Fail CI if markdown has errors\nmarkata-go lint posts/**/*.md || exit 1\n```\n\n**Pre-commit hook:**\n```bash\n#!/bin/bash\nmarkata-go lint $(git diff --cached --name-only -- '*.md')\n```\n\n---\n\n### config\n\nConfiguration management commands for viewing, validating, and initializing configuration.\n\n#### Usage\n\n```bash\nmarkata-go config \u003csubcommand\u003e [flags]\n```\n\nRunning `markata-go config` with no subcommand behaves like `markata-go config show`.\n\n#### Subcommands\n\n##### show\n\nDisplay the resolved configuration after merging defaults, config file, and environment variables.\n\n`config show` honors the root `--config` and `--merge-config` flags, so it reports the same effective configuration used by `build` and `serve`.\n\n```bash\nmarkata-go config show [flags]\n```\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `--format` | Output format: `yaml`, `json`, or `toml` | `yaml` |\n| `--json` | Output as JSON | `false` |\n| `--toml` | Output as TOML | `false` |\n| (none) | Output as YAML | default |\n\n**Examples:**\n\n```bash\n# Show config as YAML (default)\nmarkata-go config show\n\n# Show config as JSON\nmarkata-go config show --json\n\n# Show config as TOML\nmarkata-go config show --toml\n\n# Show config from specific file\nmarkata-go config show -c production.toml\n\n# Show config with merged overrides\nmarkata-go config show -m fast.toml\n```\n\nNotes:\n\n- `markata-go config` is equivalent to `markata-go config show`\n- `--json` and `--toml` are shorthands for `--format json` and `--format toml`\n- conflicting combinations such as `--json --toml` fail with usage error exit code `2`\n\n##### get\n\nGet a specific configuration value using dot notation for nested keys.\n\n```bash\nmarkata-go config get \u003ckey\u003e\n```\n\n**Examples:**\n\n```bash\n# Get top-level value\nmarkata-go config get output_dir\n# Output: output\n\n# Get nested value (list values print one item per line)\nmarkata-go config get glob.patterns\n# Output:\n# pages/**/*.md\n# posts/**/*.md\n\n# Get deeply nested value\nmarkata-go config get feed_defaults.items_per_page\n# Output: 10\n\n# Get from specific config file\nmarkata-go config get url -c production.toml\n# Output: https://example.com\n```\n\nNotes:\n\n- Values are read directly from the config file; `config get` does not synthesize absent defaults.\n- TOML/YAML are parsed with tree-sitter in CGO-enabled builds to preserve formatting.\n- CGO-disabled builds parse TOML/YAML via full decode.\n- JSON values may be re-emitted for structured output.\n\n##### set\n\nSet a configuration value using dot notation for nested keys.\n\n```bash\nmarkata-go config set \u003ckey\u003e \u003cvalue\u003e\n```\n\n**Examples:**\n\n```bash\n# Set a string value\nmarkata-go config set url \"https://example.com\"\n\n# Set an integer value\nmarkata-go config set concurrency 4\n\n# Set an array value (JSON syntax)\nmarkata-go config set glob.patterns '[\"pages/**/*.md\", \"posts/**/*.md\"]'\n```\n\nNotes:\n\n- TOML/YAML are updated with byte-range edits to preserve formatting and comments in CGO-enabled builds.\n- CGO-disabled builds re-emit TOML/YAML with standard encoders.\n- JSON is re-emitted with stable indentation.\n- File permissions are preserved.\n\n##### validate\n\nValidate the configuration file and report any errors or warnings.\n\n`config validate` honors the root `--config` and `--merge-config` flags.\n\n```bash\nmarkata-go config validate [flags]\n```\n\n| Flag | Short | Description |\n|------|-------|-------------|\n| `--config` | `-c` | Config file to validate |\n\n**Examples:**\n\n```bash\n# Validate auto-discovered config, or built-in defaults if no config exists\nmarkata-go config validate\n\n# Validate specific config file\nmarkata-go config validate -c production.toml\nmarkata-go config validate -c custom.yaml\n\n# Validate with merged overrides\nmarkata-go config validate -m fast.toml\n```\n\n**Output:**\n\n```\nConfiguration is valid: markata-go.toml\n\n# Or with errors:\nErrors:\n  - output_dir: directory does not exist\n  - glob.patterns: at least one pattern required\n  - feeds[0].filter: invalid filter expression\n```\n\n##### init\n\nCreate a new configuration file with sensible defaults.\n\n```bash\nmarkata-go config init [filename] [flags]\n```\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `--force` | Overwrite existing config file | `false` |\n\n**Examples:**\n\n```bash\n# Create markata-go.toml with defaults\nmarkata-go config init\n\n# Create YAML config\nmarkata-go config init markata-go.yaml\n\n# Create with specific name\nmarkata-go config init site.toml\n\n# Overwrite existing config\nmarkata-go config init --force\n```\n\n---\n\n### aesthetic\n\nManage and inspect aesthetic presets for your site's visual styling.\n\n#### Usage\n\n```bash\nmarkata-go aesthetic \u003csubcommand\u003e\n```\n\n#### Subcommands\n\n##### list\n\nList all available aesthetic presets.\n\n```bash\nmarkata-go aesthetic list\n```\n\n**Example Output:**\n\n```\nAvailable aesthetics:\n\n  balanced    Default. Comfortable rounding, subtle shadows, normal spacing\n  brutal      Sharp corners, thick borders, tight spacing, no shadows\n  elevated    Generous rounding, layered shadows, generous spacing\n  minimal     No rounding, maximum whitespace, no shadows, hairline borders\n  precision   Subtle corners, compact spacing, hairline borders, minimal shadows\n```\n\n##### show\n\nDisplay the details of a specific aesthetic preset.\n\n```bash\nmarkata-go aesthetic show \u003cname\u003e\n```\n\n**Arguments:**\n\n| Argument | Description | Required |\n|----------|-------------|----------|\n| `name` | Name of the aesthetic to show | Yes |\n\n**Examples:**\n\n```bash\n# Show details of the elevated aesthetic\nmarkata-go aesthetic show elevated\n\n# Show details of the brutal aesthetic\nmarkata-go aesthetic show brutal\n```\n\n**Example Output:**\n\n```\nAesthetic: elevated\n\nDescription: Generous rounding, layered shadows, generous spacing\n\nValues:\n  border_radius:    16px\n  spacing_scale:    1.5\n  border_width:     0px\n  border_style:     none\n  shadow_intensity: 0.6\n  shadow_size:      lg\n```\n\n#### Available Aesthetics\n\n| Aesthetic | Description |\n|-----------|-------------|\n| `balanced` | Default. Comfortable rounding, subtle shadows, normal spacing |\n| `brutal` | Sharp corners, thick borders, tight spacing, no shadows |\n| `elevated` | Generous rounding, layered shadows, generous spacing |\n| `minimal` | No rounding, maximum whitespace, no shadows, hairline borders |\n| `precision` | Subtle corners, compact spacing, hairline borders, minimal shadows |\n\nSee [[themes-and-styling|Themes Guide]] for detailed aesthetic customization.\n\n---\n\n### palette\n\nManage, browse, and select color palettes for your site's theme.\n\n#### Usage\n\n```bash\nmarkata-go palette \u003csubcommand\u003e [flags]\n```\n\n#### Subcommands\n\n##### list\n\nList all available palettes from built-in, user, and project sources.\n\n```bash\nmarkata-go palette list\nmarkata-go palette list --variant dark\nmarkata-go palette list --json\n```\n\n##### info\n\nShow detailed information about a specific palette including colors, semantic mappings, and component colors.\n\n```bash\nmarkata-go palette info catppuccin-mocha\nmarkata-go palette info catppuccin-mocha --json\n```\n\n##### pick\n\nOpen an interactive full-screen TUI to browse and select a palette with live color previews. Sets the chosen palette in your config by default.\n\n```bash\n# Pick and set in your config (default)\nmarkata-go palette pick\n\n# Only print the name without updating config\nmarkata-go palette pick --no-set\n```\n\n**Flags:**\n\n| Flag | Description |\n|------|-------------|\n| `--no-set` | Only print the palette name without updating the config file |\n\nThe picker shows a two-panel layout with a fuzzy-filterable palette list on the left and a live color swatch preview on the right. Type to filter, arrow keys to navigate, Enter to select, Esc to cancel.\n\n**Composability:**\n\n```bash\n# View info for the palette you pick (without setting it)\nmarkata-go palette info \"$(markata-go palette pick --no-set)\"\n```\n\n##### check\n\nCheck a palette for accessibility (WCAG contrast ratios).\n\n```bash\nmarkata-go palette check catppuccin-mocha\n```\n\n##### preview\n\nPreview a palette's colors in the terminal.\n\n```bash\nmarkata-go palette preview catppuccin-mocha\n```\n\n##### new\n\nCreate a new custom palette interactively.\n\n```bash\nmarkata-go palette new my-brand\n```\n\n##### clone\n\nClone an existing palette as a starting point for customization.\n\n```bash\nmarkata-go palette clone catppuccin-mocha my-custom\n```\n\n##### export\n\nExport a palette to different formats (CSS, SCSS, JSON).\n\n```bash\nmarkata-go palette export catppuccin-mocha --format css\n```\n\n##### fetch\n\nImport a palette from [Lospec.com](https://lospec.com/palette-list).\n\n```bash\nmarkata-go palette fetch https://lospec.com/palette-list/sweetie-16.txt\n```\n\nSee [[themes-and-styling|Themes Guide]] for detailed palette customization.\n\n---\n\n## Environment Variables\n\nmarkata-go configuration can be overridden using environment variables with the `MARKATA_GO_` prefix.\n\n### Variable Naming Convention\n\nEnvironment variables follow this pattern:\n- Prefix: `MARKATA_GO_`\n- Key names: UPPERCASE with underscores\n- Nested keys: Use single underscore separation\n\n### Common Variables\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| `MARKATA_GO_OUTPUT_DIR` | Output directory | `dist` |\n| `MARKATA_GO_URL` | Site base URL | `https://staging.example.com` |\n| `MARKATA_GO_TITLE` | Site title | `My Staging Site` |\n| `MARKATA_GO_CONCURRENCY` | Worker count (0=auto) | `4` |\n| `MARKATA_GO_TEMPLATES_DIR` | Templates directory | `themes/custom/templates` |\n| `MARKATA_GO_ASSETS_DIR` | Static assets directory | `assets` |\n\n### Examples\n\n```bash\n# Build to a different directory\nMARKATA_GO_OUTPUT_DIR=dist markata-go build\n\n# Build for staging environment\nMARKATA_GO_URL=https://staging.example.com markata-go build\n\n# Limit concurrency for debugging\nMARKATA_GO_CONCURRENCY=1 markata-go build -v\n\n# Multiple overrides\nMARKATA_GO_OUTPUT_DIR=dist \\\nMARKATA_GO_URL=https://prod.example.com \\\nmarkata-go build --clean\n\n# In CI/CD pipelines\nexport MARKATA_GO_URL=\"${DEPLOY_URL}\"\nexport MARKATA_GO_OUTPUT_DIR=\"build\"\nmarkata-go build --clean\n```\n\n### Override Precedence\n\nConfiguration values are resolved in this order (later sources override earlier):\n\n1. Built-in defaults\n2. Configuration file\n3. Environment variables\n4. Command-line flags\n\n---\n\n## Exit Codes\n\nmarkata-go uses these common exit code patterns:\n\n| Code | Name | Description |\n|------|------|-------------|\n| `0` | Success | Command completed successfully |\n| `1` | Error | General error (configuration, plugin, I/O, etc.) |\n| `2` | Usage / Command-specific | Invalid CLI usage such as unknown flags or missing args, or command-specific non-success states documented by that command |\n| `130` | Interrupted | Command interrupted by user (Ctrl+C) |\n\n### Using Exit Codes in Scripts\n\n```bash\n#!/bin/bash\n\n# Build and check for success\nif markata-go build --clean; then\n    echo \"Build successful!\"\n    rsync -av output/ user@server:/var/www/\nelse\n    echo \"Build failed with exit code $?\"\n    exit 1\nfi\n```\n\n```bash\n# Validate before deploying\nmarkata-go config validate\nif [ $? -eq 0 ]; then\n    markata-go build --clean\nfi\n```\n\n---\n\n## Common Workflows\n\n### Development\n\n```bash\n# Start development server\nmarkata-go serve -v\n\n# In another terminal, create new content\nmarkata-go new \"My New Post\"\n```\n\n### Production Build\n\n```bash\n# Clean build for production\nmarkata-go build --clean -v\n\n# Or with environment-specific URL\nMARKATA_GO_URL=https://example.com markata-go build --clean\n```\n\n### CI/CD Pipeline\n\n```bash\n#!/bin/bash\nset -e\n\n# Validate configuration\nmarkata-go config validate\n\n# Build with production settings\nMARKATA_GO_URL=\"${DEPLOY_URL}\" markata-go build --clean\n\n# Deploy (example)\naws s3 sync output/ s3://my-bucket/ --delete\n```\n\nSee [[deployment-guide|Deployment]] for detailed deployment guides.\n\n---\n\n### migrate\n\nMigrate from Python markata to markata-go. Analyzes configuration files, filter expressions, and templates for compatibility.\n\n#### Usage\n\n```bash\nmarkata-go migrate [flags]\nmarkata-go migrate config [flags]\nmarkata-go migrate filter [expression]\nmarkata-go migrate templates [path]\n```\n\n#### Flags\n\n| Flag | Short | Description | Default |\n|------|-------|-------------|---------|\n| `--input` | `-i` | Input config file path | Auto-detect |\n| `--output` | `-o` | Output config file path | None |\n| `--dry-run` | `-n` | Show changes without writing | `false` |\n| `--format` | `-f` | Output format (toml, yaml) | `toml` |\n| `--json` | | Output results as JSON | `false` |\n\n#### Subcommands\n\n##### config\n\nMigrate configuration file only.\n\n```bash\nmarkata-go migrate config -i markata.toml -o markata-go.toml\n```\n\n##### filter\n\nCheck and migrate filter expressions.\n\n```bash\n# Check a specific expression\nmarkata-go migrate filter \"published == 'True'\"\n\n# Check all filters in config\nmarkata-go migrate filter\n```\n\n##### templates\n\nCheck template compatibility with pongo2.\n\n```bash\nmarkata-go migrate templates\nmarkata-go migrate templates ./my-templates\n```\n\n#### Examples\n\n```bash\n# Full migration analysis\nmarkata-go migrate\n\n# Dry run to see what would change\nmarkata-go migrate --dry-run\n\n# Migrate and write output\nmarkata-go migrate -o markata-go.toml\n\n# Migrate from pyproject.toml\nmarkata-go migrate -i pyproject.toml -o markata-go.toml\n\n# Check a filter expression\nmarkata-go migrate filter \"templateKey in ['blog', 'til']\"\n\n# Check templates for compatibility\nmarkata-go migrate templates\n```\n\n#### Exit Codes\n\n| Code | Description |\n|------|-------------|\n| `0` | Migration successful, no issues |\n| `1` | Migration completed with warnings |\n| `2` | Migration has incompatibilities |\n| `3` | Migration failed (invalid input) |\n\nSee [[migration-guide|Migration Guide]] for detailed migration instructions.\n\n---\n\n### explain\n\nShow detailed information about markata-go for AI agents and developers.\n\n#### Usage\n\n```bash\nmarkata-go explain [topic]\n```\n\n#### Arguments\n\n| Argument | Description | Required |\n|----------|-------------|----------|\n| `topic` | The topic to explain | No (shows overview if omitted) |\n\n#### Available Topics\n\n| Topic | Description |\n|-------|-------------|\n| (none) | General overview of markata-go |\n| `build` | The build command and build process |\n| `serve` | The development server |\n| `new` | Creating new content |\n| `content` | Finding, creating, and editing site content |\n| `init` | Initializing projects |\n| `config` | Configuration system |\n| `agents` | Agent skill installation and usage |\n| `plugins` | Plugin system and development |\n| `lifecycle` | Build lifecycle stages |\n| `templates` | Template system |\n| `feeds` | Feed generation system |\n\n#### Examples\n\n```bash\n# Show general overview\nmarkata-go explain\n\n# Get detailed info about the build process\nmarkata-go explain build\n\n# Learn about the plugin system\nmarkata-go explain plugins\n\n# Learn about the bundled agent skill\nmarkata-go explain agents\n\n# Follow the agent-oriented content workflow\nmarkata-go explain content\n\n# Understand the build lifecycle\nmarkata-go explain lifecycle\n\n# Learn about feeds and filtering\nmarkata-go explain feeds\n```\n\n#### Use Cases\n\nThe `explain` command is particularly useful for:\n\n- **AI coding agents**: Provides comprehensive context about markata-go's architecture and commands\n- **Content work from any directory**: `explain content` documents how to select a site, search, edit returned source paths, create content, and validate changes\n- **Site maintainers installing the bundled skill**: Shows how `markata-go agent install` fits into agent workflows\n- **New developers**: Quick reference for understanding how different parts work together\n- **Debugging**: Understanding the build process and configuration options\n- **Writing plugins**: Learning the plugin interfaces and lifecycle stages\n\n---\n\n### encryption\n\nUtilities for managing encryption passwords.\n\n#### Subcommands\n\n##### generate-password\n\nGenerate a password that satisfies the default encryption policy (≥ 14 characters, strong entropy).\n\n```\nmarkata-go encryption generate-password [--length \u003cn\u003e]\n```\n\n| Flag | Short | Description | Default |\n|------|-------|-------------|---------|\n| `--length` | | Desired password length (must be at least the configured minimum) | `14` |\n\nThe command prints only the generated password to stdout, making it easy to pipe into environment files or password managers. The optional `--length` flag requests a longer password; the minimum is always at least the configured `min_password_length`.\n\n#### Examples\n\n```\n# Generate a default length password\nmarkata-go encryption generate-password\n\n# Generate a longer password for a stricter key\nmarkata-go encryption generate-password --length 20\n```\n\n##### check\n\nCheck configured encryption keys against the active policy.\n\n```\nmarkata-go encryption check [--key \u003cname\u003e]\n```\n\n| Flag | Short | Description | Default |\n|------|-------|-------------|---------|\n| `--key` | | Check a specific key name instead of all configured keys | `\"\"` |\n\nBy default this command checks all keys referenced by `encryption.default_key` and `encryption.private_tags`.\nIt fails with a non-zero exit code if any key is missing from environment variables or too weak for the configured policy.\n\n##### encrypt-posts\n\nEncrypt all private Markdown source bodies matched by the active content glob configuration.\n\n```\nmarkata-go encryption encrypt-posts [--dry-run]\n```\n\n| Flag | Short | Description | Default |\n|------|-------|-------------|---------|\n| `--dry-run` | | Report files that would be encrypted without modifying them | `false` |\n\nThe command rewrites matching private posts in place by default. It skips draft, skipped, public, and already source-encrypted posts. Missing or weak keys fail before any files are written.\n\n##### decrypt-posts\n\nDecrypt source-encrypted Markdown bodies back to plaintext. This is the inverse of `encrypt-posts`.\n\n```\nmarkata-go encryption decrypt-posts [path...] [--dry-run]\n```\n\n| Flag | Short | Description | Default |\n|------|-------|-------------|---------|\n| `--dry-run` | | Report files that would be decrypted without modifying them | `false` |\n\nWith no path arguments the command scans the active content glob configuration. Explicit paths may be files or\ndirectories (directories are scanned recursively for `.md` files).\n\nThe key name is read from the `\u003c!-- markata-encrypted-source:v1 key=... --\u003e` marker, falling back to\n`encryption.default_key`. The password is read from `MARKATA_GO_ENCRYPTION_KEY_\u003cKEY\u003e`. Files that are not\nsource-encrypted are skipped, and frontmatter is preserved exactly as written.\n\n#### Examples\n\n```\n# Preview source encryption changes\nmarkata-go encryption encrypt-posts --dry-run\n\n# Encrypt private post source bodies in place\nmarkata-go encryption encrypt-posts\n\n# Decrypt a single file so you can edit it\nexport MARKATA_GO_ENCRYPTION_KEY_DEFAULT='your-password'\nmarkata-go encryption decrypt-posts pages/ar-calibration.md\n\n# Preview decrypting every encrypted post\nmarkata-go encryption decrypt-posts --dry-run\n```\n\n---\n\n## See Also\n\n- [[getting-started|Getting Started]] - Quick introduction to markata-go\n- [[configuration-guide|Configuration]] - Detailed configuration reference\n- [[deployment-guide|Deployment]] - Deployment guides for various platforms\n---\n\n## Editorial authoring\n\nCommit selected post edits with transparent contributor credit and exact\nrevision links. These commands preserve unrelated staged and unstaged work.\n\n```bash\nmarkata-go editorial start posts/article.md --author editor-id --role copy-editor\nmarkata-go editorial finish --session UUID --summary \"Corrected grammar\" --json\nmarkata-go editorial commit posts/article.md --author human-id \\\n  --role internal-link-editor --summary \"Added related links\" --dry-run\n```\n\n`start` requires clean tracked posts; `commit` explicitly attributes existing\nowned changes. `finish` appends revision records after the content SHA exists.\nUse `--json` to obtain the full list of resulting commits. See\n[Editorial authoring](../../guides/editorial-authoring/) and\n[Editorial history](../../guides/editorial-history/) for ownership rules,\nprimary author configuration, and the built-site comparison view.\n\n## Render Markdown without a site\n\n```bash\nprintf '# Hello\\n' | markata render\nprintf '# Hello\\n' | markata render --json --inline-assets\n```\n\n`render` reads stdin. `--json` returns the HTML fragment, feature signals and\nordered CSS/JS assets. `--inline-assets` embeds all bundled assets, including\nMermaid and Chart.js libraries, into the returned asset tags. `--asset-base`\nsets the linked asset URL prefix (default `/markata-assets`). `--unsafe` permits\nraw authored HTML for trusted content. No site build or configuration is needed.\nSee [Python and FastAPI rendering](/docs/guides/python-renderer/).\n\n`markata render --appearance` emits versioned JSON with reusable appearance picker\nmarkup, ordered style/script paths, and base64 asset bytes. It does not read stdin.\nHost applications serve these assets and insert the controls in their own layouts.\n\n`markata render --capabilities` emits the standalone renderer's versioned JSON\ncontract without reading stdin. Check its `features`, `diagram_modes`, and\n`asset_modes` before selecting an integration path. The report describes the\nstandalone renderer, not site-build plugins or a selected workspace. Do not\ncombine this flag with `--appearance` or `--workspace`.\n\nUse `markata render --stdio` for a long-running JSON Lines session. Send one\nJSON request per line with `id`, `op`, and, for rendering, `source`. Each\nnonempty request receives one JSON response line. Use `op: \"capabilities\"` to\ninspect support and `op: \"shutdown\"` to stop the process. Set render options\nper request in `options`; the command rejects `--workspace` and other render\nmode flags with `--stdio`. See the [stdio protocol](../../spec/spec/RENDERER_STDIO.md)\nfor framing, limits, errors, and a working example.\n\n## Go Markdown workbench demo\n\nFrom a source checkout, run the separate demo command:\n\n```bash\ngo run ./cmd/markata-workbench --listen 127.0.0.1:8767\n```\n\nThe default listen address is `127.0.0.1:8766`. Use `--help` for command help.\nThe [Go workbench guide](../guides/go-workbench/) covers editing, the render API,\nand embedding its HTTP handler in a Go application.\n\n### Browser LSP bridge\n\n```bash\nmarkata-go lsp --browser-workspace /absolute/path/to/site\n```\n\nThis option keeps the stdio transport and confines a browser bridge to a server-selected workspace.\nIt accepts the synthetic `.markata/browser-draft.md` URI and ignores browser requests to read watched files.\nThe [FastAPI editor](../guides/fastapi-editor/) uses this option behind its WebSocket endpoint.\nOrdinary editor clients continue to use `markata-go lsp` without this option.\n\nThe [Go editor example](../guides/go-workbench/) provides its own launch command:\n\n```bash\ngo run ./cmd/markata-workbench --workspace /absolute/path/to/site\n```\n\n`--workspace` selects the Markdown directory for completion. It defaults to the current directory.\n\n### workspace\n\nList discovered source metadata as JSON with `markata workspace --workspace PATH`.\nRead original source with `markata workspace --workspace PATH --file posts/hello.md`.\nSee the [workspace file tree guide](/docs/guides/renderer-site-tree/).\n\nUse `markata workspace --paths --workspace PATH` to list discovered source paths\nwithout loading document metadata. The editor uses this fast path on startup and\nloads titles and tags in the background.\n",
      "summary": "Complete reference for all markata-go commands, flags, and options",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "reference",
        "cli"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/youtube/",
      "url": "https://markata.dev/docs/guides/youtube/",
      "title": "Embedding YouTube Videos",
      "content_html": "\u003cp\u003emarkata-go automatically converts YouTube URLs into responsive embedded videos. Just paste a YouTube link on its own line, and it becomes a playable video embed.\u003c/p\u003e\n\u003cp\u003eNote: This guide covers the YouTube plugin (standalone URLs). The embeds plugin\u0026rsquo;s oEmbed-based YouTube renders use Lite YouTube by default.\u003c/p\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSimply paste a YouTube URL on its own line in your markdown:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCheck out this video:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehttps://www.youtube.com/watch?v=dQw4w9WgXcQ\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMore content below...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThat\u0026rsquo;s it! The URL will be converted into a responsive video player.\u003c/p\u003e\n\u003ch2 id=\"supported-url-formats\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSupported URL Formats\u003c/span\u003e \u003ca href=\"#supported-url-formats\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAll common YouTube URL formats work:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFormat\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eStandard\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehttps://www.youtube.com/watch?v=VIDEO_ID\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eShort\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehttps://youtu.be/VIDEO_ID\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMobile\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehttps://m.youtube.com/watch?v=VIDEO_ID\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"timestamps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTimestamps\u003c/span\u003e \u003ca href=\"#timestamps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eStart videos at a specific time by adding a timestamp:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehttps://youtu.be/dQw4w9WgXcQ?t=1m30s\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSupported timestamp formats:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSeconds: \u003ccode\u003e?t=90\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eMinutes and seconds: \u003ccode\u003e?t=1m30s\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eHours, minutes, seconds: \u003ccode\u003e?t=1h2m3s\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eStart parameter: \u003ccode\u003e?start=90\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eConfigure the YouTube plugin in your \u003ccode\u003emarkata-go.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eyoutube\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Enable/disable embeds (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eprivacy_enhanced\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e     \u003cspan class=\"c\"\u003e# Use privacy-enhanced mode (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtainer_class\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;youtube-embed\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# CSS class for styling\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elazy_load\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e            \u003cspan class=\"c\"\u003e# Lazy load videos (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"privacy-enhanced-mode\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrivacy-Enhanced Mode\u003c/span\u003e \u003ca href=\"#privacy-enhanced-mode\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBy default, videos use YouTube\u0026rsquo;s privacy-enhanced mode (\u003ccode\u003eyoutube-nocookie.com\u003c/code\u003e):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eNo tracking cookies\u003c/strong\u003e until the user clicks play\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGDPR compliant\u003c/strong\u003e - helps meet privacy regulations\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSame video experience\u003c/strong\u003e - playback works identically\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTo use standard YouTube embeds:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eyoutube\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eprivacy_enhanced\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"lazy-loading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLazy Loading\u003c/span\u003e \u003ca href=\"#lazy-loading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eLazy loading (enabled by default) improves page performance by only loading video iframes when they\u0026rsquo;re about to enter the viewport.\u003c/p\u003e\n\u003ch2 id=\"styling\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStyling\u003c/span\u003e \u003ca href=\"#styling\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eVideos are automatically responsive with a 16:9 aspect ratio. The default theme includes styling, but you can customize:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Custom video container styling */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eyoutube-embed\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003emargin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eborder-radius\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ebox-shadow\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"nb\"\u003ergba\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"what-doesn-t-get-embedded\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat Doesn’t Get Embedded\u003c/span\u003e \u003ca href=\"#what-doesn-t-get-embedded\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe plugin only converts URLs that are \u003cstrong\u003eon their own line\u003c/strong\u003e. These patterns are NOT converted:\u003c/p\u003e\n\u003ch3 id=\"inline-urls\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInline URLs\u003c/span\u003e \u003ca href=\"#inline-urls\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCheck out https://youtu.be/dQw4w9WgXcQ for more info.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis stays as a regular link because it\u0026rsquo;s inline with other text.\u003c/p\u003e\n\u003ch3 id=\"code-blocks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCode Blocks\u003c/span\u003e \u003ca href=\"#code-blocks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTo embed a video, use: \u003cspan class=\"sb\"\u003e`https://youtu.be/VIDEO_ID`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eURLs in code are preserved for documentation purposes.\u003c/p\u003e\n\u003ch3 id=\"invalid-video-ids\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInvalid Video IDs\u003c/span\u003e \u003ca href=\"#invalid-video-ids\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eURLs with invalid video IDs (not exactly 11 characters) are left unchanged.\u003c/p\u003e\n\u003ch2 id=\"output-html\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOutput HTML\u003c/span\u003e \u003ca href=\"#output-html\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe plugin generates this HTML structure:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;youtube-embed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eiframe\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://www.youtube-nocookie.com/embed/VIDEO_ID\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;YouTube video player\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003eframeborder\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003eallow\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003eallowfullscreen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eiframe\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"tips\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTips\u003c/span\u003e \u003ca href=\"#tips\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eOne URL per line\u003c/strong\u003e - Each video should be on its own line with blank lines before and after\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUse short URLs\u003c/strong\u003e - \u003ccode\u003eyoutu.be\u003c/code\u003e links are cleaner in your markdown\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAdd context\u003c/strong\u003e - Include a brief description before your video embed\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTest timestamps\u003c/strong\u003e - Preview your post to ensure timestamps work correctly\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"video-not-embedding\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVideo Not Embedding\u003c/span\u003e \u003ca href=\"#video-not-embedding\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eEnsure the URL is on its own line (not inline with text)\u003c/li\u003e\n\u003cli\u003eCheck that the video ID is valid (11 characters)\u003c/li\u003e\n\u003cli\u003eVerify the plugin is enabled in your config\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"video-not-playing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVideo Not Playing\u003c/span\u003e \u003ca href=\"#video-not-playing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eCheck if the video is available in your region\u003c/li\u003e\n\u003cli\u003eSome videos may have embedding disabled by the uploader\u003c/li\u003e\n\u003cli\u003eTry with \u003ccode\u003eprivacy_enhanced = false\u003c/code\u003e if issues persist\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"related\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRelated\u003c/span\u003e \u003ca href=\"#related\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[[markdown|Markdown Features]] - Other markdown enhancements\u003c/li\u003e\n\u003cli\u003e[[md-video|Video Embeds]] - Embed local video files\u003c/li\u003e\n\u003cli\u003e[[configuration-guide|Configuration]] - Global settings\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nmarkata-go automatically converts YouTube URLs into responsive embedded videos. Just paste a YouTube link on its own line, and it becomes a playable video embed.\n\nNote: This guide covers the YouTube plugin (standalone URLs). The embeds plugin's oEmbed-based YouTube renders use Lite YouTube by default.\n\n## Quick Start\n\nSimply paste a YouTube URL on its own line in your markdown:\n\n```markdown\nCheck out this video:\n\nhttps://www.youtube.com/watch?v=dQw4w9WgXcQ\n\nMore content below...\n```\n\nThat's it! The URL will be converted into a responsive video player.\n\n## Supported URL Formats\n\nAll common YouTube URL formats work:\n\n| Format | Example |\n|--------|---------|\n| Standard | `https://www.youtube.com/watch?v=VIDEO_ID` |\n| Short | `https://youtu.be/VIDEO_ID` |\n| Mobile | `https://m.youtube.com/watch?v=VIDEO_ID` |\n\n## Timestamps\n\nStart videos at a specific time by adding a timestamp:\n\n```markdown\nhttps://youtu.be/dQw4w9WgXcQ?t=1m30s\n```\n\nSupported timestamp formats:\n- Seconds: `?t=90`\n- Minutes and seconds: `?t=1m30s`\n- Hours, minutes, seconds: `?t=1h2m3s`\n- Start parameter: `?start=90`\n\n## Configuration\n\nConfigure the YouTube plugin in your `markata-go.toml`:\n\n```toml\n[markata-go.youtube]\nenabled = true              # Enable/disable embeds (default: true)\nprivacy_enhanced = true     # Use privacy-enhanced mode (default: true)\ncontainer_class = \"youtube-embed\"  # CSS class for styling\nlazy_load = true            # Lazy load videos (default: true)\n```\n\n### Privacy-Enhanced Mode\n\nBy default, videos use YouTube's privacy-enhanced mode (`youtube-nocookie.com`):\n\n- **No tracking cookies** until the user clicks play\n- **GDPR compliant** - helps meet privacy regulations\n- **Same video experience** - playback works identically\n\nTo use standard YouTube embeds:\n\n```toml\n[markata-go.youtube]\nprivacy_enhanced = false\n```\n\n### Lazy Loading\n\nLazy loading (enabled by default) improves page performance by only loading video iframes when they're about to enter the viewport.\n\n## Styling\n\nVideos are automatically responsive with a 16:9 aspect ratio. The default theme includes styling, but you can customize:\n\n```css\n/* Custom video container styling */\n.youtube-embed {\n  margin: 2rem 0;\n  border-radius: 8px;\n  box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n}\n```\n\n## What Doesn't Get Embedded\n\nThe plugin only converts URLs that are **on their own line**. These patterns are NOT converted:\n\n### Inline URLs\n\n```markdown\nCheck out https://youtu.be/dQw4w9WgXcQ for more info.\n```\n\nThis stays as a regular link because it's inline with other text.\n\n### Code Blocks\n\n```markdown\nTo embed a video, use: `https://youtu.be/VIDEO_ID`\n```\n\nURLs in code are preserved for documentation purposes.\n\n### Invalid Video IDs\n\nURLs with invalid video IDs (not exactly 11 characters) are left unchanged.\n\n## Output HTML\n\nThe plugin generates this HTML structure:\n\n```html\n\u003cdiv class=\"youtube-embed\"\u003e\n  \u003ciframe\n    src=\"https://www.youtube-nocookie.com/embed/VIDEO_ID\"\n    title=\"YouTube video player\"\n    frameborder=\"0\"\n    allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n    allowfullscreen\n    loading=\"lazy\"\u003e\n  \u003c/iframe\u003e\n\u003c/div\u003e\n```\n\n## Tips\n\n1. **One URL per line** - Each video should be on its own line with blank lines before and after\n2. **Use short URLs** - `youtu.be` links are cleaner in your markdown\n3. **Add context** - Include a brief description before your video embed\n4. **Test timestamps** - Preview your post to ensure timestamps work correctly\n\n## Troubleshooting\n\n### Video Not Embedding\n\n- Ensure the URL is on its own line (not inline with text)\n- Check that the video ID is valid (11 characters)\n- Verify the plugin is enabled in your config\n\n### Video Not Playing\n\n- Check if the video is available in your region\n- Some videos may have embedding disabled by the uploader\n- Try with `privacy_enhanced = false` if issues persist\n\n## Related\n\n- [[markdown|Markdown Features]] - Other markdown enhancements\n- [[md-video|Video Embeds]] - Embed local video files\n- [[configuration-guide|Configuration]] - Global settings\n",
      "summary": "How to embed YouTube videos in your posts with a simple one-line URL",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "guides",
        "youtube",
        "media"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/themes/",
      "url": "https://markata.dev/docs/guides/themes/",
      "title": "Themes and Aesthetics",
      "content_html": "\u003ch2 id=\"themes-palettes-and-aesthetics\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThemes, Palettes, and Aesthetics\u003c/span\u003e \u003ca href=\"#themes-palettes-and-aesthetics\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go makes it easy to customize your site\u0026rsquo;s appearance. You can go from zero configuration to a beautiful site, then progressively customize as needed.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003ePrerequisites:\u003c/strong\u003e This guide assumes you\u0026rsquo;ve completed the \u003ca href=\"/docs/getting-started/\"\u003eGetting Started\u003c/a\u003e guide and have a working markata-go site.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe fastest way to change your site\u0026rsquo;s look is to pick a color palette:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-mocha\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThat\u0026rsquo;s it! Your entire site now uses the Catppuccin Mocha color scheme.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"header-preferences\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHeader Preferences\u003c/span\u003e \u003ca href=\"#header-preferences\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe default header keeps search prominent and groups secondary settings under\nthe \u003cstrong\u003eAppearance and preferences\u003c/strong\u003e sliders icon. Open it to select a light or\ndark palette, customize the style and font, or change reading size. Expand\n\u003cstrong\u003eLoading: Auto\u003c/strong\u003e at the bottom to choose \u003cstrong\u003eAuto\u003c/strong\u003e (recommended),\n\u003cstrong\u003eSave Data\u003c/strong\u003e, or \u003cstrong\u003eFull Quality\u003c/strong\u003e for media. The browser remembers your\npreferences, and Auto can suggest a better choice based on the connection.\u003c/p\u003e\n\u003cp\u003ePress \u003ccode\u003e/\u003c/code\u003e to focus search, \u003ccode\u003et\u003c/code\u003e to open the appearance panel, or \u003ccode\u003e\\\\\u003c/code\u003e to\ntoggle light/dark mode. The panel closes with Escape. On sites where the full\npalette picker is disabled, the loading control stays available in the header.\u003c/p\u003e\n\u003ch2 id=\"available-palettes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAvailable Palettes\u003c/span\u003e \u003ca href=\"#available-palettes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go includes 10 built-in color palettes. Use \u003ccode\u003emarkata-go palette list\u003c/code\u003e to see them all:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePalette\u003c/th\u003e\n\u003cth\u003eVariant\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edefault-light\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003elight\u003c/td\u003e\n\u003ctd\u003eClean, minimal light theme\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edefault-dark\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003edark\u003c/td\u003e\n\u003ctd\u003eClean, minimal dark theme\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecatppuccin-mocha\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003edark\u003c/td\u003e\n\u003ctd\u003eSoothing pastel colors, high contrast\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecatppuccin-latte\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003elight\u003c/td\u003e\n\u003ctd\u003eSoothing pastel colors, light variant\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enord-dark\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003edark\u003c/td\u003e\n\u003ctd\u003eArctic, north-bluish colors\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egruvbox-dark\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003edark\u003c/td\u003e\n\u003ctd\u003eRetro groove, warm colors\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edracula\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003edark\u003c/td\u003e\n\u003ctd\u003eVibrant purple on dark\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erose-pine\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003edark\u003c/td\u003e\n\u003ctd\u003eSoho vibes, natural colors\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esolarized-dark\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003edark\u003c/td\u003e\n\u003ctd\u003eScientifically designed colors\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etokyo-night\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003edark\u003c/td\u003e\n\u003ctd\u003eTokyo city lights inspired\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"previewing-palettes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePreviewing Palettes\u003c/span\u003e \u003ca href=\"#previewing-palettes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePreview a palette before using it:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Show palette colors and contrast info\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette info catppuccin-mocha\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check WCAG accessibility compliance\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette check catppuccin-mocha\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"configuration-levels\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration Levels\u003c/span\u003e \u003ca href=\"#configuration-levels\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go supports progressive customization - start simple and add complexity only when needed.\u003c/p\u003e\n\u003ch3 id=\"level-1-just-pick-a-palette\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLevel 1: Just Pick a Palette\u003c/span\u003e \u003ca href=\"#level-1-just-pick-a-palette\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dracula\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"level-2-override-specific-colors\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLevel 2: Override Specific Colors\u003c/span\u003e \u003ca href=\"#level-2-override-specific-colors\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eKeep your palette but tweak a few colors:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;nord-dark\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--color-primary\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#88c0d0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--color-link\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#8fbcbb\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"level-3-add-custom-css\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLevel 3: Add Custom CSS\u003c/span\u003e \u003ca href=\"#level-3-add-custom-css\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd a custom CSS file that loads after the theme:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-mocha\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecustom_css\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;my-styles.css\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen create \u003ccode\u003estatic/my-styles.css\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Override any theme styles */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003epost-title\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003efont-family\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Georgia\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003eserif\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003esite-header\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eborder-bottom\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"kc\"\u003esolid\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eprimary\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"level-4-override-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLevel 4: Override Templates\u003c/span\u003e \u003ca href=\"#level-4-override-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOverride specific template files by creating them in your \u003ccode\u003etemplates/\u003c/code\u003e directory:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emy-site/\n├── templates/\n│   └── partials/\n│       └── footer.html    # Your custom footer\n└── markata-go.toml\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYour custom templates take precedence over theme templates.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"theme-configuration-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTheme Configuration Reference\u003c/span\u003e \u003ca href=\"#theme-configuration-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFull configuration options:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Theme name (currently only \u0026#34;default\u0026#34; is available)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Color palette to use\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-mocha\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# CSS variable overrides\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--color-primary\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#8b5cf6\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--color-background\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#1a1a2e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--color-text\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#eaeaea\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--color-link\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#06b6d4\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--color-link-hover\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#22d3ee\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--content-width\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;800px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--font-family\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;Inter\u0026#39;, sans-serif\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Custom CSS file (relative to static/ directory)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecustom_css\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;custom.css\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"available-css-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAvailable CSS Variables\u003c/span\u003e \u003ca href=\"#available-css-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThese CSS custom properties can be overridden:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--color-background\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePage background\u003c/td\u003e\n\u003ctd\u003eDepends on palette\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--color-text\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBody text\u003c/td\u003e\n\u003ctd\u003eDepends on palette\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--color-primary\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePrimary accent color\u003c/td\u003e\n\u003ctd\u003eDepends on palette\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--color-link\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLink color\u003c/td\u003e\n\u003ctd\u003eDepends on palette\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--color-link-hover\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLink hover color\u003c/td\u003e\n\u003ctd\u003eDepends on palette\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--color-border\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSoft hairline border (text ink mixed 16% into the background)\u003c/td\u003e\n\u003ctd\u003eDepends on palette\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--color-border-strong\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFull-contrast border ink for focus rings and emphasis\u003c/td\u003e\n\u003ctd\u003eDepends on palette\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--color-border-soft\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e--color-border\u003c/code\u003e at 60% alpha, for section dividers\u003c/td\u003e\n\u003ctd\u003eDerived\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--heading-rule\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eColor of the short accent bar under \u003ccode\u003eh1\u003c/code\u003e/\u003ccode\u003eh2\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ecolor-mix(in srgb, var(--color-primary) 55%, transparent)\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--radius-sm\u003c/code\u003e / \u003ccode\u003e--radius\u003c/code\u003e / \u003ccode\u003e--radius-lg\u003c/code\u003e / \u003ccode\u003e--radius-xl\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCorner radius scale\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e0.375rem\u003c/code\u003e / \u003ccode\u003e0.5rem\u003c/code\u003e / \u003ccode\u003e0.75rem\u003c/code\u003e / \u003ccode\u003e1rem\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--leading-prose\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eArticle body line-height\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e1.7\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--color-code-bg\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCode block background\u003c/td\u003e\n\u003ctd\u003eDepends on palette\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--color-code-text\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCode block text\u003c/td\u003e\n\u003ctd\u003eDepends on palette\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--color-code-comment\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCode comments\u003c/td\u003e\n\u003ctd\u003eDepends on palette\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--color-code-keyword\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCode keywords\u003c/td\u003e\n\u003ctd\u003eDepends on palette\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--color-code-string\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCode strings\u003c/td\u003e\n\u003ctd\u003eDepends on palette\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--color-code-number\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCode numbers\u003c/td\u003e\n\u003ctd\u003eDepends on palette\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--color-code-function\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCode functions\u003c/td\u003e\n\u003ctd\u003eDepends on palette\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--color-code-type\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCode types and tags\u003c/td\u003e\n\u003ctd\u003eDepends on palette\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--color-code-operator\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCode operators\u003c/td\u003e\n\u003ctd\u003eDepends on palette\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--content-width\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eArticle measure in \u003ccode\u003ech\u003c/code\u003e (relative to article text size)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e64ch\u003c/code\u003e at the \u003ccode\u003elarge\u003c/code\u003e preset\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--font-family\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBody font\u003c/td\u003e\n\u003ctd\u003eSystem fonts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--font-family-mono\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCode font\u003c/td\u003e\n\u003ctd\u003eMonospace fonts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--article-progress-height\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSticky article progress bar height\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e3px\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--article-progress-track\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBackground for the empty progress track\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ecolor-mix(in srgb, var(--color-text) 8%, transparent)\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--article-progress-start\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGradient start color for the filled portion\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003evar(--color-primary)\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--article-progress-end\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGradient end color for the filled portion\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003evar(--color-primary-light, var(--color-primary))\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--article-progress-glow\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGlow color around the indicator\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ecolor-mix(in srgb, var(--color-primary) 35%, transparent)\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"article-reading-progress-indicator\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eArticle Reading Progress Indicator\u003c/span\u003e \u003ca href=\"#article-reading-progress-indicator\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEach article page renders a slim, sticky progress track (\u003ccode\u003e.article-progress\u003c/code\u003e) that follows the reader as they scroll. The indicator is powered by the \u003ccode\u003einitArticleProgressIndicator\u003c/code\u003e script, which throttles scroll events with \u003ccode\u003erequestAnimationFrame\u003c/code\u003e and updates the fill amount by transforming \u003ccode\u003e.article-progress__indicator\u003c/code\u003e. The fill tracks the scroll position directly, with no easing lag, and uses the palette\u0026rsquo;s primary colors in light and dark mode. The track is hidden on non-post pages and honors \u003ccode\u003eprefers-reduced-motion\u003c/code\u003e via CSS.\u003c/p\u003e\n\u003cp\u003eOverride the CSS variables above to tune the look. Example:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--article-progress-height\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;5px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--article-progress-track\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;rgba(255, 255, 255, 0.35)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--article-progress-start\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#facc15\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--article-progress-end\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#fb923c\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--article-progress-glow\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;rgba(250, 204, 21, 0.8)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBecause the indicator is just another element in the post template, you can also restyle it by targeting \u003ccode\u003e.article-progress\u003c/code\u003e and \u003ccode\u003e.article-progress__indicator\u003c/code\u003e from a custom CSS file loaded via \u003ccode\u003emarkata-go.theme.custom_css\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"dark-mode-support\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDark Mode Support\u003c/span\u003e \u003ca href=\"#dark-mode-support\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go uses an explicit theme mode model:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003euse dark by default (or \u003ccode\u003etheme.fallback_mode\u003c/code\u003e), and\u003c/li\u003e\n\u003cli\u003eswitch to light only when the visitor explicitly chooses light mode.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"using-different-palettes-for-light-dark\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing Different Palettes for Light/Dark\u003c/span\u003e \u003ca href=\"#using-different-palettes-for-light-dark\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-latte\u0026#34;\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Light mode\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette_dark\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-mocha\u0026#34;\u003c/span\u003e   \u003cspan class=\"c\"\u003e# Dark mode palette\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBy default, the site renders in dark mode.\nWhen a visitor explicitly switches to light mode, that preference is saved in localStorage and reused on future visits.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-latte\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette_dark\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-mocha\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efallback_mode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dark\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# or \u0026#34;light\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"every-palette-has-both-modes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEvery Palette Has Both Modes\u003c/span\u003e \u003ca href=\"#every-palette-has-both-modes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eYou never have to pick a pair by hand. Every palette resolves to a light and a\ndark variant:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eExplicit families\u003c/strong\u003e — \u003ccode\u003eeverforest-light\u003c/code\u003e/\u003ccode\u003eeverforest-dark\u003c/code\u003e,\n\u003ccode\u003ecatppuccin-latte\u003c/code\u003e/\u003ccode\u003ecatppuccin-mocha\u003c/code\u003e, \u003ccode\u003erose-pine-dawn\u003c/code\u003e/\u003ccode\u003erose-pine\u003c/code\u003e, and\nsimilar named pairs are used as-is.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDerived counterparts\u003c/strong\u003e — a palette that ships only one variant\n(\u003ccode\u003edracula\u003c/code\u003e, \u003ccode\u003ematte-black\u003c/code\u003e, \u003ccode\u003emonokai\u003c/code\u003e, the Lospec palettes, …) gets an\nautomatically derived counterpart named \u003ccode\u003e\u0026lt;palette\u0026gt;-light\u003c/code\u003e or\n\u003ccode\u003e\u0026lt;palette\u0026gt;-dark\u003c/code\u003e. The derivation keeps every hue, compresses backgrounds\ninto a soft near-white (or near-black) band, and pushes text and links\nuntil they meet WCAG AA against every derived surface.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dracula\u0026#34;\u003c/span\u003e   \u003cspan class=\"c\"\u003e# dark mode: dracula, light mode: dracula-light (derived)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDerived names work anywhere a palette name is accepted (\u003ccode\u003epalette_light\u003c/code\u003e,\n\u003ccode\u003epalette_dark\u003c/code\u003e, calendar rules, the switcher include/exclude lists) and show\nup in the multi-palette switcher as the family\u0026rsquo;s other variant. If you prefer\na hand-tuned light theme for a dark-only palette, set \u003ccode\u003epalette_light\u003c/code\u003e\nexplicitly and the derived one is ignored.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"live-theme-picker\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLive Theme Picker\u003c/span\u003e \u003ca href=\"#live-theme-picker\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEvery site ships with a live theme picker. Visitors can restyle the site in any built-in palette without changing your configured default. The header only gains two small round buttons:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eMode toggle\u003c/strong\u003e (sun/moon): switch between light and dark.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTheme button\u003c/strong\u003e (painter\u0026rsquo;s palette icon, dotted with the current theme\u0026rsquo;s accent colors): opens the picker.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe picker opens as a compact popover (a bottom sheet on phones, so the page stays visible above it) with three tabs. Every tab is a grid of live preview cards:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eColors\u003c/strong\u003e: each card renders in that theme\u0026rsquo;s own background, surface, text, accent, and status colors. Includes search, Light/Dark buttons to browse either mode, Shuffle for a random theme, a \u003cstrong\u003eSeasonal\u003c/strong\u003e card, and a calendar button that shows the seasonal schedule.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eStyle\u003c/strong\u003e: each card draws its corners, borders, and shadows in that aesthetic.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFont\u003c/strong\u003e: each card shows a heading, body line, and code sample in that font pack. Text size buttons (Small to X-Large) sit above the grid.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWith a mouse, hovering a card shows that theme, style, or font on the whole page right away. Move off the cards and the page goes back to your current choice; click to keep it. Hovering a holiday or season in the seasonal schedule previews its colors the same way. On touch screens, tap to choose.\u003c/p\u003e\n\u003cp\u003eTo move fast, use the \u003cstrong\u003e‹ ›\u003c/strong\u003e buttons in the picker\u0026rsquo;s top bar. They step through the current tab and show the name of the current choice, and the page updates on every tap. Arrow keys, Home/End, and PageUp/PageDown do the same from the keyboard. The picker remembers the last tab you used.\u003c/p\u003e\n\u003cp\u003eThe bottom bar has a labeled \u003cstrong\u003eReset\u003c/strong\u003e button, which goes back to the site\u0026rsquo;s default theme, style, and font. While you run \u003ccode\u003emarkata-go serve\u003c/code\u003e, it also shows \u003cstrong\u003eBake\u003c/strong\u003e, which writes the current choices into your site config (see below). Published sites never show Bake.\u003c/p\u003e\n\u003cp\u003eOn phones, every control is at least 40px tall, the search field uses 16px text so iOS does not zoom, and the sheet leaves room for the home indicator.\u003c/p\u003e\n\u003cp\u003eSites are dark by default (\u003ccode\u003efallback_mode = \u0026quot;dark\u0026quot;\u003c/code\u003e): a first-time visitor sees the dark palette regardless of their OS preference until they flip the mode toggle.\u003c/p\u003e\n\u003ch3 id=\"baking-a-look-into-your-config\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBaking a look into your config\u003c/span\u003e \u003ca href=\"#baking-a-look-into-your-config\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eRun \u003ccode\u003emarkata-go serve\u003c/code\u003e, open the picker, and choose a theme, style, font, and text size. Click \u003cstrong\u003eBake\u003c/strong\u003e; the button changes to \u003cstrong\u003eBake into markata-go.toml?\u003c/strong\u003e (naming the file it will edit, and marked \u003cstrong\u003e(override)\u003c/strong\u003e when that is a \u003ccode\u003e--merge-config\u003c/code\u003e file). Click again within four seconds to write it. The dev server updates the file, rebuilds, and live-reloads, so every visitor now starts with that look:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;gruvbox-dark\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette_light\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;gruvbox-light\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette_dark\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;gruvbox-dark\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efallback_mode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dark\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eaesthetic\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;brutal\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efontpack\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;editorial\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext_size\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;large\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003efallback_mode\u003c/code\u003e and \u003ccode\u003etext_size\u003c/code\u003e are only baked when you picked them yourself in the picker; otherwise bake leaves the site\u0026rsquo;s settings alone, because they are usually each visitor\u0026rsquo;s preference.\u003c/p\u003e\n\u003cp\u003eBake picks the file carefully:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIt looks at the root config, every file it pulls in with \u003ccode\u003einclude = [...]\u003c/code\u003e (for example a \u003ccode\u003econfig/\u003c/code\u003e directory), and any \u003ccode\u003e--merge-config\u003c/code\u003e files.\u003c/li\u003e\n\u003cli\u003eIf one or more already have a \u003ccode\u003e[markata-go.theme]\u003c/code\u003e section, it edits the one that takes effect (the last to load). A theme in \u003ccode\u003econfig/theme.toml\u003c/code\u003e stays there.\u003c/li\u003e\n\u003cli\u003eOtherwise it adds \u003ccode\u003e[markata-go.theme]\u003c/code\u003e to the root config, or creates \u003ccode\u003emarkata-go.toml\u003c/code\u003e when the site has none.\u003c/li\u003e\n\u003cli\u003eIf the site has no config and serve is using your global \u003ccode\u003e~/.config/markata-go/config.toml\u003c/code\u003e, the button reads \u003cstrong\u003eBake unavailable\u003c/strong\u003e: bake never edits your global defaults. Create a \u003ccode\u003emarkata-go.toml\u003c/code\u003e in the site first.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eOnly the baked keys change. Comments, key order, and other settings are kept, and existing keys are updated in place. TOML, YAML, and JSON configs all work. If the theme is written in a shape bake cannot edit safely (a TOML inline table \u003ccode\u003etheme = { ... }\u003c/code\u003e, a YAML flow mapping, or a multi-line value), bake leaves the file alone and reports the error; convert it to a normal table and try again. \u003ccode\u003eMARKATA_GO_THEME_*\u003c/code\u003e environment variables still override the file, and bake warns when one is set.\u003c/p\u003e\n\u003cp\u003eAfter a successful bake the picker names the keys it wrote and clears your browser\u0026rsquo;s saved picks, so what you see is the site default. Bake uses the same checks as the settings sidebar: if the config does not load back as written, every file is restored. A baked key also replaces any unsaved sidebar preview of it.\u003c/p\u003e\n\u003cp\u003eTo change other theme settings, such as \u003ccode\u003epalette_light\u003c/code\u003e, \u003ccode\u003ecustom_css\u003c/code\u003e, or \u003ccode\u003eswitcher.enabled\u003c/code\u003e, click \u003cstrong\u003eAll settings\u003c/strong\u003e next to Bake. It opens the serve-only settings sidebar at the Theme section (see \u003ca href=\"/docs/guides/configuration/#edit-settings-while-serving\"\u003eEdit Settings While Serving\u003c/a\u003e).\u003c/p\u003e\n\u003ch3 id=\"seasonal\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSeasonal\u003c/span\u003e \u003ca href=\"#seasonal\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe \u003cstrong\u003eSeasonal\u003c/strong\u003e card, first in the Colors grid, picks a palette from today\u0026rsquo;s date. It follows the northern hemisphere seasons:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSeason\u003c/th\u003e\n\u003cth\u003eStarts\u003c/th\u003e\n\u003cth\u003ePalette\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eSpring\u003c/td\u003e\n\u003ctd\u003eMar 20\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epollen8\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSummer\u003c/td\u003e\n\u003ctd\u003eJun 21\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003esummer-beach\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAutumn\u003c/td\u003e\n\u003ctd\u003eSep 22\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eautumn\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWinter\u003c/td\u003e\n\u003ctd\u003eDec 21\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ewinter-frost\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eIt switches to a holiday palette for the three days before a holiday and on the day itself:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eHoliday\u003c/th\u003e\n\u003cth\u003eDate\u003c/th\u003e\n\u003cth\u003ePalette\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eNew Year\u003c/td\u003e\n\u003ctd\u003eJan 1\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ewhite-gold\u003c/code\u003e / \u003ccode\u003eblack-gold\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLunar New Year\u003c/td\u003e\n\u003ctd\u003evaries\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003elunar-new-year\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eValentine\u0026rsquo;s Day\u003c/td\u003e\n\u003ctd\u003eFeb 14\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003evalentine\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSt. Patrick\u0026rsquo;s Day\u003c/td\u003e\n\u003ctd\u003eMar 17\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003est-patricks\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eEaster\u003c/td\u003e\n\u003ctd\u003evaries (Western)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eblessing\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eEarth Day\u003c/td\u003e\n\u003ctd\u003eApr 22\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eeverforest-light\u003c/code\u003e / \u003ccode\u003eeverforest-dark\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHalloween\u003c/td\u003e\n\u003ctd\u003eOct 31\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehalloween\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDiwali\u003c/td\u003e\n\u003ctd\u003evaries (Lakshmi Puja)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ediwali\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHanukkah\u003c/td\u003e\n\u003ctd\u003evaries, all 8 days\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehanukkah\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eChristmas\u003c/td\u003e\n\u003ctd\u003eDec 25\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003echristmas\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eTo see the schedule, open the picker and click the calendar button next to Shuffle on the Colors tab. It shows:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ea strip for the current year, colored with each season\u0026rsquo;s and holiday\u0026rsquo;s theme, with a line at today\u003c/li\u003e\n\u003cli\u003ea \u003cstrong\u003eComing up\u003c/strong\u003e list: what is showing now, until when, and how long is left, then each upcoming holiday (its dates and how many days it shows, lead days included) and season change (its length in weeks) over the next year, each with a color swatch\u003c/li\u003e\n\u003cli\u003ea \u003cstrong\u003eUse Seasonal\u003c/strong\u003e button, if you picked a different theme\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eHover a band in the strip or a row in the list to preview that period\u0026rsquo;s colors on the page. The hovered band and its row are outlined together, a line under the strip spells out the period\u0026rsquo;s dates and length, and the picker\u0026rsquo;s top label reads \u003cstrong\u003ePreview: …\u003c/strong\u003e while anything is being previewed. On touch screens, tap a band or row to see its dates without changing the page.\u003c/p\u003e\n\u003cp\u003eThe schedule follows the Light/Dark buttons, so you see the palettes for the mode you are browsing. Click the calendar button again, search, or step with ‹ › to go back to the grid.\u003c/p\u003e\n\u003cp\u003eSeasonal follows the light/dark toggle and uses each palette\u0026rsquo;s matching variant. The date comes from the visitor\u0026rsquo;s clock, and the head script resolves it before the first paint, so nothing flashes. Easter is calculated. Other moving holidays come from a built-in table: Lunar New Year and Hanukkah through 2035, Diwali through 2033. Holidays and seasons whose palettes are excluded by \u003ccode\u003e[markata-go.theme.switcher]\u003c/code\u003e are skipped.\u003c/p\u003e\n\u003cp\u003eTo make seasonal the default for every visitor who has not picked a theme, set \u003ccode\u003eseasonal = true\u003c/code\u003e. Your \u003ccode\u003epalette\u003c/code\u003e settings stay as the fallback (for example, when the picker is disabled):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ayu-dark\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eseasonal\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBake\u003c/strong\u003e writes \u003ccode\u003eseasonal = true\u003c/code\u003e when Seasonal is selected and leaves your \u003ccode\u003epalette\u003c/code\u003e settings as the fallback. Baking a regular theme sets \u003ccode\u003eseasonal = false\u003c/code\u003e if seasonal was on.\u003c/p\u003e\n\u003ch3 id=\"styles\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStyles\u003c/span\u003e \u003ca href=\"#styles\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe \u003cstrong\u003eStyle\u003c/strong\u003e tab switches the aesthetic, which sets the shape and depth of code blocks, cards, admonitions, tables, images, and form controls:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eStyle\u003c/th\u003e\n\u003cth\u003eLook\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eminimal\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault. Soft 1px borders, small radii, no shadows\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebalanced\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMedium radii with a light drop shadow\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eelevated\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLarge radii, borderless surfaces lifted by soft shadows\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eprecision\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNear-square corners with crisp hairline borders\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebrutal\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSquare corners, 2px ink borders, and hard offset shadows in the palette\u0026rsquo;s accent color, applied to cards, code, tables, buttons, inputs, search, and share buttons\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"fonts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFonts\u003c/span\u003e \u003ca href=\"#fonts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe \u003cstrong\u003eFont\u003c/strong\u003e tab lists every bundled font pack as a preview card with its heading, body, and code faces. The default is the zero-download \u003ccode\u003esystem\u003c/code\u003e pack: platform-native \u003cstrong\u003esystem-ui\u003c/strong\u003e headings/body and \u003cstrong\u003eui-monospace\u003c/strong\u003e code. The expressive \u003cstrong\u003eBrush\u003c/strong\u003e (Knewave, Space Grotesk, DM Mono) remains opt-in. Bundled alternative fonts are self-hosted, and a preview only downloads a face if selected or scrolled into view. With the font picker enabled, the build may still copy bundled font files to \u003ccode\u003eassets/fonts/\u003c/code\u003e so visitors can switch packs. Set \u003ccode\u003efontpack\u003c/code\u003e in \u003ccode\u003e[markata-go.theme]\u003c/code\u003e to override the default for a site.\u003c/p\u003e\n\u003cp\u003eThe active font pack preloads its distinct body, display, and heading faces.\nPacks with separate display and heading fonts keep both ready for the first\npaint. Shared faces are fetched once; code fonts and extended character\ncoverage load when needed.\u003c/p\u003e\n\u003ch3 id=\"no-flash-on-load\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNo flash on load\u003c/span\u003e \u003ca href=\"#no-flash-on-load\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eA visitor\u0026rsquo;s choice is restored by a tiny inline script in \u003ccode\u003e\u0026lt;head\u0026gt;\u003c/code\u003e before any stylesheet paints, so return visits render in the chosen theme from the first frame. Transitions are suppressed during a switch, and view-transition navigation keeps the chosen theme.\u003c/p\u003e\n\u003ch3 id=\"keyboard-shortcuts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKeyboard Shortcuts\u003c/span\u003e \u003ca href=\"#keyboard-shortcuts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eKey\u003c/th\u003e\n\u003cth\u003eAction\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003et\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOpen or close the theme picker\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNext theme (shows a toast)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e,\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePrevious theme\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNext style (aesthetic)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026lt;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePrevious style\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ef\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNext font\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eF\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePrevious font\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\\\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eToggle dark/light mode\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eInside the picker:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e1\u003c/code\u003e, \u003ccode\u003e2\u003c/code\u003e, and \u003ccode\u003e3\u003c/code\u003e switch to the Colors, Style, and Font tabs.\u003c/li\u003e\n\u003cli\u003eArrow keys preview.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eEnter\u003c/code\u003e keeps the choice and closes.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eEscape\u003c/code\u003e closes.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eOn the tab bar, \u003ccode\u003e←\u003c/code\u003e/\u003ccode\u003e→\u003c/code\u003e move between tabs and \u003ccode\u003e↓\u003c/code\u003e moves into the grid.\u003c/p\u003e\n\u003ch3 id=\"how-choices-are-stored\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow choices are stored\u003c/span\u003e \u003ca href=\"#how-choices-are-stored\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eChoices are saved per mode in \u003ccode\u003elocalStorage\u003c/code\u003e:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eKey\u003c/th\u003e\n\u003cth\u003eValue\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecolor-mode\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003elight\u003c/code\u003e or \u003ccode\u003edark\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etheme-palette-light\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePalette used in light mode, or \u003ccode\u003eseasonal\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etheme-palette-dark\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePalette used in dark mode, or \u003ccode\u003eseasonal\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etheme-aesthetic\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChosen aesthetic\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etheme-fontpack\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChosen font pack\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etext-size\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChosen reading size\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etheme-picker-tab\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLast picker tab (\u003ccode\u003ecolors\u003c/code\u003e, \u003ccode\u003estyle\u003c/code\u003e, \u003ccode\u003efont\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003ePicking a theme also stores its counterpart for the other mode. For example, choosing Gruvbox in dark mode makes the mode toggle switch to Gruvbox Light. Picking your site\u0026rsquo;s default pair clears the stored keys, so the visitor follows future default changes again.\u003c/p\u003e\n\u003ch3 id=\"disabling-the-picker\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDisabling the picker\u003c/span\u003e \u003ca href=\"#disabling-the-picker\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eswitcher\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e      \u003cspan class=\"c\"\u003e# remove the picker; ship only your palette\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emode_toggle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e   \u003cspan class=\"c\"\u003e# keep the sun/moon toggle\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWith the picker disabled, only the configured palette\u0026rsquo;s CSS and font pack are generated, and the text-size control goes back to the header.\u003c/p\u003e\n\u003ch3 id=\"filtering-palettes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFiltering Palettes\u003c/span\u003e \u003ca href=\"#filtering-palettes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBy default, all discovered palettes are included. You can control which palettes appear:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eExclude specific palettes:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eswitcher\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_all\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default-light\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default-dark\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Hide these palettes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eInclude only specific palettes:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eswitcher\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_all\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-mocha\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-latte\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;nord-dark\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;nord-light\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYour configured default palettes are always available in the picker.\u003c/p\u003e\n\u003ch3 id=\"switcher-configuration-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSwitcher Configuration Reference\u003c/span\u003e \u003ca href=\"#switcher-configuration-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eboolean\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow the live theme picker\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emode_toggle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eboolean\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow the dark/light mode toggle\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einclude_all\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eboolean\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInclude all discovered palettes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einclude\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earray\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePalettes to include (when \u003ccode\u003einclude_all\u003c/code\u003e is false)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexclude\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earray\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePalettes to exclude (when \u003ccode\u003einclude_all\u003c/code\u003e is true)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eposition\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;header\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWhere to place the switcher\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe mode toggle is also gated by \u003ccode\u003e[markata-go.header].show_theme_toggle\u003c/code\u003e for backward compatibility.\u003c/p\u003e\n\u003cp\u003eAll palettes add roughly 30KB (gzip) to \u003ccode\u003epalette.css\u003c/code\u003e. Use \u003ccode\u003einclude\u003c/code\u003e to trim that on very size-sensitive sites.\u003c/p\u003e\n\u003ch3 id=\"reading-size-control\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReading-size control\u003c/span\u003e \u003ca href=\"#reading-size-control\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe default theme uses a large, comfortable reading size by default. Visitors\ncan choose a smaller or larger preset (Small, Medium, Large, X-Large) from the theme picker (or the header control when the picker is off), and their\nchoice is saved for later visits on the same site.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext_size\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;large\u0026#34;\u003c/span\u003e              \u003cspan class=\"c\"\u003e# small, medium, large, or x-large\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_text_size_control\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e    \u003cspan class=\"c\"\u003e# default: true\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003etext_size\u003c/code\u003e is used when the visitor has not made a choice. The available\npresets are:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePreset\u003c/th\u003e\n\u003cth\u003eSite base\u003c/th\u003e\n\u003cth\u003eArticle text\u003c/th\u003e\n\u003cth\u003eArticle measure\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esmall\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e16px\u003c/td\u003e\n\u003ctd\u003e18px\u003c/td\u003e\n\u003ctd\u003e68ch\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emedium\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e17px\u003c/td\u003e\n\u003ctd\u003e20px\u003c/td\u003e\n\u003ctd\u003e66ch\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elarge\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e18px\u003c/td\u003e\n\u003ctd\u003e22px\u003c/td\u003e\n\u003ctd\u003e64ch\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ex-large\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e19px\u003c/td\u003e\n\u003ctd\u003e24px\u003c/td\u003e\n\u003ctd\u003e62ch\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eArticle text also scales with the viewport so wide desktop displays do not\nrender a narrow strip of small type: \u003ccode\u003e--reading-scale\u003c/code\u003e multiplies the article\nfont size by 1.08 from 1800px, 1.16 from 2200px (1440p), and 1.25 from\n3000px (4K). The \u003ccode\u003ech\u003c/code\u003e-based measure follows the scaled font, so line length\nstays comfortable. Site chrome (\u003ccode\u003e--text-base\u003c/code\u003e) is not scaled.\u003c/p\u003e\n\u003cp\u003eSet \u003ccode\u003eshow_text_size_control = false\u003c/code\u003e when a site should keep the configured\ndefault without rendering the selector. Browser zoom remains available in\nall modes.\u003c/p\u003e\n\u003cp\u003ePresets are defaults, not overrides. If \u003ccode\u003e[theme.variables]\u003c/code\u003e sets\n\u003ccode\u003e--text-base\u003c/code\u003e, \u003ccode\u003e--post-text-size\u003c/code\u003e, or \u003ccode\u003e--content-width\u003c/code\u003e explicitly, the\nauthor\u0026rsquo;s value wins for that token in every preset; the selector then only\naffects the tokens the site has not pinned.\u003c/p\u003e\n\u003ch3 id=\"how-it-works\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow It Works\u003c/span\u003e \u003ca href=\"#how-it-works\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003ePalette manifest\u003c/strong\u003e: \u003ccode\u003epalette.css\u003c/code\u003e includes a JSON manifest (\u003ccode\u003e--palette-manifest\u003c/code\u003e) listing each theme\u0026rsquo;s \u003ccode\u003ename\u003c/code\u003e, \u003ccode\u003edisplayName\u003c/code\u003e, \u003ccode\u003evariant\u003c/code\u003e (\u003ccode\u003elight\u003c/code\u003e/\u003ccode\u003edark\u003c/code\u003e), and mode \u003ccode\u003ecounterpart\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eScoped palettes\u003c/strong\u003e: each palette is emitted as a \u003ccode\u003e[data-palette=\u0026quot;name\u0026quot;]\u003c/code\u003e block. The page sets \u003ccode\u003edata-palette\u003c/code\u003e on \u003ccode\u003e\u0026lt;html\u0026gt;\u003c/code\u003e, and each preview card sets it on itself, so cards render with the real palette CSS.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eStyle tokens\u003c/strong\u003e: per-aesthetic surface tokens (\u003ccode\u003e--radius-*\u003c/code\u003e, \u003ccode\u003e--surface-border\u003c/code\u003e, \u003ccode\u003e--surface-shadow\u003c/code\u003e) are keyed on \u003ccode\u003e[data-aesthetic=\u0026quot;name\u0026quot;]\u003c/code\u003e, so each Style card previews its own aesthetic.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eFont manifest\u003c/strong\u003e: \u003ccode\u003ecss/fonts.css\u003c/code\u003e includes \u003ccode\u003e--fontpack-manifest\u003c/code\u003e and \u003ccode\u003e--fontpack-default\u003c/code\u003e, plus one \u003ccode\u003e[data-fontpack=\u0026quot;name\u0026quot;]\u003c/code\u003e block per pack. Each manifest entry carries the CSS font stacks (\u003ccode\u003eheadingFont\u003c/code\u003e, \u003ccode\u003ebodyFont\u003c/code\u003e, \u003ccode\u003ecodeFont\u003c/code\u003e) that Font cards apply inline.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSeasonal calendar\u003c/strong\u003e: when the picker is on, \u003ccode\u003ebase.html\u003c/code\u003e inlines the seasonal schedule as \u003ccode\u003ewindow.__markataSeasonal\u003c/code\u003e, resolved against the palettes that ship.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eMotifs follow the theme\u003c/strong\u003e: background motifs are off by default. When you enable one (\u003ccode\u003e[markata-go.theme.motif] kind = \u0026quot;block-w\u0026quot;\u003c/code\u003e), it is repainted from the active palette\u0026rsquo;s colors whenever the page runs a palette other than the configured one.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"styling-the-picker\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStyling the Picker\u003c/span\u003e \u003ca href=\"#styling-the-picker\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003etheme-picker-toggle\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"c\"\u003e/* round palette button in the header */\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003etheme-picker-panel\u003c/span\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"c\"\u003e/* popover / bottom sheet */\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003etheme-picker-tabs\u003c/span\u003e   \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"c\"\u003e/* Colors / Style / Font tabs */\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003etheme-picker-step\u003c/span\u003e   \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"c\"\u003e/* ‹ › step buttons */\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003etheme-card\u003c/span\u003e          \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"c\"\u003e/* any preview card */\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003epalette-card\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eseasonal-card\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003estyle-card\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003efont-card\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"c\"\u003e/* per-tab cards */\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003etheme-picker-schedule\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"c\"\u003e/* seasonal schedule view (.ss-year strip, .ss-list) */\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003etheme-card\u003c/span\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"nt\"\u003earia-selected\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"c\"\u003e/* current theme */\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003etheme-picker-bake\u003c/span\u003e   \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"c\"\u003e/* \u0026#34;Bake\u0026#34; button (markata-go serve only) */\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003etheme-picker-settings\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"c\"\u003e/* \u0026#34;All settings\u0026#34; button (markata-go serve only) */\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"javascript-api\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJavaScript API\u003c/span\u003e \u003ca href=\"#javascript-api\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003epicker\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epaletteSwitcher\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edocumentElement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edataset\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c1\"\u003e// current theme, e.g. \u0026#34;gruvbox-dark\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epicker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eselectTheme\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;nord-dark\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \u003cspan class=\"c1\"\u003e// apply and remember a theme\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epicker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enextFamily\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e              \u003cspan class=\"c1\"\u003e// next theme in the current mode\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epicker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprevFamily\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epicker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erandomTheme\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epicker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etoggleColorMode\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e         \u003cspan class=\"c1\"\u003e// flip light/dark\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epicker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esetAesthetic\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;brutal\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epicker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esetFontpack\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;editorial\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epicker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enextFont\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e                \u003cspan class=\"c1\"\u003e// cycle fonts (also prevFont, cycleFont)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epicker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esetTextSize\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;x-large\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e    \u003cspan class=\"c1\"\u003e// small, medium, large, x-large\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epicker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eselectSeasonal\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e          \u003cspan class=\"c1\"\u003e// follow the seasonal calendar\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epicker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetSeasonal\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;dark\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e       \u003cspan class=\"c1\"\u003e// today\u0026#39;s pick: { label, name }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epicker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetBakeSettings\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e         \u003cspan class=\"c1\"\u003e// current choices as [markata-go.theme] keys\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epicker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebake\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e                    \u003cspan class=\"c1\"\u003e// serve only: write them to the site config\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epicker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;font\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e              \u003cspan class=\"c1\"\u003e// show the picker (optionally on a tab)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epicker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epicker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eresetTheme\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e              \u003cspan class=\"c1\"\u003e// back to the site default\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epicker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetManifest\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e             \u003cspan class=\"c1\"\u003e// all themes with variant and counterpart\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"event-handling\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEvent Handling\u003c/span\u003e \u003ca href=\"#event-handling\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;palette-change\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Palette:\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edetail\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;color-mode-change\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Mode:\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edetail\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emode\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;aesthetic-change\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Aesthetic:\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edetail\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaesthetic\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;fontpack-change\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Font pack:\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edetail\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efontpack\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;text-size-change\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Text size:\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edetail\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esize\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"palette-cli-commands\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePalette CLI Commands\u003c/span\u003e \u003ca href=\"#palette-cli-commands\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"list-all-palettes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eList All Palettes\u003c/span\u003e \u003ca href=\"#list-all-palettes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette list\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOutput:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eNAME                      VARIANT  SOURCE     DESCRIPTION\n----------------------------------------------------------------------\nCatppuccin Mocha          dark     builtin    Soothing pastel theme\nCatppuccin Latte          light    builtin    Soothing pastel theme (light)\nNord Dark                 dark     builtin    Arctic, north-bluish\n...\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"get-palette-info\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGet Palette Info\u003c/span\u003e \u003ca href=\"#get-palette-info\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette info catppuccin-mocha\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eShows all colors in the palette with their hex values.\u003c/p\u003e\n\u003ch3 id=\"check-accessibility\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCheck Accessibility\u003c/span\u003e \u003ca href=\"#check-accessibility\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette check catppuccin-mocha\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eChecks WCAG 2.1 AA contrast requirements for text readability.\u003c/p\u003e\n\u003ch3 id=\"export-palette\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExport Palette\u003c/span\u003e \u003ca href=\"#export-palette\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eExport a palette to different formats:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Export as CSS custom properties\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette \u003cspan class=\"nb\"\u003eexport\u003c/span\u003e catppuccin-mocha --format css\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Export as SCSS variables\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette \u003cspan class=\"nb\"\u003eexport\u003c/span\u003e catppuccin-mocha --format scss\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Export as JSON\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette \u003cspan class=\"nb\"\u003eexport\u003c/span\u003e catppuccin-mocha --format json\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Export as Tailwind config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette \u003cspan class=\"nb\"\u003eexport\u003c/span\u003e catppuccin-mocha --format tailwind\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"create-new-palette\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCreate New Palette\u003c/span\u003e \u003ca href=\"#create-new-palette\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGenerate a starter palette file:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette new my-palette\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCreates \u003ccode\u003epalettes/my-palette.toml\u003c/code\u003e that you can customize.\u003c/p\u003e\n\u003ch3 id=\"clone-existing-palette\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eClone Existing Palette\u003c/span\u003e \u003ca href=\"#clone-existing-palette\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eClone an existing palette as a starting point for customization:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Interactive mode - opens fuzzy picker to select a palette\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette clone\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Clone a specific palette by name\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette clone catppuccin-mocha\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Clone with explicit new name\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette clone catppuccin-mocha --name \u003cspan class=\"s2\"\u003e\u0026#34;my-custom-theme\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe cloned palette is saved to \u003ccode\u003e~/.config/markata-go/palettes/\u003c/code\u003e and includes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAll colors from the source palette\u003c/li\u003e\n\u003cli\u003eSemantic and component color mappings\u003c/li\u003e\n\u003cli\u003eA description noting the source palette\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThis is useful when you want to:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eStart from a well-designed palette and make minor adjustments\u003c/li\u003e\n\u003cli\u003eCreate variants of existing palettes (e.g., higher contrast)\u003c/li\u003e\n\u003cli\u003eExperiment without modifying the original\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"fetch-palette-from-lospec\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFetch Palette from Lospec\u003c/span\u003e \u003ca href=\"#fetch-palette-from-lospec\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eImport color palettes directly from \u003ca href=\"https://lospec.com/palette-list\"\u003eLospec.com\u003c/a\u003e, a popular source for pixel art and retro color palettes:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Fetch a palette by URL\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette fetch https://lospec.com/palette-list/sweetie-16.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Use a custom name\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette fetch https://lospec.com/palette-list/cheese-palette.txt --name \u003cspan class=\"s2\"\u003e\u0026#34;My Cheese\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Save to a custom directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette fetch https://lospec.com/palette-list/tokyo-night.txt -o palettes/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe fetched palette is saved to your user palettes directory (\u003ccode\u003e~/.config/markata-go/palettes/\u003c/code\u003e) by default. markata-go automatically:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDownloads the color list from Lospec\u003c/li\u003e\n\u003cli\u003eAnalyzes colors to determine if it\u0026rsquo;s a light or dark theme\u003c/li\u003e\n\u003cli\u003eGenerates semantic mappings (text-primary, bg-primary, accent, etc.)\u003c/li\u003e\n\u003cli\u003eCaches the download to avoid repeated network requests\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eExample output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eFetching palette from: https://lospec.com/palette-list/sweetie-16.txt\nPalette saved to: /home/user/.config/markata-go/palettes/sweetie-16.toml\n\nPalette details:\n  Name:        Sweetie 16\n  Variant:     dark\n  Colors:      16\n  Source:      https://lospec.com/palette-list/sweetie-16.txt\n\nSemantic mappings:\n  bg-primary      -\u0026gt; color0      (#1a1c2c)\n  text-primary    -\u0026gt; color15     (#f4f4f4)\n  accent          -\u0026gt; color8      (#b13e53)\n\nUse this palette in your config:\n  [markata-go.theme]\n  palette = \u0026quot;sweetie-16\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"pick-palette-interactively\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePick Palette Interactively\u003c/span\u003e \u003ca href=\"#pick-palette-interactively\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBrowse all available palettes in a full-screen interactive TUI with live color previews:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Pick a palette and set it in your config (default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette pick\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Only print the name without updating config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette pick --no-set\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe picker shows a two-panel layout:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eLeft panel\u003c/strong\u003e \u0026ndash; Fuzzy-filterable list of all palettes with variant badges (\u003ccode\u003e[dark]\u003c/code\u003e/\u003ccode\u003e[light]\u003c/code\u003e). Type to filter, use arrow keys to navigate.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRight panel\u003c/strong\u003e \u0026ndash; Live preview of the highlighted palette showing color swatches, semantic roles, and a contrast preview block.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePress \u003cstrong\u003eEnter\u003c/strong\u003e to select a palette and set it in your config, or \u003cstrong\u003eEsc\u003c/strong\u003e to cancel.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCompose with other commands:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# View detailed info for the palette you pick (without setting it)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette info \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003emarkata-go palette pick --no-set\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Pick, set, and rebuild\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette pick \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"creating-custom-palettes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCreating Custom Palettes\u003c/span\u003e \u003ca href=\"#creating-custom-palettes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCreate a custom palette by adding a TOML file to \u003ccode\u003epalettes/\u003c/code\u003e in your project:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# palettes/my-brand.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Brand\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003evariant\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;light\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# or \u0026#34;dark\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauthor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Your Name\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Raw colors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecolors\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebrand-primary\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#3b82f6\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebrand-secondary\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#8b5cf6\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebrand-accent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#06b6d4\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewhite\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#ffffff\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egray-50\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#f9fafb\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egray-100\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#f3f4f6\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egray-700\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#374151\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egray-800\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#1f2937\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egray-900\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#111827\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Semantic mapping\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esemantic\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext-primary\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;gray-800\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext-secondary\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;gray-700\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebg-primary\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;white\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebg-secondary\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;gray-50\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eaccent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;brand-primary\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elink\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;brand-primary\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elink-hover\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;brand-secondary\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen use it:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;my-brand\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"aesthetics\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAesthetics\u003c/span\u003e \u003ca href=\"#aesthetics\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhile palettes control \u003cstrong\u003ecolors\u003c/strong\u003e, aesthetics control \u003cstrong\u003eform and layout\u003c/strong\u003e - the non-color design tokens that define your site\u0026rsquo;s visual personality.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eThink of it this way:\u003c/strong\u003e Palettes are \u003cem\u003ewhat colors\u003c/em\u003e you use. Aesthetics are \u003cem\u003ehow things are shaped\u003c/em\u003e.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"quick-start-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSet an aesthetic in one line:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eaesthetic\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;elevated\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYour entire site now uses generous rounded corners, layered shadows, and comfortable spacing.\u003c/p\u003e\n\u003ch3 id=\"understanding-the-separation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUnderstanding the Separation\u003c/span\u003e \u003ca href=\"#understanding-the-separation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAspect\u003c/th\u003e\n\u003cth\u003ePalettes\u003c/th\u003e\n\u003cth\u003eAesthetics\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eControls\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eColors\u003c/td\u003e\n\u003ctd\u003eShape, spacing, depth\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eTokens\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e--color-*\u003c/code\u003e variables\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e--radius-*\u003c/code\u003e, \u003ccode\u003e--shadow-*\u003c/code\u003e, \u003ccode\u003e--spacing-*\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eExamples\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eBackground, text, accent colors\u003c/td\u003e\n\u003ctd\u003eBorder radius, shadow depth, spacing scale\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eSwitch\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eChanges color scheme\u003c/td\u003e\n\u003ctd\u003eChanges visual \u0026ldquo;feel\u0026rdquo;\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThis separation means you can:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUse any palette with any aesthetic\u003c/li\u003e\n\u003cli\u003eSwitch aesthetics without changing colors\u003c/li\u003e\n\u003cli\u003eFine-tune form independently of color\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"available-aesthetics\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAvailable Aesthetics\u003c/span\u003e \u003ca href=\"#available-aesthetics\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go includes 5 built-in aesthetics:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAesthetic\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eBest For\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebalanced\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003eDefault.\u003c/strong\u003e Comfortable rounding, subtle shadows, normal spacing\u003c/td\u003e\n\u003ctd\u003eGeneral purpose, blogs\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebrutal\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSharp corners, thick borders, tight spacing, hard accent-colored offset shadows\u003c/td\u003e\n\u003ctd\u003eBold statements, portfolios\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eminimal\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRestrained rounding, airy whitespace, flat surfaces and selective borders\u003c/td\u003e\n\u003ctd\u003eDocumentation, reading-focused\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eelevated\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerous rounding, layered shadows, generous spacing\u003c/td\u003e\n\u003ctd\u003ePremium/SaaS, card-heavy layouts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eprecision\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSubtle corners, compact spacing, hairline borders, minimal shadows\u003c/td\u003e\n\u003ctd\u003eTechnical docs, data-heavy sites\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"visual-comparison\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVisual Comparison\u003c/span\u003e \u003ca href=\"#visual-comparison\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eBrutal:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e┌────────────────────────┐\n│ No rounding            │\n│ Thick 3px borders      │\n│ Compact spacing        │\n│ Hard accent shadows    │\n└────────────────────────┘\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eBalanced (default):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e╭────────────────────────╮\n│ Subtle 4-8px rounding  │\n│ Normal 1px borders     │\n│ Standard spacing       │\n│ Light shadows          │\n╰────────────────────────╯\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eElevated:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e╭────────────────────────╮\n│                        │\n│ Generous 16px rounding │\n│ Minimal borders        │\n│ Generous spacing       │\n│ Layered shadows ▓▒░    │\n│                        │\n╰────────────────────────╯\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"configuration-examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration Examples\u003c/span\u003e \u003ca href=\"#configuration-examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eStyles affect the feed and post cards, code, admonitions, quotes, tables and\nimages, buttons and inputs, tags, header edge, picker panel, prose rhythm and\nopen doc/feed drawers. Balanced keeps the theme\u0026rsquo;s native surface treatment.\nPrecision is compact and crisp; elevated is soft and lifted; minimal stays\nflat and airy. Style cards preview their own shape and depth without changing\nthe active palette. Site \u003ccode\u003ecustom_css\u003c/code\u003e and \u003ccode\u003e[theme.variables]\u003c/code\u003e can still override\nthe layered aesthetic rules.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eBasic usage:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eaesthetic\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;brutal\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCombine with a palette:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eaesthetic\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;elevated\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-mocha\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOverride specific tokens:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eaesthetic\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;balanced\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaesthetic_overrides\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eborder_radius\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;12px\u0026#34;\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Override just the radius\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshadow_intensity\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e1.5\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Make shadows 50% stronger\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003espacing_scale\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e1.1\u003c/span\u003e         \u003cspan class=\"c\"\u003e# Slightly more spacing\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"aesthetic-overrides-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAesthetic Overrides Reference\u003c/span\u003e \u003ca href=\"#aesthetic-overrides-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFine-tune any aesthetic with these overrides:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOverride\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eborder_radius\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eBase border radius\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;8px\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;0.5rem\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eborder_width\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eBorder thickness\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;1px\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;2px\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eborder_style\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eBorder style\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;solid\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;dashed\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;none\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003espacing_scale\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003efloat\u003c/td\u003e\n\u003ctd\u003eMultiplier for spacing\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e0.9\u003c/code\u003e (tighter), \u003ccode\u003e1.2\u003c/code\u003e (looser)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshadow_intensity\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003efloat\u003c/td\u003e\n\u003ctd\u003eMultiplier for shadow opacity\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e0\u003c/code\u003e (none), \u003ccode\u003e1.5\u003c/code\u003e (stronger)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eshadow_size\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eShadow size preset\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;sm\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;md\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;lg\u0026quot;\u003c/code\u003e, \u003ccode\u003e\u0026quot;none\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eExample: Make \u0026ldquo;balanced\u0026rdquo; more spacious:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eaesthetic\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;balanced\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaesthetic_overrides\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003espacing_scale\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e1.25\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshadow_intensity\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Lighter shadows\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eExample: Soften \u0026ldquo;brutal\u0026rdquo;:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eaesthetic\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;brutal\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaesthetic_overrides\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eborder_radius\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;4px\u0026#34;\u003c/span\u003e   \u003cspan class=\"c\"\u003e# Add slight rounding\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eborder_width\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2px\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Thinner borders\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"aesthetic-cli-commands\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAesthetic CLI Commands\u003c/span\u003e \u003ca href=\"#aesthetic-cli-commands\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eList all available aesthetics:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go aesthetic list\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOutput:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eAvailable aesthetics:\n  brutal     - Brutalist design: harsh, uncompromising, raw\n  precision  - Technical/engineering: clean, exact, minimal\n  balanced   - Default harmonious: comfortable, balanced\n  elevated   - Layered/premium: depth, floating cards\n  minimal    - Maximum whitespace: sparse, intentional\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eShow details of a specific aesthetic:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go aesthetic show elevated\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOutput:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eAesthetic: elevated\nDescription: Layered/premium: depth, floating cards\n\nTokens:\n  radius:  0.5rem (sm), 0.75rem (md), 1rem (lg)\n  spacing: 1.25x scale\n  border:  none\n  shadow:  0 4px 12px rgba(0,0,0,0.15)\n\nCSS Preview:\n  --radius-sm: 0.5rem;\n  --radius-md: 0.75rem;\n  --radius-lg: 1rem;\n  --radius-full: 9999px;\n  --shadow: 0 4px 12px rgba(0,0,0,0.15);\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"creating-custom-aesthetics\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCreating Custom Aesthetics\u003c/span\u003e \u003ca href=\"#creating-custom-aesthetics\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate a custom aesthetic by adding a TOML file to \u003ccode\u003eaesthetics/\u003c/code\u003e in your project:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# aesthetics/my-aesthetic.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Aesthetic\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Custom design for my brand\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003etokens\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eradius\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003enone\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esm\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;6px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emd\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;10px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elg\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;16px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003exl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;24px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efull\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;9999px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003etokens\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003espacing\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escale\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e1.1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003etokens\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eborder\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewidth_thin\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewidth_normal\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewidth_thick\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;3px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;solid\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003etokens\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eshadow\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esm\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;0 1px 2px rgba(0,0,0,0.05)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emd\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;0 4px 8px rgba(0,0,0,0.1)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elg\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;0 8px 16px rgba(0,0,0,0.12)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003exl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;0 16px 32px rgba(0,0,0,0.15)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003etokens\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etypography\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efont_primary\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;var(--font-sans)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eleading_scale\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e1.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen use it:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eaesthetic\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;my-aesthetic\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"keyboard-shortcuts-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKeyboard Shortcuts\u003c/span\u003e \u003ca href=\"#keyboard-shortcuts-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen the palette switcher is enabled, these shortcuts also work for aesthetics:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eKey\u003c/th\u003e\n\u003cth\u003eAction\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNext palette family (full switcher only)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e,\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePrevious palette family (full switcher only)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNext aesthetic (full switcher only)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026lt;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePrevious aesthetic (full switcher only)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\\\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eToggle dark/light mode (mode toggle only)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"template-overrides\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Overrides\u003c/span\u003e \u003ca href=\"#template-overrides\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOverride any template by placing it in your \u003ccode\u003etemplates/\u003c/code\u003e directory.\u003c/p\u003e\n\u003ch3 id=\"template-search-order\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Search Order\u003c/span\u003e \u003ca href=\"#template-search-order\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003etemplates/\u003c/code\u003e - Your project templates (highest priority)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ethemes/{theme}/templates/\u003c/code\u003e - Theme templates\u003c/li\u003e\n\u003cli\u003eEmbedded default templates (fallback)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"available-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAvailable Templates\u003c/span\u003e \u003ca href=\"#available-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTemplate\u003c/th\u003e\n\u003cth\u003ePurpose\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebase.html\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHTML skeleton, head, header, footer\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.html\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSingle post/article layout\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeed.html\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eList of posts (index, archive, tags)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecard.html\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePost preview card in feeds\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epartials/header.html\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite header/navigation\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epartials/footer.html\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite footer\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epartials/head.html\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAdditional head content\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"example-custom-footer\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample: Custom Footer\u003c/span\u003e \u003ca href=\"#example-custom-footer\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003etemplates/partials/footer.html\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;site-footer\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;container\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"ni\"\u003e\u0026amp;copy;\u003c/span\u003e {{ now | date:\u0026#34;2006\u0026#34; }} {{ config.title }}. Built with markata-go.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/about/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAbout\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/contact/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eContact\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://github.com/yourusername\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eGitHub\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"static-assets\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStatic Assets\u003c/span\u003e \u003ca href=\"#static-assets\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd custom CSS, JavaScript, images, and fonts to the \u003ccode\u003estatic/\u003c/code\u003e directory:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emy-site/\n├── static/\n│   ├── css/\n│   │   └── custom.css\n│   ├── js/\n│   │   └── analytics.js\n│   ├── images/\n│   │   └── logo.png\n│   └── fonts/\n│       └── MyFont.woff2\n└── markata-go.toml\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eFiles in \u003ccode\u003estatic/\u003c/code\u003e are copied directly to the output directory.\u003c/p\u003e\n\u003cp\u003eReference them in templates:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;stylesheet\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/css/custom.css\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/js/analytics.js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/logo.png\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Logo\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"per-post-styling\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePer-Post Styling\u003c/span\u003e \u003ca href=\"#per-post-styling\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOverride styles for specific posts using frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Special Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elanding.html \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Use a different template\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr add custom CSS classes:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Featured Article\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecss_class\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003efeatured-post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen style it:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003efeatured-post\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003elinear-gradient\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kc\"\u003eto\u003c/span\u003e \u003cspan class=\"kc\"\u003eright\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eprimary\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eaccent\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"css-optimization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCSS Optimization\u003c/span\u003e \u003ca href=\"#css-optimization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"bundle-a-homepage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBundle a homepage\u003c/span\u003e \u003ca href=\"#bundle-a-homepage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTo reduce stylesheet requests on a specific page, enable page bundling:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecss_bundle\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epages\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;index.html\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse output-relative HTML paths. Production builds combine local head\nstylesheets and inline styles in their original order into hashed CSS files.\nScripts and special stylesheets separate bundles. Remote stylesheets, media\nconditions, integrity attributes, CSS imports, and relative asset URLs stay\nuntouched. Fast builds skip this step. Original CSS files remain available for\nnavigation and custom templates. The runtime loader recognizes bundled sources\nand avoids downloading them again.\u003c/p\u003e\n\u003cp\u003eThe navbar reserves space for its search input before deferred search styles\nload, so the header stays in place while search initializes.\u003c/p\u003e\n\u003cp\u003eTitle fitting and highlighted headings wait for initial layout before measuring\nwhen ResizeObserver is available. They still update after fonts load and the\npage resizes, keeping the same typography with less synchronous startup work.\nThe article progress indicator also refreshes as images or other content change\nthe article\u0026rsquo;s height.\u003c/p\u003e\n\u003cp\u003eClosed feed and table-of-contents drawers skip rendering their contents when\nthe browser supports content visibility and discrete transitions. Opening\nrestores the contents immediately, while closing preserves the slide.\nReduced-motion preferences remain supported. Other browsers keep the existing\nrendering behavior.\u003c/p\u003e\n\u003cp\u003eMobile drawers center the active feed item when opened without measuring\nclosed-drawer geometry during startup. Desktop drawers\ncontinue to restore their saved state and follow the visible header edge.\u003c/p\u003e\n\u003cp\u003eWith the built-in theme picker, the default template initially loads\n\u003ccode\u003epalette-core.css\u003c/code\u003e with colors and picker metadata for the configured light/dark\npair. Generated palette changes also invalidate cached HTML, so warm builds\nreference the current stylesheet. The remaining palette catalog and colors load when\nopening the picker or restoring a saved or seasonal choice. Custom templates\ncan continue loading the complete \u003ccode\u003epalette.css\u003c/code\u003e stylesheet.\u003c/p\u003e\n\u003cp\u003eImage zoom CSS and JavaScript load on the first image click. The first click\nopens that image once the library is ready; later clicks reuse the library.\nPhoto and article cards use responsive image candidates on trusted resize\nhosts. For text-only feed previews, use \u003ccode\u003erender_feed(\u0026quot;til\u0026quot;, 8, \u0026quot;summary\u0026quot;)\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003emarkata-go automatically optimizes CSS loading by only including stylesheets that are actually needed for each page. This reduces page size and improves load times.\u003c/p\u003e\n\u003ch3 id=\"how-it-works-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow It Works\u003c/span\u003e \u003ca href=\"#how-it-works-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen rendering a page, markata-go scans the HTML content and detects which CSS features are used:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCSS File\u003c/th\u003e\n\u003cth\u003eLoaded When\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003evariables.css\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAlways (core theme variables)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emain.css\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAlways (core layout styles)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecomponents.css\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAlways (navigation, footer, etc.)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecards.css\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFeed/index pages with post cards\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eadmonitions.css\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePosts containing admonition blocks\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecode.css\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePosts containing code blocks\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003echroma.css\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePosts with syntax-highlighted code\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewebmentions.css\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWhen webmentions are enabled\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epalette-switcher.css\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWhen palette switcher is enabled\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esearch.css\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWhen search is enabled\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"content-detection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContent Detection\u003c/span\u003e \u003ca href=\"#content-detection\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe CSS detection works by analyzing the rendered HTML:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eAdmonitions\u003c/strong\u003e: Detected when \u003ccode\u003eclass=\u0026quot;admonition\u003c/code\u003e is present\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCode blocks\u003c/strong\u003e: Detected when syntax highlighting classes (\u003ccode\u003eclass=\u0026quot;chroma\u0026quot;\u003c/code\u003e, \u003ccode\u003eclass=\u0026quot;highlight\u0026quot;\u003c/code\u003e) or code elements (\u003ccode\u003e\u0026lt;pre\u0026gt;\u0026lt;code\u003c/code\u003e, \u003ccode\u003e\u0026lt;code class=\u0026quot;language-\u003c/code\u003e) are present\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCards\u003c/strong\u003e: Included on feed pages (where \u003ccode\u003efeed\u003c/code\u003e variable exists in template context)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"benefits\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBenefits\u003c/span\u003e \u003ca href=\"#benefits\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eSmaller page sizes\u003c/strong\u003e: Simple pages without code blocks or admonitions skip those CSS files\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFaster load times\u003c/strong\u003e: Less CSS to download and parse\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBetter caching\u003c/strong\u003e: Core CSS files are shared across all pages\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"custom-css\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom CSS\u003c/span\u003e \u003ca href=\"#custom-css\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eYour custom CSS (via \u003ccode\u003etheme.custom_css\u003c/code\u003e) is always loaded when configured. If you need conditional loading for custom styles, consider using CSS custom properties or JavaScript-based loading.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"media-borders-and-gradient-effects\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMedia Borders and Gradient Effects\u003c/span\u003e \u003ca href=\"#media-borders-and-gradient-effects\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go provides beautiful, configurable borders for images and videos. From subtle solid borders to animated gradients, you have full control over how your media looks.\u003c/p\u003e\n\u003ch3 id=\"default-media-styling\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDefault Media Styling\u003c/span\u003e \u003ca href=\"#default-media-styling\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBy default, images and videos in your content get:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRounded corners (\u003ccode\u003e--media-border-radius\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eA subtle border (\u003ccode\u003e--media-border-width\u003c/code\u003e, \u003ccode\u003e--media-border-color\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eProper spacing and centering\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"configuring-media-borders\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguring Media Borders\u003c/span\u003e \u003ca href=\"#configuring-media-borders\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCustomize the default borders via CSS variables:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* In your custom CSS or via theme.variables */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003eroot\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--media-border-width\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e      \u003cspan class=\"c\"\u003e/* Border thickness */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--media-border-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#e5e7eb\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \u003cspan class=\"c\"\u003e/* Border color */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--media-border-radius\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \u003cspan class=\"c\"\u003e/* Corner rounding */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr via config:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--media-border-width\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;4px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--media-border-color\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#8b5cf6\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--media-border-radius\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1rem\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"gradient-borders\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGradient Borders\u003c/span\u003e \u003ca href=\"#gradient-borders\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnable colorful gradient borders for a modern, eye-catching look. Add a class to your post content to enable gradients for all media:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Post with Gradient Borders\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecss_class\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egradient-borders\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis applies the default accent gradient to all images and videos in that post.\u003c/p\u003e\n\u003ch3 id=\"available-gradient-presets\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAvailable Gradient Presets\u003c/span\u003e \u003ca href=\"#available-gradient-presets\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go includes several beautiful gradient presets:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eClass\u003c/th\u003e\n\u003cth\u003eColors\u003c/th\u003e\n\u003cth\u003eBest For\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egradient-borders\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePrimary to primary-dark\u003c/td\u003e\n\u003ctd\u003eBrand-consistent\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egradient-vibrant\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePurple to pink\u003c/td\u003e\n\u003ctd\u003eCreative, artistic\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egradient-warm\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePink to orange\u003c/td\u003e\n\u003ctd\u003eEnergetic, warm\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egradient-cool\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBlue to cyan\u003c/td\u003e\n\u003ctd\u003eProfessional, tech\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egradient-sunset\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePink to yellow\u003c/td\u003e\n\u003ctd\u003eWarm, inviting\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egradient-ocean\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTeal to light blue\u003c/td\u003e\n\u003ctd\u003eCalm, refreshing\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eUse them in frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Ocean-Themed Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecss_class\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egradient-ocean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"animated-gradient-borders\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAnimated Gradient Borders\u003c/span\u003e \u003ca href=\"#animated-gradient-borders\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor extra visual impact, use animated gradients that slowly shift colors:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Attention-Grabbing Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecss_class\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egradient-animated\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe animation cycles through purple, pink, and blue over 6 seconds.\u003c/p\u003e\n\u003ch3 id=\"glow-effects\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGlow Effects\u003c/span\u003e \u003ca href=\"#glow-effects\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd a subtle glow behind your media:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Glowing Media\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecss_class\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eglow\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCombine glow with gradients:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Maximum Impact\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecss_class\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egradient-vibrant glow\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"per-image-styling\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePer-Image Styling\u003c/span\u003e \u003ca href=\"#per-image-styling\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor fine-grained control, add classes directly to images in your Markdown using HTML:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/hero.jpg\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Hero\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gradient-vibrant glow\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr use a wrapper div:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;media-frame gradient-sunset glow\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/featured.jpg\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Featured\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"css-variable-reference-for-media\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCSS Variable Reference for Media\u003c/span\u003e \u003ca href=\"#css-variable-reference-for-media\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--media-border-width\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBorder thickness\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e3px\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--media-border-style\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBorder style\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003esolid\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--media-border-color\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBorder color\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003evar(--color-border)\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--media-border-radius\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCorner rounding\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e0.5rem\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--gradient-accent\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault gradient\u003c/td\u003e\n\u003ctd\u003ePrimary colors\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--gradient-vibrant\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePurple-pink gradient\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e#667eea\u003c/code\u003e to \u003ccode\u003e#f093fb\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--gradient-warm\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePink-orange gradient\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e#f093fb\u003c/code\u003e to \u003ccode\u003e#f8b500\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--gradient-cool\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBlue-cyan gradient\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e#4facfe\u003c/code\u003e to \u003ccode\u003e#00f2fe\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--gradient-sunset\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePink-yellow gradient\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e#fa709a\u003c/code\u003e to \u003ccode\u003e#fee140\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--gradient-ocean\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTeal-blue gradient\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e#2193b0\u003c/code\u003e to \u003ccode\u003e#6dd5ed\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"palette-matching-gradients\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePalette-Matching Gradients\u003c/span\u003e \u003ca href=\"#palette-matching-gradients\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf you\u0026rsquo;re using a specific color palette, use the matching gradient for visual consistency:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eClass\u003c/th\u003e\n\u003cth\u003ePalette\u003c/th\u003e\n\u003cth\u003eColors\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egradient-catppuccin\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCatppuccin\u003c/td\u003e\n\u003ctd\u003eMauve → Pink → Red\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egradient-nord\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNord\u003c/td\u003e\n\u003ctd\u003eFrost colors (cyan → blue)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egradient-dracula\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDracula\u003c/td\u003e\n\u003ctd\u003ePurple → Pink → Cyan\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egradient-gruvbox\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGruvbox\u003c/td\u003e\n\u003ctd\u003eYellow → Orange → Red\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egradient-rose-pine\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRosé Pine\u003c/td\u003e\n\u003ctd\u003eIris → Rose → Gold\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egradient-solarized\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSolarized\u003c/td\u003e\n\u003ctd\u003eBlue → Cyan → Green\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egradient-tokyo-night\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTokyo Night\u003c/td\u003e\n\u003ctd\u003eBlue → Purple → Pink\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eExample: If your site uses \u003ccode\u003ecatppuccin-mocha\u003c/code\u003e palette, use \u003ccode\u003egradient-catppuccin\u003c/code\u003e for borders:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# markata-go.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-mocha\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# In your post frontmatter\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Catppuccin-Styled Gallery\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecss_class\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egradient-catppuccin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"custom-gradients\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Gradients\u003c/span\u003e \u003ca href=\"#custom-gradients\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate your own gradient by overriding the variables:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* In static/custom.css */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003eroot\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nv\"\u003e--gradient-accent\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003elinear-gradient\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e135\u003c/span\u003e\u003cspan class=\"kt\"\u003edeg\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ff6b6b\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mh\"\u003e#feca57\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mh\"\u003e#48dbfb\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr define a completely new one:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003epost-content\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003egradient-custom\u003c/span\u003e \u003cspan class=\"nt\"\u003eimg\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003epost-content\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003egradient-custom\u003c/span\u003e \u003cspan class=\"nt\"\u003evideo\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eborder\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enone\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003epadding\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003elinear-gradient\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e45\u003c/span\u003e\u003cspan class=\"kt\"\u003edeg\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mh\"\u003e#12c2e9\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mh\"\u003e#c471ed\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f64f59\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ebackground-origin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eborder-box\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen use in frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecss_class\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egradient-custom\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"dark-mode-considerations\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDark Mode Considerations\u003c/span\u003e \u003ca href=\"#dark-mode-considerations\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGradient borders adapt to dark mode:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eGlow effects become more prominent\u003c/li\u003e\n\u003cli\u003eBorder colors adjust automatically\u003c/li\u003e\n\u003cli\u003eGradients remain vibrant on dark backgrounds\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTest your gradient choices in both light and dark mode.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"background-decorations\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBackground Decorations\u003c/span\u003e \u003ca href=\"#background-decorations\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd multi-layered background decorations to your site for visual effects like snow, particles, stars, or animated elements.\u003c/p\u003e\n\u003ch3 id=\"basic-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Configuration\u003c/span\u003e \u003ca href=\"#basic-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebackgrounds\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;snow-fall count=\u0026#34;200\u0026#34;\u0026gt;\u0026lt;/snow-fall\u0026gt;\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escripts\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/static/js/snow-fall.js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis adds a snow effect using a custom web component with its supporting JavaScript.\u003c/p\u003e\n\u003ch3 id=\"multiple-layers\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMultiple Layers\u003c/span\u003e \u003ca href=\"#multiple-layers\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eStack multiple background layers with different z-index values:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebackgrounds\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;div class=\u0026#34;stars\u0026#34;\u0026gt;\u0026lt;/div\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ez_index\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e-20\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;div class=\u0026#34;clouds\u0026#34;\u0026gt;\u0026lt;/div\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ez_index\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e-10\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;snow-fall count=\u0026#34;100\u0026#34;\u0026gt;\u0026lt;/snow-fall\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ez_index\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e-5\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escripts\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/static/js/background-effects.js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e.stars {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  position: absolute;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  inset: 0;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  background: url(\u0026#34;/images/stars.png\u0026#34;) repeat;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  opacity: 0.3;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e.clouds {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  position: absolute;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  inset: 0;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  background: url(\u0026#34;/images/clouds.png\u0026#34;) repeat-x;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  animation: drift 60s linear infinite;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e@keyframes drift {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  from { background-position: 0 0; }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  to { background-position: 100% 0; }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"configuration-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration Reference\u003c/span\u003e \u003ca href=\"#configuration-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eboolean\u003c/td\u003e\n\u003ctd\u003eEnable/disable background decorations (default: false)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebackgrounds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earray\u003c/td\u003e\n\u003ctd\u003eList of background elements\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebackgrounds[].html\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eHTML content for this layer\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebackgrounds[].z_index\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003einteger\u003c/td\u003e\n\u003ctd\u003eStacking order (-1 is default, behind content)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003escripts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earray\u003c/td\u003e\n\u003ctd\u003eScript URLs to load for background functionality\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecss\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eCustom CSS for styling background elements\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003earticle_bg\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eBackground applied to post/feed content when decorations are enabled\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003earticle_blur_enabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eboolean\u003c/td\u003e\n\u003ctd\u003eOpt in to backdrop blur on content containers (default: false)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003earticle_blur\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eBlur amount used only when \u003ccode\u003earticle_blur_enabled = true\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003earticle_shadow\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eBox shadow for post/feed content wrappers\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003earticle_border\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eBorder for post/feed content wrappers\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003earticle_radius\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eBorder radius for post/feed content wrappers\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"tips-for-background-decorations\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTips for Background Decorations\u003c/span\u003e \u003ca href=\"#tips-for-background-decorations\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003ePerformance\u003c/strong\u003e: Complex animations can impact performance. Test on lower-powered devices.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eFullscreen video\u003c/strong\u003e: Keep \u003ccode\u003earticle_blur_enabled = false\u003c/code\u003e unless you specifically want frosted-glass content. Even a no-op blur can hurt fullscreen video playback on some browsers.\u003c/p\u003e\n\u003cp\u003eAlso avoid adding global \u003ccode\u003e::backdrop\u003c/code\u003e blur, since that affects fullscreen media as well as dialogs.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eAccessibility\u003c/strong\u003e: Ensure backgrounds don\u0026rsquo;t interfere with content readability. Use \u003ccode\u003epointer-events: none\u003c/code\u003e (applied automatically).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eZ-Index\u003c/strong\u003e: Use negative values to place backgrounds behind content. Positive values overlay content.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eWeb Components\u003c/strong\u003e: Custom elements like \u003ccode\u003e\u0026lt;snow-fall\u0026gt;\u003c/code\u003e provide encapsulated, reusable effects.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eReduced Motion\u003c/strong\u003e: Consider respecting \u003ccode\u003eprefers-reduced-motion\u003c/code\u003e in your CSS:\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003emedia\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nt\"\u003eprefers-reduced-motion\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nt\"\u003ereduce\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ebackground-layer\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eanimation\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enone\u003c/span\u003e \u003cspan class=\"cp\"\u003e!important\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"readable-content-over-decorations\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReadable Content Over Decorations\u003c/span\u003e \u003ca href=\"#readable-content-over-decorations\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse article wrapper styling to keep content readable without forcing blur:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003earticle_bg\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;color-mix(in srgb, var(--color-background) 88%, transparent)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003earticle_shadow\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;0 12px 32px rgba(0, 0, 0, 0.12)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003earticle_border\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1px solid color-mix(in srgb, var(--color-border) 60%, transparent)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003earticle_radius\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1rem\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebackgrounds\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;div class=\u0026#34;stars\u0026#34;\u0026gt;\u0026lt;/div\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ez_index\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e-10\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf you do want a frosted-glass effect, enable it explicitly:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003earticle_bg\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;rgba(255, 255, 255, 0.72)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003earticle_blur_enabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003earticle_blur\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;12px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"example-particle-background\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample: Particle Background\u003c/span\u003e \u003ca href=\"#example-particle-background\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUsing \u003ca href=\"https://vincentgarreau.com/particles.js/\"\u003eparticles.js\u003c/a\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebackgrounds\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;div id=\u0026#34;particles-js\u0026#34;\u0026gt;\u0026lt;/div\u0026gt;\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escripts\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;https://cdn.jsdelivr.net/particles.js/2.0.0/particles.min.js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;/static/js/particles-config.js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e#particles-js {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  position: absolute;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  inset: 0;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"seasonal-theme-calendar\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSeasonal Theme Calendar\u003c/span\u003e \u003ca href=\"#seasonal-theme-calendar\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAutomatically apply different themes based on the date. Perfect for seasonal decorations, holidays, or promotional periods.\u003c/p\u003e\n\u003ch3 id=\"basic-configuration-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Configuration\u003c/span\u003e \u003ca href=\"#basic-configuration-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnable date-based theme switching:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme_calendar\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme_calendar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Christmas Season\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estart_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;12-15\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eend_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;12-26\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;christmas\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme_calendar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Winter Frost\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estart_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;12-01\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eend_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;02-28\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;winter-frost\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDuring December 15-26, the site uses the \u0026ldquo;christmas\u0026rdquo; palette. From December 1 to February 28, it uses \u0026ldquo;winter-frost\u0026rdquo; (excluding the more specific Christmas period).\u003c/p\u003e\n\u003ch3 id=\"how-it-works-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow It Works\u003c/span\u003e \u003ca href=\"#how-it-works-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eFirst match wins\u003c/strong\u003e: Rules are evaluated in order. The first matching rule is applied.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMM-DD format\u003c/strong\u003e: Dates use month-day format (no year), so rules repeat annually.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eYear boundary support\u003c/strong\u003e: Ranges like \u003ccode\u003e12-01\u003c/code\u003e to \u003ccode\u003e02-28\u003c/code\u003e correctly span December through February.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRuns early\u003c/strong\u003e: The calendar plugin runs at the Configure stage before other theme plugins, ensuring palette overrides are applied correctly.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"rule-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRule Configuration\u003c/span\u003e \u003ca href=\"#rule-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEach rule can override various theme settings:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme_calendar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Spooky October\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estart_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;10-01\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eend_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;10-31\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;halloween\u0026#34;\u003c/span\u003e            \u003cspan class=\"c\"\u003e# Single palette for both modes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Or use separate light/dark palettes:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# palette_light = \u0026#34;halloween-light\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# palette_dark = \u0026#34;halloween-dark\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# CSS variable overrides\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme_calendar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--color-accent\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#ff6600\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--color-link\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#9b59b6\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Custom CSS file for the season\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecustom_css\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;halloween.css\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"rule-options-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRule Options Reference\u003c/span\u003e \u003ca href=\"#rule-options-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eDisplay name for the rule (used in logs and CLI)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estart_date\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eStart date in MM-DD format (e.g., \u0026ldquo;12-01\u0026rdquo;)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eend_date\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eEnd date in MM-DD format (e.g., \u0026ldquo;02-28\u0026rdquo;)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epalette\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003ePalette to use (overrides both modes)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epalette_light\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eLight mode palette (if different from dark)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epalette_dark\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eDark mode palette\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecustom_css\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eAdditional CSS file for this period\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003evariables\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003etable\u003c/td\u003e\n\u003ctd\u003eCSS variable overrides\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebackground\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003etable\u003c/td\u003e\n\u003ctd\u003eBackground decoration override (see below)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efont\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003etable\u003c/td\u003e\n\u003ctd\u003eFont configuration override\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"background-overrides\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBackground Overrides\u003c/span\u003e \u003ca href=\"#background-overrides\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eApply seasonal background decorations:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme_calendar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Winter Wonderland\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estart_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;12-01\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eend_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;02-28\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;winter-frost\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme_calendar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e.snowflake {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e  position: absolute;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e  color: white;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e  animation: fall linear infinite;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme_calendar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebackgrounds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;snow-fall count=\u0026#34;100\u0026#34;\u0026gt;\u0026lt;/snow-fall\u0026gt;\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ez_index\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e-5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"font-overrides\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFont Overrides\u003c/span\u003e \u003ca href=\"#font-overrides\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse a different font for special periods:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme_calendar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Christmas Season\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estart_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;12-15\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eend_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;12-26\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;christmas\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme_calendar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efont\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efamily\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Mountains of Christmas\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eheading_family\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Snowburst One\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egoogle_fonts\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Mountains of Christmas\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Snowburst One\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"multiple-rules-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMultiple Rules Example\u003c/span\u003e \u003ca href=\"#multiple-rules-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate a full year of seasonal themes:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme_calendar\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault_palette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-mocha\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Fallback when no rule matches\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Spring (March 20 - June 20)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme_calendar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Spring\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estart_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;03-20\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eend_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;06-20\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;spring-garden\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Summer (June 21 - September 22)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme_calendar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Summer\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estart_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;06-21\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eend_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;09-22\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;summer-sunset\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Halloween (October 15 - November 1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme_calendar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Halloween\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estart_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;10-15\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eend_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;11-01\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;spooky\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Fall (September 23 - December 20, but after Halloween ends)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme_calendar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Fall\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estart_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;11-02\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eend_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;12-20\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;autumn-leaves\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Also need early fall before Halloween\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme_calendar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Early Fall\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estart_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;09-23\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eend_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;10-14\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;autumn-leaves\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Winter (December 21 - March 19)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme_calendar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erules\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Winter\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estart_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;12-21\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eend_date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;03-19\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;winter-frost\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"cli-commands\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCLI Commands\u003c/span\u003e \u003ca href=\"#cli-commands\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eList all calendar rules:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go theme calendar list\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOutput:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eTheme Calendar Rules (3 configured)\n============================================================\n\nChristmas Season [ACTIVE]\n  Date Range: 12-15 to 12-26\n  Palette: christmas\n\nWinter Frost\n  Date Range: 12-01 to 02-28\n  Palette: winter-frost\n\nHalloween\n  Date Range: 10-15 to 11-01\n  Palette: spooky\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003ePreview theme for a specific date:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check today\u0026#39;s theme\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go theme calendar preview\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check what theme applies on December 25\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go theme calendar preview 12-25\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check New Year\u0026#39;s Day\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go theme calendar preview 01-01\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOutput:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eChecking theme for date: 12-25\n----------------------------------------\n\nMatching Rule: Christmas Season\nDate Range: 12-15 to 12-26\n\nTheme Overrides:\n  Palette: christmas\n  Font Family: Mountains of Christmas\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"tips\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTips\u003c/span\u003e \u003ca href=\"#tips\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eOrder matters\u003c/strong\u003e: Put more specific rules before general ones. Christmas should come before Winter.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eTesting\u003c/strong\u003e: Use \u003ccode\u003emarkata-go theme calendar preview MM-DD\u003c/code\u003e to test any date without waiting for that day.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSmooth transitions\u003c/strong\u003e: Consider overlapping date ranges with similar themes for gradual transitions.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003ePerformance\u003c/strong\u003e: Each rule is checked in order; keep the number of rules reasonable.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCombine with switcher\u003c/strong\u003e: The calendar sets a default theme, but users can still override via the palette switcher if enabled.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"font-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFont Configuration\u003c/span\u003e \u003ca href=\"#font-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go provides flexible font configuration to customize your site\u0026rsquo;s typography without writing CSS.\u003c/p\u003e\n\u003ch3 id=\"quick-start-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd custom fonts via Google Fonts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efont\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egoogle_fonts\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Inter\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Fira Code\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efamily\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;Inter\u0026#39;, sans-serif\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecode_family\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;Fira Code\u0026#39;, monospace\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"font-options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFont Options\u003c/span\u003e \u003ca href=\"#font-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efamily\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBody text font\u003c/td\u003e\n\u003ctd\u003eSystem fonts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eheading_family\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHeading font (inherits from \u003ccode\u003efamily\u003c/code\u003e if not set)\u003c/td\u003e\n\u003ctd\u003eSame as \u003ccode\u003efamily\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecode_family\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCode/monospace font\u003c/td\u003e\n\u003ctd\u003eSystem monospace\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esize\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBase font size\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e16px\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eline_height\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBase line height\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e1.6\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egoogle_fonts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eArray of Google Fonts to load\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecustom_urls\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eArray of custom font CSS URLs\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"using-google-fonts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing Google Fonts\u003c/span\u003e \u003ca href=\"#using-google-fonts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSpecify fonts to load from Google Fonts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efont\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Load these fonts from Google Fonts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egoogle_fonts\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Inter\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Playfair Display\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;JetBrains Mono\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Use them in your font families\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efamily\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;Inter\u0026#39;, sans-serif\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eheading_family\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;Playfair Display\u0026#39;, serif\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecode_family\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;JetBrains Mono\u0026#39;, monospace\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe \u003ccode\u003egoogle_fonts\u003c/code\u003e array automatically generates the Google Fonts CSS URL with weights 400, 500, 600, and 700.\u003c/p\u003e\n\u003ch3 id=\"using-custom-fonts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing Custom Fonts\u003c/span\u003e \u003ca href=\"#using-custom-fonts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eLoad fonts from any URL:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efont\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecustom_urls\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;https://fonts.example.com/my-font.css\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;/fonts/local-font.css\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efamily\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;My Custom Font\u0026#39;, sans-serif\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"typography-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTypography Variables\u003c/span\u003e \u003ca href=\"#typography-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFont configuration generates CSS custom properties that you can use in your custom CSS:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--font-family\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBody text font stack\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--font-heading\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHeading font stack\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--font-code\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCode/monospace font stack\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--font-size\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBase font size\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e--line-height\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBase line height\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"complete-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComplete Example\u003c/span\u003e \u003ca href=\"#complete-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-mocha\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efont\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Google Fonts to load\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egoogle_fonts\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Source Sans Pro\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Source Serif Pro\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Source Code Pro\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Font assignments\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efamily\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;Source Sans Pro\u0026#39;, sans-serif\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eheading_family\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;Source Serif Pro\u0026#39;, serif\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecode_family\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;Source Code Pro\u0026#39;, monospace\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Typography settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esize\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;18px\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eline_height\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1.7\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"using-self-hosted-fonts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing Self-Hosted Fonts\u003c/span\u003e \u003ca href=\"#using-self-hosted-fonts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor better performance and privacy, you can self-host fonts:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eDownload font files to \u003ccode\u003estatic/fonts/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eCreate a CSS file defining \u003ccode\u003e@font-face\u003c/code\u003e rules\u003c/li\u003e\n\u003cli\u003eReference it in \u003ccode\u003ecustom_urls\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* static/fonts/fonts.css */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003efont-face\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003efont-family\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;MyFont\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;/fonts/MyFont-Regular.woff2\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"nt\"\u003eformat\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;woff2\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003efont-weight\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nt\"\u003e400\u003c/span\u003e\u003cspan class=\"o\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003efont-face\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003efont-family\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;MyFont\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;/fonts/MyFont-Bold.woff2\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"nt\"\u003eformat\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;woff2\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003efont-weight\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nt\"\u003e700\u003c/span\u003e\u003cspan class=\"o\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efont\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecustom_urls\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/fonts/fonts.css\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efamily\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;MyFont\u0026#39;, sans-serif\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"best-practices\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBest Practices\u003c/span\u003e \u003ca href=\"#best-practices\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"1-start-with-a-palette\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e1. Start with a Palette\u003c/span\u003e \u003ca href=\"#1-start-with-a-palette\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDon\u0026rsquo;t write CSS from scratch. Pick the closest palette and customize from there.\u003c/p\u003e\n\u003ch3 id=\"2-use-css-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e2. Use CSS Variables\u003c/span\u003e \u003ca href=\"#2-use-css-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOverride \u003ccode\u003e--color-*\u003c/code\u003e variables instead of hardcoding colors. This ensures consistency and makes future changes easier.\u003c/p\u003e\n\u003ch3 id=\"3-keep-customizations-minimal\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e3. Keep Customizations Minimal\u003c/span\u003e \u003ca href=\"#3-keep-customizations-minimal\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe less you customize, the easier upgrades will be. Only override what you need.\u003c/p\u003e\n\u003ch3 id=\"4-test-dark-mode\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e4. Test Dark Mode\u003c/span\u003e \u003ca href=\"#4-test-dark-mode\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf you customize colors, test both light and dark mode to ensure readability.\u003c/p\u003e\n\u003ch3 id=\"5-check-accessibility\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e5. Check Accessibility\u003c/span\u003e \u003ca href=\"#5-check-accessibility\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse \u003ccode\u003emarkata-go palette check\u003c/code\u003e to verify your color choices meet WCAG guidelines.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"styles-not-loading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStyles Not Loading\u003c/span\u003e \u003ca href=\"#styles-not-loading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eCheck that CSS files exist in \u003ccode\u003epublic/css/\u003c/code\u003e after building\u003c/li\u003e\n\u003cli\u003eVerify your browser\u0026rsquo;s network tab shows CSS loading\u003c/li\u003e\n\u003cli\u003eClear browser cache and rebuild: \u003ccode\u003emarkata-go build\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"custom-css-not-applying\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom CSS Not Applying\u003c/span\u003e \u003ca href=\"#custom-css-not-applying\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eEnsure \u003ccode\u003ecustom_css\u003c/code\u003e path is relative to \u003ccode\u003estatic/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eCheck for CSS specificity issues (theme styles may override yours)\u003c/li\u003e\n\u003cli\u003eUse browser dev tools to inspect applied styles\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"template-not-found\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Not Found\u003c/span\u003e \u003ca href=\"#template-not-found\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eVerify the template file exists in \u003ccode\u003etemplates/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eCheck the filename matches exactly (case-sensitive)\u003c/li\u003e\n\u003cli\u003eEnsure frontmatter \u003ccode\u003etemplate:\u003c/code\u003e value includes \u003ccode\u003e.html\u003c/code\u003e extension\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003chr\u003e\n\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext Steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow that you\u0026rsquo;ve styled your site, here are recommended next steps:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCustomize your templates:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/templates/\"\u003eTemplates Guide\u003c/a\u003e - Modify HTML structure, add custom partials, and use template inheritance\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eOrganize your content:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/feeds/\"\u003eFeeds Guide\u003c/a\u003e - Create filtered collections, archives, and tag pages\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eDeploy your site:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/deployment/\"\u003eDeployment Guide\u003c/a\u003e - Deploy to GitHub Pages, Netlify, Vercel, or self-host\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/keyboard-navigation/\"\u003eKeyboard Navigation Guide\u003c/a\u003e - Comprehensive keyboard shortcuts for site navigation\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfiguration Guide\u003c/a\u003e - All configuration options\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/templates/\"\u003eTemplates Guide\u003c/a\u003e - Template syntax and customization\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/frontmatter/\"\u003eFrontmatter Guide\u003c/a\u003e - Post-level configuration\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/quick-reference/\"\u003eQuick Reference\u003c/a\u003e - Theme snippets and CLI commands\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n## Themes, Palettes, and Aesthetics\n\nmarkata-go makes it easy to customize your site's appearance. You can go from zero configuration to a beautiful site, then progressively customize as needed.\n\n\u003e **Prerequisites:** This guide assumes you've completed the [Getting Started](/docs/getting-started/) guide and have a working markata-go site.\n\n## Quick Start\n\nThe fastest way to change your site's look is to pick a color palette:\n\n```toml\n[markata-go.theme]\npalette = \"catppuccin-mocha\"\n```\n\nThat's it! Your entire site now uses the Catppuccin Mocha color scheme.\n\n---\n\n## Header Preferences\n\nThe default header keeps search prominent and groups secondary settings under\nthe **Appearance and preferences** sliders icon. Open it to select a light or\ndark palette, customize the style and font, or change reading size. Expand\n**Loading: Auto** at the bottom to choose **Auto** (recommended),\n**Save Data**, or **Full Quality** for media. The browser remembers your\npreferences, and Auto can suggest a better choice based on the connection.\n\nPress `/` to focus search, `t` to open the appearance panel, or `\\\\` to\ntoggle light/dark mode. The panel closes with Escape. On sites where the full\npalette picker is disabled, the loading control stays available in the header.\n\n## Available Palettes\n\nmarkata-go includes 10 built-in color palettes. Use `markata-go palette list` to see them all:\n\n| Palette | Variant | Description |\n|---------|---------|-------------|\n| `default-light` | light | Clean, minimal light theme |\n| `default-dark` | dark | Clean, minimal dark theme |\n| `catppuccin-mocha` | dark | Soothing pastel colors, high contrast |\n| `catppuccin-latte` | light | Soothing pastel colors, light variant |\n| `nord-dark` | dark | Arctic, north-bluish colors |\n| `gruvbox-dark` | dark | Retro groove, warm colors |\n| `dracula` | dark | Vibrant purple on dark |\n| `rose-pine` | dark | Soho vibes, natural colors |\n| `solarized-dark` | dark | Scientifically designed colors |\n| `tokyo-night` | dark | Tokyo city lights inspired |\n\n### Previewing Palettes\n\nPreview a palette before using it:\n\n```bash\n# Show palette colors and contrast info\nmarkata-go palette info catppuccin-mocha\n\n# Check WCAG accessibility compliance\nmarkata-go palette check catppuccin-mocha\n```\n\n---\n\n## Configuration Levels\n\nmarkata-go supports progressive customization - start simple and add complexity only when needed.\n\n### Level 1: Just Pick a Palette\n\n```toml\n[markata-go.theme]\npalette = \"dracula\"\n```\n\n### Level 2: Override Specific Colors\n\nKeep your palette but tweak a few colors:\n\n```toml\n[markata-go.theme]\npalette = \"nord-dark\"\n\n[markata-go.theme.variables]\n\"--color-primary\" = \"#88c0d0\"\n\"--color-link\" = \"#8fbcbb\"\n```\n\n### Level 3: Add Custom CSS\n\nAdd a custom CSS file that loads after the theme:\n\n```toml\n[markata-go.theme]\npalette = \"catppuccin-mocha\"\ncustom_css = \"my-styles.css\"\n```\n\nThen create `static/my-styles.css`:\n\n```css\n/* Override any theme styles */\n.post-title {\n  font-family: 'Georgia', serif;\n}\n\n.site-header {\n  border-bottom: 2px solid var(--color-primary);\n}\n```\n\n### Level 4: Override Templates\n\nOverride specific template files by creating them in your `templates/` directory:\n\n```\nmy-site/\n├── templates/\n│   └── partials/\n│       └── footer.html    # Your custom footer\n└── markata-go.toml\n```\n\nYour custom templates take precedence over theme templates.\n\n---\n\n## Theme Configuration Reference\n\nFull configuration options:\n\n```toml\n[markata-go.theme]\n# Theme name (currently only \"default\" is available)\nname = \"default\"\n\n# Color palette to use\npalette = \"catppuccin-mocha\"\n\n# CSS variable overrides\n[markata-go.theme.variables]\n\"--color-primary\" = \"#8b5cf6\"\n\"--color-background\" = \"#1a1a2e\"\n\"--color-text\" = \"#eaeaea\"\n\"--color-link\" = \"#06b6d4\"\n\"--color-link-hover\" = \"#22d3ee\"\n\"--content-width\" = \"800px\"\n\"--font-family\" = \"'Inter', sans-serif\"\n\n# Custom CSS file (relative to static/ directory)\ncustom_css = \"custom.css\"\n```\n\n### Available CSS Variables\n\nThese CSS custom properties can be overridden:\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `--color-background` | Page background | Depends on palette |\n| `--color-text` | Body text | Depends on palette |\n| `--color-primary` | Primary accent color | Depends on palette |\n| `--color-link` | Link color | Depends on palette |\n| `--color-link-hover` | Link hover color | Depends on palette |\n| `--color-border` | Soft hairline border (text ink mixed 16% into the background) | Depends on palette |\n| `--color-border-strong` | Full-contrast border ink for focus rings and emphasis | Depends on palette |\n| `--color-border-soft` | `--color-border` at 60% alpha, for section dividers | Derived |\n| `--heading-rule` | Color of the short accent bar under `h1`/`h2` | `color-mix(in srgb, var(--color-primary) 55%, transparent)` |\n| `--radius-sm` / `--radius` / `--radius-lg` / `--radius-xl` | Corner radius scale | `0.375rem` / `0.5rem` / `0.75rem` / `1rem` |\n| `--leading-prose` | Article body line-height | `1.7` |\n| `--color-code-bg` | Code block background | Depends on palette |\n| `--color-code-text` | Code block text | Depends on palette |\n| `--color-code-comment` | Code comments | Depends on palette |\n| `--color-code-keyword` | Code keywords | Depends on palette |\n| `--color-code-string` | Code strings | Depends on palette |\n| `--color-code-number` | Code numbers | Depends on palette |\n| `--color-code-function` | Code functions | Depends on palette |\n| `--color-code-type` | Code types and tags | Depends on palette |\n| `--color-code-operator` | Code operators | Depends on palette |\n| `--content-width` | Article measure in `ch` (relative to article text size) | `64ch` at the `large` preset |\n| `--font-family` | Body font | System fonts |\n| `--font-family-mono` | Code font | Monospace fonts |\n| `--article-progress-height` | Sticky article progress bar height | `3px` |\n| `--article-progress-track` | Background for the empty progress track | `color-mix(in srgb, var(--color-text) 8%, transparent)` |\n| `--article-progress-start` | Gradient start color for the filled portion | `var(--color-primary)` |\n| `--article-progress-end` | Gradient end color for the filled portion | `var(--color-primary-light, var(--color-primary))` |\n| `--article-progress-glow` | Glow color around the indicator | `color-mix(in srgb, var(--color-primary) 35%, transparent)` |\n\n---\n\n## Article Reading Progress Indicator\n\nEach article page renders a slim, sticky progress track (`.article-progress`) that follows the reader as they scroll. The indicator is powered by the `initArticleProgressIndicator` script, which throttles scroll events with `requestAnimationFrame` and updates the fill amount by transforming `.article-progress__indicator`. The fill tracks the scroll position directly, with no easing lag, and uses the palette's primary colors in light and dark mode. The track is hidden on non-post pages and honors `prefers-reduced-motion` via CSS.\n\nOverride the CSS variables above to tune the look. Example:\n\n```toml\n[markata-go.theme.variables]\n\"--article-progress-height\" = \"5px\"\n\"--article-progress-track\" = \"rgba(255, 255, 255, 0.35)\"\n\"--article-progress-start\" = \"#facc15\"\n\"--article-progress-end\" = \"#fb923c\"\n\"--article-progress-glow\" = \"rgba(250, 204, 21, 0.8)\"\n```\n\nBecause the indicator is just another element in the post template, you can also restyle it by targeting `.article-progress` and `.article-progress__indicator` from a custom CSS file loaded via `markata-go.theme.custom_css`.\n\n---\n\n## Dark Mode Support\n\nmarkata-go uses an explicit theme mode model:\n- use dark by default (or `theme.fallback_mode`), and\n- switch to light only when the visitor explicitly chooses light mode.\n\n### Using Different Palettes for Light/Dark\n\n```toml\n[markata-go.theme]\npalette = \"catppuccin-latte\"        # Light mode\npalette_dark = \"catppuccin-mocha\"   # Dark mode palette\n```\n\nBy default, the site renders in dark mode.\nWhen a visitor explicitly switches to light mode, that preference is saved in localStorage and reused on future visits.\n\n```toml\n[markata-go.theme]\npalette = \"catppuccin-latte\"\npalette_dark = \"catppuccin-mocha\"\nfallback_mode = \"dark\"  # or \"light\"\n```\n\n### Every Palette Has Both Modes\n\nYou never have to pick a pair by hand. Every palette resolves to a light and a\ndark variant:\n\n1. **Explicit families** — `everforest-light`/`everforest-dark`,\n   `catppuccin-latte`/`catppuccin-mocha`, `rose-pine-dawn`/`rose-pine`, and\n   similar named pairs are used as-is.\n2. **Derived counterparts** — a palette that ships only one variant\n   (`dracula`, `matte-black`, `monokai`, the Lospec palettes, …) gets an\n   automatically derived counterpart named `\u003cpalette\u003e-light` or\n   `\u003cpalette\u003e-dark`. The derivation keeps every hue, compresses backgrounds\n   into a soft near-white (or near-black) band, and pushes text and links\n   until they meet WCAG AA against every derived surface.\n\n```toml\n[markata-go.theme]\npalette = \"dracula\"   # dark mode: dracula, light mode: dracula-light (derived)\n```\n\nDerived names work anywhere a palette name is accepted (`palette_light`,\n`palette_dark`, calendar rules, the switcher include/exclude lists) and show\nup in the multi-palette switcher as the family's other variant. If you prefer\na hand-tuned light theme for a dark-only palette, set `palette_light`\nexplicitly and the derived one is ignored.\n\n---\n\n## Live Theme Picker\n\nEvery site ships with a live theme picker. Visitors can restyle the site in any built-in palette without changing your configured default. The header only gains two small round buttons:\n\n- **Mode toggle** (sun/moon): switch between light and dark.\n- **Theme button** (painter's palette icon, dotted with the current theme's accent colors): opens the picker.\n\nThe picker opens as a compact popover (a bottom sheet on phones, so the page stays visible above it) with three tabs. Every tab is a grid of live preview cards:\n\n- **Colors**: each card renders in that theme's own background, surface, text, accent, and status colors. Includes search, Light/Dark buttons to browse either mode, Shuffle for a random theme, a **Seasonal** card, and a calendar button that shows the seasonal schedule.\n- **Style**: each card draws its corners, borders, and shadows in that aesthetic.\n- **Font**: each card shows a heading, body line, and code sample in that font pack. Text size buttons (Small to X-Large) sit above the grid.\n\nWith a mouse, hovering a card shows that theme, style, or font on the whole page right away. Move off the cards and the page goes back to your current choice; click to keep it. Hovering a holiday or season in the seasonal schedule previews its colors the same way. On touch screens, tap to choose.\n\nTo move fast, use the **‹ ›** buttons in the picker's top bar. They step through the current tab and show the name of the current choice, and the page updates on every tap. Arrow keys, Home/End, and PageUp/PageDown do the same from the keyboard. The picker remembers the last tab you used.\n\nThe bottom bar has a labeled **Reset** button, which goes back to the site's default theme, style, and font. While you run `markata-go serve`, it also shows **Bake**, which writes the current choices into your site config (see below). Published sites never show Bake.\n\nOn phones, every control is at least 40px tall, the search field uses 16px text so iOS does not zoom, and the sheet leaves room for the home indicator.\n\nSites are dark by default (`fallback_mode = \"dark\"`): a first-time visitor sees the dark palette regardless of their OS preference until they flip the mode toggle.\n\n### Baking a look into your config\n\nRun `markata-go serve`, open the picker, and choose a theme, style, font, and text size. Click **Bake**; the button changes to **Bake into markata-go.toml?** (naming the file it will edit, and marked **(override)** when that is a `--merge-config` file). Click again within four seconds to write it. The dev server updates the file, rebuilds, and live-reloads, so every visitor now starts with that look:\n\n```toml\n[markata-go.theme]\npalette = \"gruvbox-dark\"\npalette_light = \"gruvbox-light\"\npalette_dark = \"gruvbox-dark\"\nfallback_mode = \"dark\"\naesthetic = \"brutal\"\nfontpack = \"editorial\"\ntext_size = \"large\"\n```\n\n`fallback_mode` and `text_size` are only baked when you picked them yourself in the picker; otherwise bake leaves the site's settings alone, because they are usually each visitor's preference.\n\nBake picks the file carefully:\n\n- It looks at the root config, every file it pulls in with `include = [...]` (for example a `config/` directory), and any `--merge-config` files.\n- If one or more already have a `[markata-go.theme]` section, it edits the one that takes effect (the last to load). A theme in `config/theme.toml` stays there.\n- Otherwise it adds `[markata-go.theme]` to the root config, or creates `markata-go.toml` when the site has none.\n- If the site has no config and serve is using your global `~/.config/markata-go/config.toml`, the button reads **Bake unavailable**: bake never edits your global defaults. Create a `markata-go.toml` in the site first.\n\nOnly the baked keys change. Comments, key order, and other settings are kept, and existing keys are updated in place. TOML, YAML, and JSON configs all work. If the theme is written in a shape bake cannot edit safely (a TOML inline table `theme = { ... }`, a YAML flow mapping, or a multi-line value), bake leaves the file alone and reports the error; convert it to a normal table and try again. `MARKATA_GO_THEME_*` environment variables still override the file, and bake warns when one is set.\n\nAfter a successful bake the picker names the keys it wrote and clears your browser's saved picks, so what you see is the site default. Bake uses the same checks as the settings sidebar: if the config does not load back as written, every file is restored. A baked key also replaces any unsaved sidebar preview of it.\n\nTo change other theme settings, such as `palette_light`, `custom_css`, or `switcher.enabled`, click **All settings** next to Bake. It opens the serve-only settings sidebar at the Theme section (see [Edit Settings While Serving](/docs/guides/configuration/#edit-settings-while-serving)).\n\n### Seasonal\n\nThe **Seasonal** card, first in the Colors grid, picks a palette from today's date. It follows the northern hemisphere seasons:\n\n| Season | Starts | Palette |\n|--------|--------|---------|\n| Spring | Mar 20 | `pollen8` |\n| Summer | Jun 21 | `summer-beach` |\n| Autumn | Sep 22 | `autumn` |\n| Winter | Dec 21 | `winter-frost` |\n\nIt switches to a holiday palette for the three days before a holiday and on the day itself:\n\n| Holiday | Date | Palette |\n|---------|------|---------|\n| New Year | Jan 1 | `white-gold` / `black-gold` |\n| Lunar New Year | varies | `lunar-new-year` |\n| Valentine's Day | Feb 14 | `valentine` |\n| St. Patrick's Day | Mar 17 | `st-patricks` |\n| Easter | varies (Western) | `blessing` |\n| Earth Day | Apr 22 | `everforest-light` / `everforest-dark` |\n| Halloween | Oct 31 | `halloween` |\n| Diwali | varies (Lakshmi Puja) | `diwali` |\n| Hanukkah | varies, all 8 days | `hanukkah` |\n| Christmas | Dec 25 | `christmas` |\n\nTo see the schedule, open the picker and click the calendar button next to Shuffle on the Colors tab. It shows:\n\n- a strip for the current year, colored with each season's and holiday's theme, with a line at today\n- a **Coming up** list: what is showing now, until when, and how long is left, then each upcoming holiday (its dates and how many days it shows, lead days included) and season change (its length in weeks) over the next year, each with a color swatch\n- a **Use Seasonal** button, if you picked a different theme\n\nHover a band in the strip or a row in the list to preview that period's colors on the page. The hovered band and its row are outlined together, a line under the strip spells out the period's dates and length, and the picker's top label reads **Preview: …** while anything is being previewed. On touch screens, tap a band or row to see its dates without changing the page.\n\nThe schedule follows the Light/Dark buttons, so you see the palettes for the mode you are browsing. Click the calendar button again, search, or step with ‹ › to go back to the grid.\n\nSeasonal follows the light/dark toggle and uses each palette's matching variant. The date comes from the visitor's clock, and the head script resolves it before the first paint, so nothing flashes. Easter is calculated. Other moving holidays come from a built-in table: Lunar New Year and Hanukkah through 2035, Diwali through 2033. Holidays and seasons whose palettes are excluded by `[markata-go.theme.switcher]` are skipped.\n\nTo make seasonal the default for every visitor who has not picked a theme, set `seasonal = true`. Your `palette` settings stay as the fallback (for example, when the picker is disabled):\n\n```toml\n[markata-go.theme]\npalette = \"ayu-dark\"\nseasonal = true\n```\n\n**Bake** writes `seasonal = true` when Seasonal is selected and leaves your `palette` settings as the fallback. Baking a regular theme sets `seasonal = false` if seasonal was on.\n\n### Styles\n\nThe **Style** tab switches the aesthetic, which sets the shape and depth of code blocks, cards, admonitions, tables, images, and form controls:\n\n| Style | Look |\n|-------|------|\n| `minimal` | Default. Soft 1px borders, small radii, no shadows |\n| `balanced` | Medium radii with a light drop shadow |\n| `elevated` | Large radii, borderless surfaces lifted by soft shadows |\n| `precision` | Near-square corners with crisp hairline borders |\n| `brutal` | Square corners, 2px ink borders, and hard offset shadows in the palette's accent color, applied to cards, code, tables, buttons, inputs, search, and share buttons |\n\n### Fonts\n\nThe **Font** tab lists every bundled font pack as a preview card with its heading, body, and code faces. The default is the zero-download `system` pack: platform-native **system-ui** headings/body and **ui-monospace** code. The expressive **Brush** (Knewave, Space Grotesk, DM Mono) remains opt-in. Bundled alternative fonts are self-hosted, and a preview only downloads a face if selected or scrolled into view. With the font picker enabled, the build may still copy bundled font files to `assets/fonts/` so visitors can switch packs. Set `fontpack` in `[markata-go.theme]` to override the default for a site.\n\nThe active font pack preloads its distinct body, display, and heading faces.\nPacks with separate display and heading fonts keep both ready for the first\npaint. Shared faces are fetched once; code fonts and extended character\ncoverage load when needed.\n\n### No flash on load\n\nA visitor's choice is restored by a tiny inline script in `\u003chead\u003e` before any stylesheet paints, so return visits render in the chosen theme from the first frame. Transitions are suppressed during a switch, and view-transition navigation keeps the chosen theme.\n\n### Keyboard Shortcuts\n\n| Key | Action |\n|-----|--------|\n| `t` | Open or close the theme picker |\n| `.` | Next theme (shows a toast) |\n| `,` | Previous theme |\n| `\u003e` | Next style (aesthetic) |\n| `\u003c` | Previous style |\n| `f` | Next font |\n| `F` | Previous font |\n| `\\` | Toggle dark/light mode |\n\nInside the picker:\n\n- `1`, `2`, and `3` switch to the Colors, Style, and Font tabs.\n- Arrow keys preview.\n- `Enter` keeps the choice and closes.\n- `Escape` closes.\n\nOn the tab bar, `←`/`→` move between tabs and `↓` moves into the grid.\n\n### How choices are stored\n\nChoices are saved per mode in `localStorage`:\n\n| Key | Value |\n|-----|-------|\n| `color-mode` | `light` or `dark` |\n| `theme-palette-light` | Palette used in light mode, or `seasonal` |\n| `theme-palette-dark` | Palette used in dark mode, or `seasonal` |\n| `theme-aesthetic` | Chosen aesthetic |\n| `theme-fontpack` | Chosen font pack |\n| `text-size` | Chosen reading size |\n| `theme-picker-tab` | Last picker tab (`colors`, `style`, `font`) |\n\nPicking a theme also stores its counterpart for the other mode. For example, choosing Gruvbox in dark mode makes the mode toggle switch to Gruvbox Light. Picking your site's default pair clears the stored keys, so the visitor follows future default changes again.\n\n### Disabling the picker\n\n```toml\n[markata-go.theme.switcher]\nenabled = false      # remove the picker; ship only your palette\nmode_toggle = true   # keep the sun/moon toggle\n```\n\nWith the picker disabled, only the configured palette's CSS and font pack are generated, and the text-size control goes back to the header.\n\n### Filtering Palettes\n\nBy default, all discovered palettes are included. You can control which palettes appear:\n\n**Exclude specific palettes:**\n\n```toml\n[markata-go.theme.switcher]\ninclude_all = true  # Default\nexclude = [\"default-light\", \"default-dark\"]  # Hide these palettes\n```\n\n**Include only specific palettes:**\n\n```toml\n[markata-go.theme.switcher]\ninclude_all = false\ninclude = [\"catppuccin-mocha\", \"catppuccin-latte\", \"nord-dark\", \"nord-light\"]\n```\n\nYour configured default palettes are always available in the picker.\n\n### Switcher Configuration Reference\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `enabled` | boolean | `true` | Show the live theme picker |\n| `mode_toggle` | boolean | `true` | Show the dark/light mode toggle |\n| `include_all` | boolean | `true` | Include all discovered palettes |\n| `include` | array | `[]` | Palettes to include (when `include_all` is false) |\n| `exclude` | array | `[]` | Palettes to exclude (when `include_all` is true) |\n| `position` | string | `\"header\"` | Where to place the switcher |\n\nThe mode toggle is also gated by `[markata-go.header].show_theme_toggle` for backward compatibility.\n\nAll palettes add roughly 30KB (gzip) to `palette.css`. Use `include` to trim that on very size-sensitive sites.\n\n### Reading-size control\n\nThe default theme uses a large, comfortable reading size by default. Visitors\ncan choose a smaller or larger preset (Small, Medium, Large, X-Large) from the theme picker (or the header control when the picker is off), and their\nchoice is saved for later visits on the same site.\n\n```toml\n[markata-go.theme]\ntext_size = \"large\"              # small, medium, large, or x-large\nshow_text_size_control = true    # default: true\n```\n\n`text_size` is used when the visitor has not made a choice. The available\npresets are:\n\n| Preset | Site base | Article text | Article measure |\n|--------|-----------|--------------|-----------------|\n| `small` | 16px | 18px | 68ch |\n| `medium` | 17px | 20px | 66ch |\n| `large` | 18px | 22px | 64ch |\n| `x-large` | 19px | 24px | 62ch |\n\nArticle text also scales with the viewport so wide desktop displays do not\nrender a narrow strip of small type: `--reading-scale` multiplies the article\nfont size by 1.08 from 1800px, 1.16 from 2200px (1440p), and 1.25 from\n3000px (4K). The `ch`-based measure follows the scaled font, so line length\nstays comfortable. Site chrome (`--text-base`) is not scaled.\n\nSet `show_text_size_control = false` when a site should keep the configured\ndefault without rendering the selector. Browser zoom remains available in\nall modes.\n\nPresets are defaults, not overrides. If `[theme.variables]` sets\n`--text-base`, `--post-text-size`, or `--content-width` explicitly, the\nauthor's value wins for that token in every preset; the selector then only\naffects the tokens the site has not pinned.\n\n### How It Works\n\n1. **Palette manifest**: `palette.css` includes a JSON manifest (`--palette-manifest`) listing each theme's `name`, `displayName`, `variant` (`light`/`dark`), and mode `counterpart`.\n\n2. **Scoped palettes**: each palette is emitted as a `[data-palette=\"name\"]` block. The page sets `data-palette` on `\u003chtml\u003e`, and each preview card sets it on itself, so cards render with the real palette CSS.\n\n3. **Style tokens**: per-aesthetic surface tokens (`--radius-*`, `--surface-border`, `--surface-shadow`) are keyed on `[data-aesthetic=\"name\"]`, so each Style card previews its own aesthetic.\n\n4. **Font manifest**: `css/fonts.css` includes `--fontpack-manifest` and `--fontpack-default`, plus one `[data-fontpack=\"name\"]` block per pack. Each manifest entry carries the CSS font stacks (`headingFont`, `bodyFont`, `codeFont`) that Font cards apply inline.\n\n5. **Seasonal calendar**: when the picker is on, `base.html` inlines the seasonal schedule as `window.__markataSeasonal`, resolved against the palettes that ship.\n\n6. **Motifs follow the theme**: background motifs are off by default. When you enable one (`[markata-go.theme.motif] kind = \"block-w\"`), it is repainted from the active palette's colors whenever the page runs a palette other than the configured one.\n\n### Styling the Picker\n\n```css\n.theme-picker-toggle { /* round palette button in the header */ }\n.theme-picker-panel  { /* popover / bottom sheet */ }\n.theme-picker-tabs   { /* Colors / Style / Font tabs */ }\n.theme-picker-step   { /* ‹ › step buttons */ }\n.theme-card          { /* any preview card */ }\n.palette-card, .seasonal-card, .style-card, .font-card { /* per-tab cards */ }\n.theme-picker-schedule { /* seasonal schedule view (.ss-year strip, .ss-list) */ }\n.theme-card[aria-selected=\"true\"] { /* current theme */ }\n.theme-picker-bake   { /* \"Bake\" button (markata-go serve only) */ }\n.theme-picker-settings { /* \"All settings\" button (markata-go serve only) */ }\n```\n\n### JavaScript API\n\n```javascript\nconst picker = window.markata.paletteSwitcher;\n\ndocument.documentElement.dataset.palette; // current theme, e.g. \"gruvbox-dark\"\npicker.selectTheme(\"nord-dark\");  // apply and remember a theme\npicker.nextFamily();              // next theme in the current mode\npicker.prevFamily();\npicker.randomTheme();\npicker.toggleColorMode();         // flip light/dark\npicker.setAesthetic(\"brutal\");\npicker.setFontpack(\"editorial\");\npicker.nextFont();                // cycle fonts (also prevFont, cycleFont)\npicker.setTextSize(\"x-large\");    // small, medium, large, x-large\npicker.selectSeasonal();          // follow the seasonal calendar\npicker.getSeasonal(\"dark\");       // today's pick: { label, name }\npicker.getBakeSettings();         // current choices as [markata-go.theme] keys\npicker.bake();                    // serve only: write them to the site config\npicker.open(\"font\");              // show the picker (optionally on a tab)\npicker.close();\npicker.resetTheme();              // back to the site default\npicker.getManifest();             // all themes with variant and counterpart\n```\n\n### Event Handling\n\n```javascript\nwindow.addEventListener('palette-change', (e) =\u003e {\n  console.log('Palette:', e.detail.palette);\n});\n\nwindow.addEventListener('color-mode-change', (e) =\u003e {\n  console.log('Mode:', e.detail.mode);\n});\n\nwindow.addEventListener('aesthetic-change', (e) =\u003e {\n  console.log('Aesthetic:', e.detail.aesthetic);\n});\n\nwindow.addEventListener('fontpack-change', (e) =\u003e {\n  console.log('Font pack:', e.detail.fontpack);\n});\n\nwindow.addEventListener('text-size-change', (e) =\u003e {\n  console.log('Text size:', e.detail.size);\n});\n```\n\n---\n\n## Palette CLI Commands\n\n### List All Palettes\n\n```bash\nmarkata-go palette list\n```\n\nOutput:\n```\nNAME                      VARIANT  SOURCE     DESCRIPTION\n----------------------------------------------------------------------\nCatppuccin Mocha          dark     builtin    Soothing pastel theme\nCatppuccin Latte          light    builtin    Soothing pastel theme (light)\nNord Dark                 dark     builtin    Arctic, north-bluish\n...\n```\n\n### Get Palette Info\n\n```bash\nmarkata-go palette info catppuccin-mocha\n```\n\nShows all colors in the palette with their hex values.\n\n### Check Accessibility\n\n```bash\nmarkata-go palette check catppuccin-mocha\n```\n\nChecks WCAG 2.1 AA contrast requirements for text readability.\n\n### Export Palette\n\nExport a palette to different formats:\n\n```bash\n# Export as CSS custom properties\nmarkata-go palette export catppuccin-mocha --format css\n\n# Export as SCSS variables\nmarkata-go palette export catppuccin-mocha --format scss\n\n# Export as JSON\nmarkata-go palette export catppuccin-mocha --format json\n\n# Export as Tailwind config\nmarkata-go palette export catppuccin-mocha --format tailwind\n```\n\n### Create New Palette\n\nGenerate a starter palette file:\n\n```bash\nmarkata-go palette new my-palette\n```\n\nCreates `palettes/my-palette.toml` that you can customize.\n\n### Clone Existing Palette\n\nClone an existing palette as a starting point for customization:\n\n```bash\n# Interactive mode - opens fuzzy picker to select a palette\nmarkata-go palette clone\n\n# Clone a specific palette by name\nmarkata-go palette clone catppuccin-mocha\n\n# Clone with explicit new name\nmarkata-go palette clone catppuccin-mocha --name \"my-custom-theme\"\n```\n\nThe cloned palette is saved to `~/.config/markata-go/palettes/` and includes:\n- All colors from the source palette\n- Semantic and component color mappings\n- A description noting the source palette\n\nThis is useful when you want to:\n- Start from a well-designed palette and make minor adjustments\n- Create variants of existing palettes (e.g., higher contrast)\n- Experiment without modifying the original\n\n### Fetch Palette from Lospec\n\nImport color palettes directly from [Lospec.com](https://lospec.com/palette-list), a popular source for pixel art and retro color palettes:\n\n```bash\n# Fetch a palette by URL\nmarkata-go palette fetch https://lospec.com/palette-list/sweetie-16.txt\n\n# Use a custom name\nmarkata-go palette fetch https://lospec.com/palette-list/cheese-palette.txt --name \"My Cheese\"\n\n# Save to a custom directory\nmarkata-go palette fetch https://lospec.com/palette-list/tokyo-night.txt -o palettes/\n```\n\nThe fetched palette is saved to your user palettes directory (`~/.config/markata-go/palettes/`) by default. markata-go automatically:\n\n- Downloads the color list from Lospec\n- Analyzes colors to determine if it's a light or dark theme\n- Generates semantic mappings (text-primary, bg-primary, accent, etc.)\n- Caches the download to avoid repeated network requests\n\n**Example output:**\n```\nFetching palette from: https://lospec.com/palette-list/sweetie-16.txt\nPalette saved to: /home/user/.config/markata-go/palettes/sweetie-16.toml\n\nPalette details:\n  Name:        Sweetie 16\n  Variant:     dark\n  Colors:      16\n  Source:      https://lospec.com/palette-list/sweetie-16.txt\n\nSemantic mappings:\n  bg-primary      -\u003e color0      (#1a1c2c)\n  text-primary    -\u003e color15     (#f4f4f4)\n  accent          -\u003e color8      (#b13e53)\n\nUse this palette in your config:\n  [markata-go.theme]\n  palette = \"sweetie-16\"\n```\n\n### Pick Palette Interactively\n\nBrowse all available palettes in a full-screen interactive TUI with live color previews:\n\n```bash\n# Pick a palette and set it in your config (default)\nmarkata-go palette pick\n\n# Only print the name without updating config\nmarkata-go palette pick --no-set\n```\n\nThe picker shows a two-panel layout:\n\n- **Left panel** -- Fuzzy-filterable list of all palettes with variant badges (`[dark]`/`[light]`). Type to filter, use arrow keys to navigate.\n- **Right panel** -- Live preview of the highlighted palette showing color swatches, semantic roles, and a contrast preview block.\n\nPress **Enter** to select a palette and set it in your config, or **Esc** to cancel.\n\n**Compose with other commands:**\n\n```bash\n# View detailed info for the palette you pick (without setting it)\nmarkata-go palette info \"$(markata-go palette pick --no-set)\"\n\n# Pick, set, and rebuild\nmarkata-go palette pick \u0026\u0026 markata-go build\n```\n\n---\n\n## Creating Custom Palettes\n\nCreate a custom palette by adding a TOML file to `palettes/` in your project:\n\n```toml\n# palettes/my-brand.toml\n[palette]\nname = \"My Brand\"\nvariant = \"light\"  # or \"dark\"\nauthor = \"Your Name\"\n\n# Raw colors\n[palette.colors]\nbrand-primary = \"#3b82f6\"\nbrand-secondary = \"#8b5cf6\"\nbrand-accent = \"#06b6d4\"\nwhite = \"#ffffff\"\ngray-50 = \"#f9fafb\"\ngray-100 = \"#f3f4f6\"\ngray-700 = \"#374151\"\ngray-800 = \"#1f2937\"\ngray-900 = \"#111827\"\n\n# Semantic mapping\n[palette.semantic]\ntext-primary = \"gray-800\"\ntext-secondary = \"gray-700\"\nbg-primary = \"white\"\nbg-secondary = \"gray-50\"\naccent = \"brand-primary\"\nlink = \"brand-primary\"\nlink-hover = \"brand-secondary\"\n```\n\nThen use it:\n\n```toml\n[markata-go.theme]\npalette = \"my-brand\"\n```\n\n---\n\n## Aesthetics\n\nWhile palettes control **colors**, aesthetics control **form and layout** - the non-color design tokens that define your site's visual personality.\n\n\u003e **Think of it this way:** Palettes are *what colors* you use. Aesthetics are *how things are shaped*.\n\n### Quick Start\n\nSet an aesthetic in one line:\n\n```toml\n[markata-go]\naesthetic = \"elevated\"\n```\n\nYour entire site now uses generous rounded corners, layered shadows, and comfortable spacing.\n\n### Understanding the Separation\n\n| Aspect | Palettes | Aesthetics |\n|--------|----------|------------|\n| **Controls** | Colors | Shape, spacing, depth |\n| **Tokens** | `--color-*` variables | `--radius-*`, `--shadow-*`, `--spacing-*` |\n| **Examples** | Background, text, accent colors | Border radius, shadow depth, spacing scale |\n| **Switch** | Changes color scheme | Changes visual \"feel\" |\n\nThis separation means you can:\n- Use any palette with any aesthetic\n- Switch aesthetics without changing colors\n- Fine-tune form independently of color\n\n### Available Aesthetics\n\nmarkata-go includes 5 built-in aesthetics:\n\n| Aesthetic | Description | Best For |\n|-----------|-------------|----------|\n| `balanced` | **Default.** Comfortable rounding, subtle shadows, normal spacing | General purpose, blogs |\n| `brutal` | Sharp corners, thick borders, tight spacing, hard accent-colored offset shadows | Bold statements, portfolios |\n| `minimal` | Restrained rounding, airy whitespace, flat surfaces and selective borders | Documentation, reading-focused |\n| `elevated` | Generous rounding, layered shadows, generous spacing | Premium/SaaS, card-heavy layouts |\n| `precision` | Subtle corners, compact spacing, hairline borders, minimal shadows | Technical docs, data-heavy sites |\n\n### Visual Comparison\n\n**Brutal:**\n```\n┌────────────────────────┐\n│ No rounding            │\n│ Thick 3px borders      │\n│ Compact spacing        │\n│ Hard accent shadows    │\n└────────────────────────┘\n```\n\n**Balanced (default):**\n```\n╭────────────────────────╮\n│ Subtle 4-8px rounding  │\n│ Normal 1px borders     │\n│ Standard spacing       │\n│ Light shadows          │\n╰────────────────────────╯\n```\n\n**Elevated:**\n```\n╭────────────────────────╮\n│                        │\n│ Generous 16px rounding │\n│ Minimal borders        │\n│ Generous spacing       │\n│ Layered shadows ▓▒░    │\n│                        │\n╰────────────────────────╯\n```\n\n### Configuration Examples\n\nStyles affect the feed and post cards, code, admonitions, quotes, tables and\nimages, buttons and inputs, tags, header edge, picker panel, prose rhythm and\nopen doc/feed drawers. Balanced keeps the theme's native surface treatment.\nPrecision is compact and crisp; elevated is soft and lifted; minimal stays\nflat and airy. Style cards preview their own shape and depth without changing\nthe active palette. Site `custom_css` and `[theme.variables]` can still override\nthe layered aesthetic rules.\n\n**Basic usage:**\n\n```toml\n[markata-go]\naesthetic = \"brutal\"\n```\n\n**Combine with a palette:**\n\n```toml\n[markata-go]\naesthetic = \"elevated\"\n\n[markata-go.theme]\npalette = \"catppuccin-mocha\"\n```\n\n**Override specific tokens:**\n\n```toml\n[markata-go]\naesthetic = \"balanced\"\n\n[markata-go.aesthetic_overrides]\nborder_radius = \"12px\"      # Override just the radius\nshadow_intensity = 1.5      # Make shadows 50% stronger\nspacing_scale = 1.1         # Slightly more spacing\n```\n\n### Aesthetic Overrides Reference\n\nFine-tune any aesthetic with these overrides:\n\n| Override | Type | Description | Example |\n|----------|------|-------------|---------|\n| `border_radius` | string | Base border radius | `\"8px\"`, `\"0.5rem\"` |\n| `border_width` | string | Border thickness | `\"1px\"`, `\"2px\"` |\n| `border_style` | string | Border style | `\"solid\"`, `\"dashed\"`, `\"none\"` |\n| `spacing_scale` | float | Multiplier for spacing | `0.9` (tighter), `1.2` (looser) |\n| `shadow_intensity` | float | Multiplier for shadow opacity | `0` (none), `1.5` (stronger) |\n| `shadow_size` | string | Shadow size preset | `\"sm\"`, `\"md\"`, `\"lg\"`, `\"none\"` |\n\n**Example: Make \"balanced\" more spacious:**\n\n```toml\n[markata-go]\naesthetic = \"balanced\"\n\n[markata-go.aesthetic_overrides]\nspacing_scale = 1.25\nshadow_intensity = 0.5  # Lighter shadows\n```\n\n**Example: Soften \"brutal\":**\n\n```toml\n[markata-go]\naesthetic = \"brutal\"\n\n[markata-go.aesthetic_overrides]\nborder_radius = \"4px\"   # Add slight rounding\nborder_width = \"2px\"    # Thinner borders\n```\n\n### Aesthetic CLI Commands\n\nList all available aesthetics:\n\n```bash\nmarkata-go aesthetic list\n```\n\nOutput:\n```\nAvailable aesthetics:\n  brutal     - Brutalist design: harsh, uncompromising, raw\n  precision  - Technical/engineering: clean, exact, minimal\n  balanced   - Default harmonious: comfortable, balanced\n  elevated   - Layered/premium: depth, floating cards\n  minimal    - Maximum whitespace: sparse, intentional\n```\n\nShow details of a specific aesthetic:\n\n```bash\nmarkata-go aesthetic show elevated\n```\n\nOutput:\n```\nAesthetic: elevated\nDescription: Layered/premium: depth, floating cards\n\nTokens:\n  radius:  0.5rem (sm), 0.75rem (md), 1rem (lg)\n  spacing: 1.25x scale\n  border:  none\n  shadow:  0 4px 12px rgba(0,0,0,0.15)\n\nCSS Preview:\n  --radius-sm: 0.5rem;\n  --radius-md: 0.75rem;\n  --radius-lg: 1rem;\n  --radius-full: 9999px;\n  --shadow: 0 4px 12px rgba(0,0,0,0.15);\n```\n\n### Creating Custom Aesthetics\n\nCreate a custom aesthetic by adding a TOML file to `aesthetics/` in your project:\n\n```toml\n# aesthetics/my-aesthetic.toml\nname = \"My Aesthetic\"\ndescription = \"Custom design for my brand\"\n\n[tokens.radius]\nnone = \"0\"\nsm = \"6px\"\nmd = \"10px\"\nlg = \"16px\"\nxl = \"24px\"\nfull = \"9999px\"\n\n[tokens.spacing]\nscale = 1.1\n\n[tokens.border]\nwidth_thin = \"1px\"\nwidth_normal = \"2px\"\nwidth_thick = \"3px\"\nstyle = \"solid\"\n\n[tokens.shadow]\nsm = \"0 1px 2px rgba(0,0,0,0.05)\"\nmd = \"0 4px 8px rgba(0,0,0,0.1)\"\nlg = \"0 8px 16px rgba(0,0,0,0.12)\"\nxl = \"0 16px 32px rgba(0,0,0,0.15)\"\n\n[tokens.typography]\nfont_primary = \"var(--font-sans)\"\nleading_scale = 1.0\n```\n\nThen use it:\n\n```toml\n[markata-go]\naesthetic = \"my-aesthetic\"\n```\n\n### Keyboard Shortcuts\n\nWhen the palette switcher is enabled, these shortcuts also work for aesthetics:\n\n| Key | Action |\n|-----|--------|\n| `.` | Next palette family (full switcher only) |\n| `,` | Previous palette family (full switcher only) |\n| `\u003e` | Next aesthetic (full switcher only) |\n| `\u003c` | Previous aesthetic (full switcher only) |\n| `\\` | Toggle dark/light mode (mode toggle only) |\n\n---\n\n## Template Overrides\n\nOverride any template by placing it in your `templates/` directory.\n\n### Template Search Order\n\n1. `templates/` - Your project templates (highest priority)\n2. `themes/{theme}/templates/` - Theme templates\n3. Embedded default templates (fallback)\n\n### Available Templates\n\n| Template | Purpose |\n|----------|---------|\n| `base.html` | HTML skeleton, head, header, footer |\n| `post.html` | Single post/article layout |\n| `feed.html` | List of posts (index, archive, tags) |\n| `card.html` | Post preview card in feeds |\n| `partials/header.html` | Site header/navigation |\n| `partials/footer.html` | Site footer |\n| `partials/head.html` | Additional head content |\n\n### Example: Custom Footer\n\nCreate `templates/partials/footer.html`:\n\n```html\n\u003cfooter class=\"site-footer\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cp\u003e\u0026copy; {{ now | date:\"2006\" }} {{ config.title }}. Built with markata-go.\u003c/p\u003e\n    \u003cnav\u003e\n      \u003ca href=\"/about/\"\u003eAbout\u003c/a\u003e\n      \u003ca href=\"/contact/\"\u003eContact\u003c/a\u003e\n      \u003ca href=\"https://github.com/yourusername\"\u003eGitHub\u003c/a\u003e\n    \u003c/nav\u003e\n  \u003c/div\u003e\n\u003c/footer\u003e\n```\n\n---\n\n## Static Assets\n\nAdd custom CSS, JavaScript, images, and fonts to the `static/` directory:\n\n```\nmy-site/\n├── static/\n│   ├── css/\n│   │   └── custom.css\n│   ├── js/\n│   │   └── analytics.js\n│   ├── images/\n│   │   └── logo.png\n│   └── fonts/\n│       └── MyFont.woff2\n└── markata-go.toml\n```\n\nFiles in `static/` are copied directly to the output directory.\n\nReference them in templates:\n\n```html\n\u003clink rel=\"stylesheet\" href=\"/css/custom.css\"\u003e\n\u003cscript src=\"/js/analytics.js\"\u003e\u003c/script\u003e\n\u003cimg src=\"/images/logo.png\" alt=\"Logo\"\u003e\n```\n\n---\n\n## Per-Post Styling\n\nOverride styles for specific posts using frontmatter:\n\n```yaml\n---\ntitle: \"Special Post\"\ntemplate: landing.html  # Use a different template\n---\n```\n\nOr add custom CSS classes:\n\n```yaml\n---\ntitle: \"Featured Article\"\ncss_class: featured-post\n---\n```\n\nThen style it:\n\n```css\n.featured-post {\n  background: linear-gradient(to right, var(--color-primary), var(--color-accent));\n}\n```\n\n---\n\n## CSS Optimization\n\n### Bundle a homepage\n\nTo reduce stylesheet requests on a specific page, enable page bundling:\n\n```toml\n[markata-go.css_bundle]\nenabled = true\npages = [\"index.html\"]\n```\n\nUse output-relative HTML paths. Production builds combine local head\nstylesheets and inline styles in their original order into hashed CSS files.\nScripts and special stylesheets separate bundles. Remote stylesheets, media\nconditions, integrity attributes, CSS imports, and relative asset URLs stay\nuntouched. Fast builds skip this step. Original CSS files remain available for\nnavigation and custom templates. The runtime loader recognizes bundled sources\nand avoids downloading them again.\n\nThe navbar reserves space for its search input before deferred search styles\nload, so the header stays in place while search initializes.\n\nTitle fitting and highlighted headings wait for initial layout before measuring\nwhen ResizeObserver is available. They still update after fonts load and the\npage resizes, keeping the same typography with less synchronous startup work.\nThe article progress indicator also refreshes as images or other content change\nthe article's height.\n\nClosed feed and table-of-contents drawers skip rendering their contents when\nthe browser supports content visibility and discrete transitions. Opening\nrestores the contents immediately, while closing preserves the slide.\nReduced-motion preferences remain supported. Other browsers keep the existing\nrendering behavior.\n\nMobile drawers center the active feed item when opened without measuring\nclosed-drawer geometry during startup. Desktop drawers\ncontinue to restore their saved state and follow the visible header edge.\n\nWith the built-in theme picker, the default template initially loads\n`palette-core.css` with colors and picker metadata for the configured light/dark\npair. Generated palette changes also invalidate cached HTML, so warm builds\nreference the current stylesheet. The remaining palette catalog and colors load when\nopening the picker or restoring a saved or seasonal choice. Custom templates\ncan continue loading the complete `palette.css` stylesheet.\n\nImage zoom CSS and JavaScript load on the first image click. The first click\nopens that image once the library is ready; later clicks reuse the library.\nPhoto and article cards use responsive image candidates on trusted resize\nhosts. For text-only feed previews, use `render_feed(\"til\", 8, \"summary\")`.\n\nmarkata-go automatically optimizes CSS loading by only including stylesheets that are actually needed for each page. This reduces page size and improves load times.\n\n### How It Works\n\nWhen rendering a page, markata-go scans the HTML content and detects which CSS features are used:\n\n| CSS File | Loaded When |\n|----------|-------------|\n| `variables.css` | Always (core theme variables) |\n| `main.css` | Always (core layout styles) |\n| `components.css` | Always (navigation, footer, etc.) |\n| `cards.css` | Feed/index pages with post cards |\n| `admonitions.css` | Posts containing admonition blocks |\n| `code.css` | Posts containing code blocks |\n| `chroma.css` | Posts with syntax-highlighted code |\n| `webmentions.css` | When webmentions are enabled |\n| `palette-switcher.css` | When palette switcher is enabled |\n| `search.css` | When search is enabled |\n\n### Content Detection\n\nThe CSS detection works by analyzing the rendered HTML:\n\n- **Admonitions**: Detected when `class=\"admonition` is present\n- **Code blocks**: Detected when syntax highlighting classes (`class=\"chroma\"`, `class=\"highlight\"`) or code elements (`\u003cpre\u003e\u003ccode`, `\u003ccode class=\"language-`) are present\n- **Cards**: Included on feed pages (where `feed` variable exists in template context)\n\n### Benefits\n\n- **Smaller page sizes**: Simple pages without code blocks or admonitions skip those CSS files\n- **Faster load times**: Less CSS to download and parse\n- **Better caching**: Core CSS files are shared across all pages\n\n### Custom CSS\n\nYour custom CSS (via `theme.custom_css`) is always loaded when configured. If you need conditional loading for custom styles, consider using CSS custom properties or JavaScript-based loading.\n\n---\n\n## Media Borders and Gradient Effects\n\nmarkata-go provides beautiful, configurable borders for images and videos. From subtle solid borders to animated gradients, you have full control over how your media looks.\n\n### Default Media Styling\n\nBy default, images and videos in your content get:\n\n- Rounded corners (`--media-border-radius`)\n- A subtle border (`--media-border-width`, `--media-border-color`)\n- Proper spacing and centering\n\n### Configuring Media Borders\n\nCustomize the default borders via CSS variables:\n\n```css\n/* In your custom CSS or via theme.variables */\n:root {\n  --media-border-width: 3px;      /* Border thickness */\n  --media-border-color: #e5e7eb;  /* Border color */\n  --media-border-radius: 0.5rem;  /* Corner rounding */\n}\n```\n\nOr via config:\n\n```toml\n[markata-go.theme.variables]\n\"--media-border-width\" = \"4px\"\n\"--media-border-color\" = \"#8b5cf6\"\n\"--media-border-radius\" = \"1rem\"\n```\n\n### Gradient Borders\n\nEnable colorful gradient borders for a modern, eye-catching look. Add a class to your post content to enable gradients for all media:\n\n```yaml\n---\ntitle: \"My Post with Gradient Borders\"\ncss_class: gradient-borders\n---\n```\n\nThis applies the default accent gradient to all images and videos in that post.\n\n### Available Gradient Presets\n\nmarkata-go includes several beautiful gradient presets:\n\n| Class | Colors | Best For |\n|-------|--------|----------|\n| `gradient-borders` | Primary to primary-dark | Brand-consistent |\n| `gradient-vibrant` | Purple to pink | Creative, artistic |\n| `gradient-warm` | Pink to orange | Energetic, warm |\n| `gradient-cool` | Blue to cyan | Professional, tech |\n| `gradient-sunset` | Pink to yellow | Warm, inviting |\n| `gradient-ocean` | Teal to light blue | Calm, refreshing |\n\nUse them in frontmatter:\n\n```yaml\n---\ntitle: \"Ocean-Themed Post\"\ncss_class: gradient-ocean\n---\n```\n\n### Animated Gradient Borders\n\nFor extra visual impact, use animated gradients that slowly shift colors:\n\n```yaml\n---\ntitle: \"Attention-Grabbing Post\"\ncss_class: gradient-animated\n---\n```\n\nThe animation cycles through purple, pink, and blue over 6 seconds.\n\n### Glow Effects\n\nAdd a subtle glow behind your media:\n\n```yaml\n---\ntitle: \"Glowing Media\"\ncss_class: glow\n---\n```\n\nCombine glow with gradients:\n\n```yaml\n---\ntitle: \"Maximum Impact\"\ncss_class: gradient-vibrant glow\n---\n```\n\n### Per-Image Styling\n\nFor fine-grained control, add classes directly to images in your Markdown using HTML:\n\n```html\n\u003cimg src=\"/images/hero.jpg\" alt=\"Hero\" class=\"gradient-vibrant glow\"\u003e\n```\n\nOr use a wrapper div:\n\n```html\n\u003cdiv class=\"media-frame gradient-sunset glow\"\u003e\n  \u003cimg src=\"/images/featured.jpg\" alt=\"Featured\"\u003e\n\u003c/div\u003e\n```\n\n### CSS Variable Reference for Media\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `--media-border-width` | Border thickness | `3px` |\n| `--media-border-style` | Border style | `solid` |\n| `--media-border-color` | Border color | `var(--color-border)` |\n| `--media-border-radius` | Corner rounding | `0.5rem` |\n| `--gradient-accent` | Default gradient | Primary colors |\n| `--gradient-vibrant` | Purple-pink gradient | `#667eea` to `#f093fb` |\n| `--gradient-warm` | Pink-orange gradient | `#f093fb` to `#f8b500` |\n| `--gradient-cool` | Blue-cyan gradient | `#4facfe` to `#00f2fe` |\n| `--gradient-sunset` | Pink-yellow gradient | `#fa709a` to `#fee140` |\n| `--gradient-ocean` | Teal-blue gradient | `#2193b0` to `#6dd5ed` |\n\n### Palette-Matching Gradients\n\nIf you're using a specific color palette, use the matching gradient for visual consistency:\n\n| Class | Palette | Colors |\n|-------|---------|--------|\n| `gradient-catppuccin` | Catppuccin | Mauve → Pink → Red |\n| `gradient-nord` | Nord | Frost colors (cyan → blue) |\n| `gradient-dracula` | Dracula | Purple → Pink → Cyan |\n| `gradient-gruvbox` | Gruvbox | Yellow → Orange → Red |\n| `gradient-rose-pine` | Rosé Pine | Iris → Rose → Gold |\n| `gradient-solarized` | Solarized | Blue → Cyan → Green |\n| `gradient-tokyo-night` | Tokyo Night | Blue → Purple → Pink |\n\nExample: If your site uses `catppuccin-mocha` palette, use `gradient-catppuccin` for borders:\n\n```toml\n# markata-go.toml\n[markata-go.theme]\npalette = \"catppuccin-mocha\"\n```\n\n```yaml\n# In your post frontmatter\n---\ntitle: \"Catppuccin-Styled Gallery\"\ncss_class: gradient-catppuccin\n---\n```\n\n### Custom Gradients\n\nCreate your own gradient by overriding the variables:\n\n```css\n/* In static/custom.css */\n:root {\n  --gradient-accent: linear-gradient(135deg, #ff6b6b, #feca57, #48dbfb);\n}\n```\n\nOr define a completely new one:\n\n```css\n.post-content.gradient-custom img,\n.post-content.gradient-custom video {\n  border: none;\n  padding: 3px;\n  background: linear-gradient(45deg, #12c2e9, #c471ed, #f64f59);\n  background-origin: border-box;\n}\n```\n\nThen use in frontmatter:\n\n```yaml\n---\ncss_class: gradient-custom\n---\n```\n\n### Dark Mode Considerations\n\nGradient borders adapt to dark mode:\n- Glow effects become more prominent\n- Border colors adjust automatically\n- Gradients remain vibrant on dark backgrounds\n\nTest your gradient choices in both light and dark mode.\n\n---\n\n## Background Decorations\n\nAdd multi-layered background decorations to your site for visual effects like snow, particles, stars, or animated elements.\n\n### Basic Configuration\n\n```toml\n[markata-go.theme.background]\nenabled = true\n\nbackgrounds = [\n  { html = '\u003csnow-fall count=\"200\"\u003e\u003c/snow-fall\u003e' },\n]\n\nscripts = [\"/static/js/snow-fall.js\"]\n```\n\nThis adds a snow effect using a custom web component with its supporting JavaScript.\n\n### Multiple Layers\n\nStack multiple background layers with different z-index values:\n\n```toml\n[markata-go.theme.background]\nenabled = true\n\nbackgrounds = [\n  { html = '\u003cdiv class=\"stars\"\u003e\u003c/div\u003e', z_index = -20 },\n  { html = '\u003cdiv class=\"clouds\"\u003e\u003c/div\u003e', z_index = -10 },\n  { html = '\u003csnow-fall count=\"100\"\u003e\u003c/snow-fall\u003e', z_index = -5 },\n]\n\nscripts = [\"/static/js/background-effects.js\"]\n\ncss = '''\n.stars {\n  position: absolute;\n  inset: 0;\n  background: url(\"/images/stars.png\") repeat;\n  opacity: 0.3;\n}\n\n.clouds {\n  position: absolute;\n  inset: 0;\n  background: url(\"/images/clouds.png\") repeat-x;\n  animation: drift 60s linear infinite;\n}\n\n@keyframes drift {\n  from { background-position: 0 0; }\n  to { background-position: 100% 0; }\n}\n'''\n```\n\n### Configuration Reference\n\n| Option | Type | Description |\n|--------|------|-------------|\n| `enabled` | boolean | Enable/disable background decorations (default: false) |\n| `backgrounds` | array | List of background elements |\n| `backgrounds[].html` | string | HTML content for this layer |\n| `backgrounds[].z_index` | integer | Stacking order (-1 is default, behind content) |\n| `scripts` | array | Script URLs to load for background functionality |\n| `css` | string | Custom CSS for styling background elements |\n| `article_bg` | string | Background applied to post/feed content when decorations are enabled |\n| `article_blur_enabled` | boolean | Opt in to backdrop blur on content containers (default: false) |\n| `article_blur` | string | Blur amount used only when `article_blur_enabled = true` |\n| `article_shadow` | string | Box shadow for post/feed content wrappers |\n| `article_border` | string | Border for post/feed content wrappers |\n| `article_radius` | string | Border radius for post/feed content wrappers |\n\n### Tips for Background Decorations\n\n1. **Performance**: Complex animations can impact performance. Test on lower-powered devices.\n\n2. **Fullscreen video**: Keep `article_blur_enabled = false` unless you specifically want frosted-glass content. Even a no-op blur can hurt fullscreen video playback on some browsers.\n\n   Also avoid adding global `::backdrop` blur, since that affects fullscreen media as well as dialogs.\n\n3. **Accessibility**: Ensure backgrounds don't interfere with content readability. Use `pointer-events: none` (applied automatically).\n\n4. **Z-Index**: Use negative values to place backgrounds behind content. Positive values overlay content.\n\n5. **Web Components**: Custom elements like `\u003csnow-fall\u003e` provide encapsulated, reusable effects.\n\n6. **Reduced Motion**: Consider respecting `prefers-reduced-motion` in your CSS:\n\n```css\n@media (prefers-reduced-motion: reduce) {\n  .background-layer * {\n    animation: none !important;\n  }\n}\n```\n\n### Readable Content Over Decorations\n\nUse article wrapper styling to keep content readable without forcing blur:\n\n```toml\n[markata-go.theme.background]\nenabled = true\narticle_bg = \"color-mix(in srgb, var(--color-background) 88%, transparent)\"\narticle_shadow = \"0 12px 32px rgba(0, 0, 0, 0.12)\"\narticle_border = \"1px solid color-mix(in srgb, var(--color-border) 60%, transparent)\"\narticle_radius = \"1rem\"\n\nbackgrounds = [\n  { html = '\u003cdiv class=\"stars\"\u003e\u003c/div\u003e', z_index = -10 },\n]\n```\n\nIf you do want a frosted-glass effect, enable it explicitly:\n\n```toml\n[markata-go.theme.background]\nenabled = true\narticle_bg = \"rgba(255, 255, 255, 0.72)\"\narticle_blur_enabled = true\narticle_blur = \"12px\"\n```\n\n### Example: Particle Background\n\nUsing [particles.js](https://vincentgarreau.com/particles.js/):\n\n```toml\n[markata-go.theme.background]\nenabled = true\n\nbackgrounds = [\n  { html = '\u003cdiv id=\"particles-js\"\u003e\u003c/div\u003e' },\n]\n\nscripts = [\n  \"https://cdn.jsdelivr.net/particles.js/2.0.0/particles.min.js\",\n  \"/static/js/particles-config.js\",\n]\n\ncss = '''\n#particles-js {\n  position: absolute;\n  inset: 0;\n}\n'''\n```\n\n---\n\n## Seasonal Theme Calendar\n\nAutomatically apply different themes based on the date. Perfect for seasonal decorations, holidays, or promotional periods.\n\n### Basic Configuration\n\nEnable date-based theme switching:\n\n```toml\n[markata-go.theme_calendar]\nenabled = true\n\n[[markata-go.theme_calendar.rules]]\nname = \"Christmas Season\"\nstart_date = \"12-15\"\nend_date = \"12-26\"\npalette = \"christmas\"\n\n[[markata-go.theme_calendar.rules]]\nname = \"Winter Frost\"\nstart_date = \"12-01\"\nend_date = \"02-28\"\npalette = \"winter-frost\"\n```\n\nDuring December 15-26, the site uses the \"christmas\" palette. From December 1 to February 28, it uses \"winter-frost\" (excluding the more specific Christmas period).\n\n### How It Works\n\n1. **First match wins**: Rules are evaluated in order. The first matching rule is applied.\n2. **MM-DD format**: Dates use month-day format (no year), so rules repeat annually.\n3. **Year boundary support**: Ranges like `12-01` to `02-28` correctly span December through February.\n4. **Runs early**: The calendar plugin runs at the Configure stage before other theme plugins, ensuring palette overrides are applied correctly.\n\n### Rule Configuration\n\nEach rule can override various theme settings:\n\n```toml\n[[markata-go.theme_calendar.rules]]\nname = \"Spooky October\"\nstart_date = \"10-01\"\nend_date = \"10-31\"\npalette = \"halloween\"            # Single palette for both modes\n# Or use separate light/dark palettes:\n# palette_light = \"halloween-light\"\n# palette_dark = \"halloween-dark\"\n\n# CSS variable overrides\n[markata-go.theme_calendar.rules.variables]\n\"--color-accent\" = \"#ff6600\"\n\"--color-link\" = \"#9b59b6\"\n\n# Custom CSS file for the season\ncustom_css = \"halloween.css\"\n```\n\n### Rule Options Reference\n\n| Option | Type | Description |\n|--------|------|-------------|\n| `name` | string | Display name for the rule (used in logs and CLI) |\n| `start_date` | string | Start date in MM-DD format (e.g., \"12-01\") |\n| `end_date` | string | End date in MM-DD format (e.g., \"02-28\") |\n| `palette` | string | Palette to use (overrides both modes) |\n| `palette_light` | string | Light mode palette (if different from dark) |\n| `palette_dark` | string | Dark mode palette |\n| `custom_css` | string | Additional CSS file for this period |\n| `variables` | table | CSS variable overrides |\n| `background` | table | Background decoration override (see below) |\n| `font` | table | Font configuration override |\n\n### Background Overrides\n\nApply seasonal background decorations:\n\n```toml\n[[markata-go.theme_calendar.rules]]\nname = \"Winter Wonderland\"\nstart_date = \"12-01\"\nend_date = \"02-28\"\npalette = \"winter-frost\"\n\n[markata-go.theme_calendar.rules.background]\nenabled = true\ncss = \"\"\"\n.snowflake {\n  position: absolute;\n  color: white;\n  animation: fall linear infinite;\n}\n\"\"\"\n\n[[markata-go.theme_calendar.rules.background.backgrounds]]\nhtml = '\u003csnow-fall count=\"100\"\u003e\u003c/snow-fall\u003e'\nz_index = -5\n```\n\n### Font Overrides\n\nUse a different font for special periods:\n\n```toml\n[[markata-go.theme_calendar.rules]]\nname = \"Christmas Season\"\nstart_date = \"12-15\"\nend_date = \"12-26\"\npalette = \"christmas\"\n\n[markata-go.theme_calendar.rules.font]\nfamily = \"Mountains of Christmas\"\nheading_family = \"Snowburst One\"\ngoogle_fonts = [\"Mountains of Christmas\", \"Snowburst One\"]\n```\n\n### Multiple Rules Example\n\nCreate a full year of seasonal themes:\n\n```toml\n[markata-go.theme_calendar]\nenabled = true\ndefault_palette = \"catppuccin-mocha\"  # Fallback when no rule matches\n\n# Spring (March 20 - June 20)\n[[markata-go.theme_calendar.rules]]\nname = \"Spring\"\nstart_date = \"03-20\"\nend_date = \"06-20\"\npalette = \"spring-garden\"\n\n# Summer (June 21 - September 22)\n[[markata-go.theme_calendar.rules]]\nname = \"Summer\"\nstart_date = \"06-21\"\nend_date = \"09-22\"\npalette = \"summer-sunset\"\n\n# Halloween (October 15 - November 1)\n[[markata-go.theme_calendar.rules]]\nname = \"Halloween\"\nstart_date = \"10-15\"\nend_date = \"11-01\"\npalette = \"spooky\"\n\n# Fall (September 23 - December 20, but after Halloween ends)\n[[markata-go.theme_calendar.rules]]\nname = \"Fall\"\nstart_date = \"11-02\"\nend_date = \"12-20\"\npalette = \"autumn-leaves\"\n\n# Also need early fall before Halloween\n[[markata-go.theme_calendar.rules]]\nname = \"Early Fall\"\nstart_date = \"09-23\"\nend_date = \"10-14\"\npalette = \"autumn-leaves\"\n\n# Winter (December 21 - March 19)\n[[markata-go.theme_calendar.rules]]\nname = \"Winter\"\nstart_date = \"12-21\"\nend_date = \"03-19\"\npalette = \"winter-frost\"\n```\n\n### CLI Commands\n\n**List all calendar rules:**\n\n```bash\nmarkata-go theme calendar list\n```\n\nOutput:\n```\nTheme Calendar Rules (3 configured)\n============================================================\n\nChristmas Season [ACTIVE]\n  Date Range: 12-15 to 12-26\n  Palette: christmas\n\nWinter Frost\n  Date Range: 12-01 to 02-28\n  Palette: winter-frost\n\nHalloween\n  Date Range: 10-15 to 11-01\n  Palette: spooky\n```\n\n**Preview theme for a specific date:**\n\n```bash\n# Check today's theme\nmarkata-go theme calendar preview\n\n# Check what theme applies on December 25\nmarkata-go theme calendar preview 12-25\n\n# Check New Year's Day\nmarkata-go theme calendar preview 01-01\n```\n\nOutput:\n```\nChecking theme for date: 12-25\n----------------------------------------\n\nMatching Rule: Christmas Season\nDate Range: 12-15 to 12-26\n\nTheme Overrides:\n  Palette: christmas\n  Font Family: Mountains of Christmas\n```\n\n### Tips\n\n1. **Order matters**: Put more specific rules before general ones. Christmas should come before Winter.\n\n2. **Testing**: Use `markata-go theme calendar preview MM-DD` to test any date without waiting for that day.\n\n3. **Smooth transitions**: Consider overlapping date ranges with similar themes for gradual transitions.\n\n4. **Performance**: Each rule is checked in order; keep the number of rules reasonable.\n\n5. **Combine with switcher**: The calendar sets a default theme, but users can still override via the palette switcher if enabled.\n\n---\n\n## Font Configuration\n\nmarkata-go provides flexible font configuration to customize your site's typography without writing CSS.\n\n### Quick Start\n\nAdd custom fonts via Google Fonts:\n\n```toml\n[markata-go.theme.font]\ngoogle_fonts = [\"Inter\", \"Fira Code\"]\nfamily = \"'Inter', sans-serif\"\ncode_family = \"'Fira Code', monospace\"\n```\n\n### Font Options\n\n| Option | Description | Default |\n|--------|-------------|---------|\n| `family` | Body text font | System fonts |\n| `heading_family` | Heading font (inherits from `family` if not set) | Same as `family` |\n| `code_family` | Code/monospace font | System monospace |\n| `size` | Base font size | `16px` |\n| `line_height` | Base line height | `1.6` |\n| `google_fonts` | Array of Google Fonts to load | `[]` |\n| `custom_urls` | Array of custom font CSS URLs | `[]` |\n\n### Using Google Fonts\n\nSpecify fonts to load from Google Fonts:\n\n```toml\n[markata-go.theme.font]\n# Load these fonts from Google Fonts\ngoogle_fonts = [\"Inter\", \"Playfair Display\", \"JetBrains Mono\"]\n\n# Use them in your font families\nfamily = \"'Inter', sans-serif\"\nheading_family = \"'Playfair Display', serif\"\ncode_family = \"'JetBrains Mono', monospace\"\n```\n\nThe `google_fonts` array automatically generates the Google Fonts CSS URL with weights 400, 500, 600, and 700.\n\n### Using Custom Fonts\n\nLoad fonts from any URL:\n\n```toml\n[markata-go.theme.font]\ncustom_urls = [\n  \"https://fonts.example.com/my-font.css\",\n  \"/fonts/local-font.css\"\n]\nfamily = \"'My Custom Font', sans-serif\"\n```\n\n### Typography Variables\n\nFont configuration generates CSS custom properties that you can use in your custom CSS:\n\n| Variable | Description |\n|----------|-------------|\n| `--font-family` | Body text font stack |\n| `--font-heading` | Heading font stack |\n| `--font-code` | Code/monospace font stack |\n| `--font-size` | Base font size |\n| `--line-height` | Base line height |\n\n### Complete Example\n\n```toml\n[markata-go.theme]\npalette = \"catppuccin-mocha\"\n\n[markata-go.theme.font]\n# Google Fonts to load\ngoogle_fonts = [\"Source Sans Pro\", \"Source Serif Pro\", \"Source Code Pro\"]\n\n# Font assignments\nfamily = \"'Source Sans Pro', sans-serif\"\nheading_family = \"'Source Serif Pro', serif\"\ncode_family = \"'Source Code Pro', monospace\"\n\n# Typography settings\nsize = \"18px\"\nline_height = \"1.7\"\n```\n\n### Using Self-Hosted Fonts\n\nFor better performance and privacy, you can self-host fonts:\n\n1. Download font files to `static/fonts/`\n2. Create a CSS file defining `@font-face` rules\n3. Reference it in `custom_urls`\n\n```css\n/* static/fonts/fonts.css */\n@font-face {\n  font-family: 'MyFont';\n  src: url('/fonts/MyFont-Regular.woff2') format('woff2');\n  font-weight: 400;\n}\n\n@font-face {\n  font-family: 'MyFont';\n  src: url('/fonts/MyFont-Bold.woff2') format('woff2');\n  font-weight: 700;\n}\n```\n\n```toml\n[markata-go.theme.font]\ncustom_urls = [\"/fonts/fonts.css\"]\nfamily = \"'MyFont', sans-serif\"\n```\n\n---\n\n## Best Practices\n\n### 1. Start with a Palette\n\nDon't write CSS from scratch. Pick the closest palette and customize from there.\n\n### 2. Use CSS Variables\n\nOverride `--color-*` variables instead of hardcoding colors. This ensures consistency and makes future changes easier.\n\n### 3. Keep Customizations Minimal\n\nThe less you customize, the easier upgrades will be. Only override what you need.\n\n### 4. Test Dark Mode\n\nIf you customize colors, test both light and dark mode to ensure readability.\n\n### 5. Check Accessibility\n\nUse `markata-go palette check` to verify your color choices meet WCAG guidelines.\n\n---\n\n## Troubleshooting\n\n### Styles Not Loading\n\n1. Check that CSS files exist in `public/css/` after building\n2. Verify your browser's network tab shows CSS loading\n3. Clear browser cache and rebuild: `markata-go build`\n\n### Custom CSS Not Applying\n\n1. Ensure `custom_css` path is relative to `static/`\n2. Check for CSS specificity issues (theme styles may override yours)\n3. Use browser dev tools to inspect applied styles\n\n### Template Not Found\n\n1. Verify the template file exists in `templates/`\n2. Check the filename matches exactly (case-sensitive)\n3. Ensure frontmatter `template:` value includes `.html` extension\n\n---\n\n---\n\n## Next Steps\n\nNow that you've styled your site, here are recommended next steps:\n\n**Customize your templates:**\n- [Templates Guide](/docs/guides/templates/) - Modify HTML structure, add custom partials, and use template inheritance\n\n**Organize your content:**\n- [Feeds Guide](/docs/guides/feeds/) - Create filtered collections, archives, and tag pages\n\n**Deploy your site:**\n- [Deployment Guide](/docs/guides/deployment/) - Deploy to GitHub Pages, Netlify, Vercel, or self-host\n\n---\n\n## See Also\n\n- [Keyboard Navigation Guide](/docs/guides/keyboard-navigation/) - Comprehensive keyboard shortcuts for site navigation\n- [Configuration Guide](/docs/guides/configuration/) - All configuration options\n- [Templates Guide](/docs/guides/templates/) - Template syntax and customization\n- [Frontmatter Guide](/docs/guides/frontmatter/) - Post-level configuration\n- [Quick Reference](/docs/guides/quick-reference/) - Theme snippets and CLI commands\n",
      "summary": "Configure color palettes and visual aesthetics for your site's appearance",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "themes",
        "styling",
        "customization",
        "aesthetics"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/templates/",
      "url": "https://markata.dev/docs/guides/templates/",
      "title": "Templates Guide",
      "content_html": "\u003cp\u003emarkata-go uses \u003ca href=\"https://github.com/flosch/pongo2\"\u003epongo2\u003c/a\u003e, a Django/Jinja2-like template engine for Go. This guide covers everything you need to know about creating and customizing templates.\u003c/p\u003e\n\u003ch2 id=\"table-of-contents\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTable of Contents\u003c/span\u003e \u003ca href=\"#table-of-contents\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#overview\"\u003eOverview\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#cached-html-on-warm-builds\"\u003eCached HTML on Warm Builds\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#template-location\"\u003eTemplate Location\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#template-syntax\"\u003eTemplate Syntax\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#available-variables\"\u003eAvailable Variables\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#built-in-filters\"\u003eBuilt-in Filters\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#template-inheritance\"\u003eTemplate Inheritance\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#including-partials\"\u003eIncluding Partials\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#post-vs-feed-templates\"\u003ePost vs Feed Templates\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#custom-templates-per-post\"\u003eCustom Templates Per Post\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#complete-examples\"\u003eComplete Examples\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"overview\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOverview\u003c/span\u003e \u003ca href=\"#overview\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTemplates wrap your rendered Markdown content in HTML layouts. The template system supports:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTemplate inheritance\u003c/strong\u003e - Base templates with extendable blocks\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eIncludes\u003c/strong\u003e - Reusable partial templates\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVariables and expressions\u003c/strong\u003e - Access post, config, and feed data\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eControl flow\u003c/strong\u003e - Conditionals and loops\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFilters\u003c/strong\u003e - Transform data for display\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCustom templates per post\u003c/strong\u003e - Override templates in frontmatter\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePresentation templates\u003c/strong\u003e - Turn markdown into reveal.js slide decks\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"cached-html-on-warm-builds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCached HTML on Warm Builds\u003c/span\u003e \u003ca href=\"#cached-html-on-warm-builds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBoth DAG and legacy warm builds can reuse cached article and full-page HTML.\nRestored HTML preserves the exact cached bytes, without changing your template\noutput. Disk restoration reads directly into string-owned storage, avoiding\nan extra full-page byte buffer and string copy. A small reusable transfer buffer\ndoes not retain or modify the returned HTML.\u003c/p\u003e\n\u003cp\u003eNo configuration changes or cache reset are needed: cache paths, keys and\nfreshness checks are unchanged. Missing or unreadable disk entries fall back to\nrendering rather than returning partial HTML. Once HTML is loaded in memory,\nlater reads in the same build can reuse it without accessing the disk.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"template-location\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Location\u003c/span\u003e \u003ca href=\"#template-location\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTemplates are loaded from these locations (in order of priority):\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eProject templates:\u003c/strong\u003e \u003ccode\u003etemplates/\u003c/code\u003e directory in project root\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTheme templates:\u003c/strong\u003e \u003ccode\u003ethemes/{theme}/templates/\u003c/code\u003e for custom themes\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDefault theme:\u003c/strong\u003e \u003ccode\u003ethemes/default/templates/\u003c/code\u003e as fallback\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre\u003e\u003ccode\u003emy-site/\n├── templates/           # Project templates (highest priority)\n│   ├── base.html\n│   ├── post.html\n│   ├── feed.html\n│   └── partials/\n│       ├── header.html\n│       ├── footer.html\n│       └── card.html\n├── themes/\n│   └── my-theme/\n│       └── templates/   # Theme templates\n└── posts/\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eConfigure the templates directory in \u003ccode\u003emarkata-go.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplates_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;templates\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"template-syntax\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Syntax\u003c/span\u003e \u003ca href=\"#template-syntax\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVariables\u003c/span\u003e \u003ca href=\"#variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAccess data using double curly braces:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Title\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003econfig.URL\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Date\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"attribute-access\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAttribute Access\u003c/span\u003e \u003ca href=\"#attribute-access\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Title\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e              \u003c/span\u003e\u003cspan class=\"c\"\u003e{# Direct attribute access #}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Extra.custom_field\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e{# Nested attributes #}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"filters\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFilters\u003c/span\u003e \u003ca href=\"#filters\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTransform values using the pipe (\u003ccode\u003e|\u003c/code\u003e) operator:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Title\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003eupper\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Description\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003etruncate\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\u003cspan class=\"m\"\u003e160\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Date\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003edate_format\u003c/span\u003e\u003cspan class=\"s2\"\u003e:\u0026#34;January 2, 2006\u0026#34;\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Tags\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003ejoin\u003c/span\u003e\u003cspan class=\"s2\"\u003e:\u0026#34;, \u0026#34;\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.ArticleHTML\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003esafe\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003evalue\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003edefault_if_none\u003c/span\u003e\u003cspan class=\"s2\"\u003e:\u0026#34;N/A\u0026#34;\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"comments\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComments\u003c/span\u003e \u003ca href=\"#comments\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e{# This is a comment and won\u0026#39;t appear in output #}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e{#\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003eMulti-line\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003ecomment\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e#}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"control-flow\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eControl Flow\u003c/span\u003e \u003ca href=\"#control-flow\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"conditionals\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConditionals\u003c/span\u003e \u003ca href=\"#conditionals\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Published\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e    \u0026lt;span class=\u0026#34;status\u0026#34;\u0026gt;Published\u0026lt;/span\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eelif\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Draft\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e    \u0026lt;span class=\u0026#34;status\u0026#34;\u0026gt;Draft\u0026lt;/span\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e    \u0026lt;span class=\u0026#34;status\u0026#34;\u0026gt;Private\u0026lt;/span\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eendif\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"loops\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLoops\u003c/span\u003e \u003ca href=\"#loops\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"nv\"\u003etag\u003c/span\u003e \u003cspan class=\"k\"\u003ein\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Tags\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e    \u0026lt;a href=\u0026#34;/tags/\u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003etag\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003eslugify\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e/\u0026#34;\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003etag\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\u0026lt;/a\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e    \u003c/span\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"k\"\u003enot\u003c/span\u003e \u003cspan class=\"nb\"\u003eforloop\u003c/span\u003e\u003cspan class=\"nv\"\u003e.Last\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e, \u003c/span\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eendif\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eendfor\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"nv\"\u003epost\u003c/span\u003e \u003cspan class=\"k\"\u003ein\u003c/span\u003e \u003cspan class=\"nv\"\u003eposts\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e    \u0026lt;li\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Title\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\u0026lt;/li\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eempty\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e    \u0026lt;li\u0026gt;No posts found\u0026lt;/li\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eendfor\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"loop-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLoop Variables\u003c/span\u003e \u003ca href=\"#loop-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eInside \u003ccode\u003e{% for %}\u003c/code\u003e loops, these variables are available:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eforloop.Counter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCurrent iteration (1-indexed)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eforloop.Counter0\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCurrent iteration (0-indexed)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eforloop.First\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTrue if first iteration\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eforloop.Last\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTrue if last iteration\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eforloop.Revcounter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eIterations remaining (1-indexed)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"available-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAvailable Variables\u003c/span\u003e \u003ca href=\"#available-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"post-context\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePost Context\u003c/span\u003e \u003ca href=\"#post-context\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen rendering individual posts, these variables are available:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003eThe post being rendered\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003ePost title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Slug\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eURL slug\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Href\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRelative URL path (e.g., \u003ccode\u003e/my-post/\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Date\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003etime\u003c/td\u003e\n\u003ctd\u003ePublication date\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Published\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eWhether the post is published\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Draft\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eWhether the post is a draft\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Tags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003eList of tags\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Description\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003ePost description\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Content\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRaw Markdown content\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.ArticleHTML\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRendered HTML content (use with \u003ccode\u003e|safe\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Extra\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003emap\u003c/td\u003e\n\u003ctd\u003eAdditional frontmatter fields\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebody\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRendered article HTML (alias for \u003ccode\u003epost.ArticleHTML\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003eSite configuration\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"config-context\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfig Context\u003c/span\u003e \u003ca href=\"#config-context\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSite configuration is available via \u003ccode\u003econfig\u003c/code\u003e:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig.Title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSite title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig.Description\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSite description\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig.URL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSite base URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig.Author\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSite author\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig.theme.palette\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eActive palette name\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig.theme.fontpack\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eResolved fontpack name (emitted as \u003ccode\u003edata-fontpack\u003c/code\u003e on \u003ccode\u003e\u0026lt;html\u0026gt;\u003c/code\u003e for every page, including feeds)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig.theme.aesthetic\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eAesthetic token set name\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig.theme.texture.kind\u003c/code\u003e / \u003ccode\u003e.scope\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSurface texture dial\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig.theme.text_size\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eEffective text-size preset\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eShorthand aliases are also available:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAlias\u003c/th\u003e\n\u003cth\u003eEquivalent\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esite_title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003econfig.Title\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esite_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003econfig.URL\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esite_description\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003econfig.Description\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esite_author\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003econfig.Author\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"feed-context\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Context\u003c/span\u003e \u003ca href=\"#feed-context\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen rendering feeds/archives, these additional variables are available:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeed\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003eFeed configuration\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeed.Title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eFeed title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeed.Description\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eFeed description\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeed.Slug\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eFeed slug\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeed.Posts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]post\u003c/td\u003e\n\u003ctd\u003eAll posts in the feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epage\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003eCurrent page info\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epage.Number\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eCurrent page number\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epage.Posts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]post\u003c/td\u003e\n\u003ctd\u003ePosts on this page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epage.HasPrev\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eWhether there\u0026rsquo;s a previous page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epage.HasNext\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eWhether there\u0026rsquo;s a next page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epage.PrevURL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eURL to previous page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epage.NextURL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eURL to next page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eposts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]post\u003c/td\u003e\n\u003ctd\u003ePosts on current page (alias for \u003ccode\u003epage.Posts\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"built-in-filters\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuilt-in Filters\u003c/span\u003e \u003ca href=\"#built-in-filters\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe built-in \u003ccode\u003eslides_reveal\u003c/code\u003e filter converts rendered HTML into reveal.js slide sections.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eh2\u003c/code\u003e starts a new horizontal slide\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehr\u003c/code\u003e starts a new horizontal slide, which aligns with the common Markdown \u003ccode\u003e---\u003c/code\u003e slide separator used by reveal.js and Marp\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eh3\u003c/code\u003e starts a new vertical slide under the current horizontal slide\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"date-formatting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDate Formatting\u003c/span\u003e \u003ca href=\"#date-formatting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFilter\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003cth\u003eOutput\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehuman_date\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ date|human_date }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eJan 15, 2024\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edate_format\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ date|date_format:\u0026quot;2006-01-02\u0026quot; }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e2024-01-15\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edate_format\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ date|date_format:\u0026quot;January 2, 2006\u0026quot; }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eJanuary 15, 2024\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erss_date\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ date|rss_date }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRFC 1123Z format for RSS\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eatom_date\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ date|atom_date }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRFC 3339 format for Atom\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eUse \u003ccode\u003ehuman_date\u003c/code\u003e for visible HTML dates so cards, post bylines, archive views, and reader metadata stay consistent while \u003ccode\u003edatetime\u003c/code\u003e attributes remain machine-readable.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eNote:\u003c/strong\u003e Go uses reference time formatting. Common formats:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFormat\u003c/th\u003e\n\u003cth\u003eGo Pattern\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e2024-01-15\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e2006-01-02\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJanuary 15, 2024\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eJanuary 2, 2006\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJan 15, 2024\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eJan 2, 2006\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e15 Jan 2024\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e02 Jan 2006\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2024-01-15T10:30:00Z\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e2006-01-02T15:04:05Z07:00\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"string-manipulation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eString Manipulation\u003c/span\u003e \u003ca href=\"#string-manipulation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFilter\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eslugify\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ \u0026quot;Hello World\u0026quot;|slugify }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOutputs \u003ccode\u003ehello-world\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etruncate\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ text|truncate:100 }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTruncate to 100 characters with ellipsis\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etruncatewords\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ text|truncatewords:20 }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTruncate to 20 words\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eupper\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ text|upper }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConvert to uppercase\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elower\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ text|lower }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConvert to lowercase\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ text|title }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTitle case\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estriptags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ html|striptags }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRemove HTML tags\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"collections\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCollections\u003c/span\u003e \u003ca href=\"#collections\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFilter\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elength\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ list|length }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGet length\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efirst\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ list|first }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGet first element\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elast\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ list|last }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGet last element\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ejoin\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ list|join:\u0026quot;, \u0026quot; }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eJoin with separator\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ereverse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ list|reverse }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReverse order\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esort\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ list|sort }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSort alphabetically\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"html-text\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHTML/Text\u003c/span\u003e \u003ca href=\"#html-text\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFilter\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esafe\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ html|safe }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMark HTML as safe (don\u0026rsquo;t escape)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eescape\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ text|escape }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHTML escape (default behavior)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eplaintext\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ html|plaintext }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConvert HTML to clean plain text (entities decoded, tags stripped, links as footnotes)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esummary\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ post.content|summary:300 }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOne-line, HTML-escaped excerpt for cards: drops code blocks, tables, figures and scripts, strips tags, collapses whitespace, truncates with \u003ccode\u003e…\u003c/code\u003e (default 300 chars). Safe to embed in Markdown via \u003ccode\u003erender_feed\u003c/code\u003e because it never contains blank lines or raw HTML\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epin_preview\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{% with post|pin_preview as preview %}{{ preview.image }} / {{ preview.commentary }}{% endwith %}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCover image and authored commentary from existing post fields and rendered embeds. Makes no metadata requests; see \u003ca href=\"./pins.md\"\u003ePins\u003c/a\u003e for selection rules.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elinebreaks\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ text|linebreaks }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConvert newlines to \u003ccode\u003e\u0026lt;p\u0026gt;\u003c/code\u003e and \u003ccode\u003e\u0026lt;br\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elinebreaksbr\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ text|linebreaksbr }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConvert newlines to \u003ccode\u003e\u0026lt;br\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"urls\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eURLs\u003c/span\u003e \u003ca href=\"#urls\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFilter\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eurlencode\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ path|urlencode }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eURL encode\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eabsolute_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ post.Href|absolute_url:config.URL }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConvert to absolute URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"default-values\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDefault Values\u003c/span\u003e \u003ca href=\"#default-values\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFilter\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edefault_if_none\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ value|default_if_none:\u0026quot;fallback\u0026quot; }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eProvide fallback for nil/empty\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edefault\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ value|default:\u0026quot;fallback\u0026quot; }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003epongo2 built-in default\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"template-inheritance\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Inheritance\u003c/span\u003e \u003ca href=\"#template-inheritance\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTemplate inheritance lets you create a base layout that child templates extend.\u003c/p\u003e\n\u003ch3 id=\"base-template\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBase Template\u003c/span\u003e \u003ca href=\"#base-template\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# templates/base.html #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u0026lt;!DOCTYPE html\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehtml\u003c/span\u003e \u003cspan class=\"na\"\u003elang\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;en\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003echarset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;UTF-8\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;viewport\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;width=device-width, initial-scale=1.0\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{% block title %}{{ config.Title }}{% endblock %}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{% block description %}{{ config.Description }}{% endblock %}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% block head %}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% block header %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eheader\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ config.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/blog/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eBlog\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/about/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAbout\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eheader\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% block content %}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% block footer %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"ni\"\u003e\u0026amp;copy;\u003c/span\u003e {{ config.Author }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% block scripts %}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"extending-the-base\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExtending the Base\u003c/span\u003e \u003ca href=\"#extending-the-base\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# templates/post.html #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% extends \u0026#34;base.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block title %}{{ post.Title }} | {{ config.Title }}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block description %}{{ post.Description|default_if_none:config.Description }}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block head %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:title\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Title }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:type\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;article\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:url\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ config.URL }}{{ post.Href }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.Date %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;article:published_time\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Date|atom_date }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {{ body|safe }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"using-block-super\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing \u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e{{ block.super }}\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#using-block-super\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eInclude parent block content with \u003ccode\u003e{{ block.super }}\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block scripts %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ block.super }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/js/post.js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"including-partials\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIncluding Partials\u003c/span\u003e \u003ca href=\"#including-partials\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePartials are reusable template fragments. Use \u003ccode\u003e{% include %}\u003c/code\u003e to embed them:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% include \u0026#34;partials/header.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% include \u0026#34;partials/card.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% include \u0026#34;partials/footer.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"example-partial-card\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample Partial: Card\u003c/span\u003e \u003ca href=\"#example-partial-card\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# templates/partials/card.html #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Href }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% if post.Extra.cover_image %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Extra.cover_image }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Title }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if post.Description %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Description }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% if post.Date %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e \u003cspan class=\"na\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Date|atom_date }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{ post.Date|human_date }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% if post.Extra.reading_time %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Extra.reading_time }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"example-partial-navigation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample Partial: Navigation\u003c/span\u003e \u003ca href=\"#example-partial-navigation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# templates/partials/nav.html #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;main-nav\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;logo\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ config.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/blog/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eBlog\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/tags/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eTags\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/about/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAbout\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"post-vs-feed-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePost vs Feed Templates\u003c/span\u003e \u003ca href=\"#post-vs-feed-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"post-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePost Templates\u003c/span\u003e \u003ca href=\"#post-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePost templates render individual content pages. They receive the \u003ccode\u003epost\u003c/code\u003e and \u003ccode\u003ebody\u003c/code\u003e variables.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDefault template:\u003c/strong\u003e \u003ccode\u003epost.html\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eFor an image collection, use the built-in \u003ccode\u003egallery.html\u003c/code\u003e template and \u003ccode\u003egallery\u003c/code\u003e frontmatter. See the \u003ca href=\"/docs/guides/galleries/\"\u003ephoto galleries guide\u003c/a\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# templates/post.html #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% extends \u0026#34;base.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block title %}{{ post.Title }} | {{ config.Title }}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eheader\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% if post.Date %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e \u003cspan class=\"na\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Date|atom_date }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{ post.Date|human_date }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% if post.Tags %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;tags\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% for tag in post.Tags %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/tags/{{ tag|slugify }}/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ tag }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eheader\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;content\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {{ body|safe }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"feed-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Templates\u003c/span\u003e \u003ca href=\"#feed-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFeed templates render lists/archives of posts. They receive \u003ccode\u003efeed\u003c/code\u003e, \u003ccode\u003epage\u003c/code\u003e, and \u003ccode\u003eposts\u003c/code\u003e variables.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDefault template:\u003c/strong\u003e \u003ccode\u003efeed.html\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# templates/feed.html #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% extends \u0026#34;base.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block title %}{{ feed.Title }} | {{ config.Title }}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;feed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ feed.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if feed.Description %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ feed.Description }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post-list\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% for post in posts %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% include \u0026#34;partials/card.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if page.HasPrev or page.HasNext %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;pagination\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% if page.HasPrev %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ page.PrevURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;prev\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"ni\"\u003e\u0026amp;larr;\u003c/span\u003e Previous\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ePage {{ page.Number }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% if page.HasNext %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ page.NextURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;next\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eNext \u003cspan class=\"ni\"\u003e\u0026amp;rarr;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"custom-templates-per-post\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Templates Per Post\u003c/span\u003e \u003ca href=\"#custom-templates-per-post\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOverride the default template for specific posts using the \u003ccode\u003etemplate\u003c/code\u003e frontmatter field.\u003c/p\u003e\n\u003ch3 id=\"simple-override\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSimple Override\u003c/span\u003e \u003ca href=\"#simple-override\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Landing Page\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;landing.html\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis post will use \u003ccode\u003etemplates/landing.html\u003c/code\u003e instead of the default \u003ccode\u003epost.html\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"creating-a-slide-deck\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCreating a Slide Deck\u003c/span\u003e \u003ca href=\"#creating-a-slide-deck\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Platform Roadmap\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;slides.html\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e## Opening\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003eIntro slide.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e### Details\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003eVertical follow-up slide.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e## Next Section\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003eslides.html\u003c/code\u003e renders the page as a reveal.js deck. In the default template:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003e##\u003c/code\u003e headings become new horizontal slides.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e###\u003c/code\u003e headings become vertical slides nested under the current horizontal slide.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e---\u003c/code\u003e becomes a horizontal slide break because Markdown renders it as \u003ccode\u003e\u0026lt;hr\u0026gt;\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eReveal assets use local \u003ccode\u003eassets/vendor/revealjs/...\u003c/code\u003e URLs automatically when \u003ccode\u003e[markata-go.assets].mode\u003c/code\u003e is self-hosted or auto and the assets are available. Run \u003ccode\u003emarkata-go assets download\u003c/code\u003e to prefetch them.\u003c/li\u003e\n\u003cli\u003eOn small screens, the deck sizes itself to the current viewport so slides stay readable on phones and after rotation.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"creating-a-landing-page-template\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCreating a Landing Page Template\u003c/span\u003e \u003ca href=\"#creating-a-landing-page-template\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# templates/landing.html #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% extends \u0026#34;base.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block title %}{{ post.Title }}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block header %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# No header on landing page #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;landing\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hero\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% if post.Description %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;tagline\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Description }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;content\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {{ body|safe }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if post.Extra.cta_text %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;cta\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Extra.cta_url }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;button\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{ post.Extra.cta_text }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block footer %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# Minimal footer #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;minimal\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"ni\"\u003e\u0026amp;copy;\u003c/span\u003e {{ config.Author }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"template-fallback\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Fallback\u003c/span\u003e \u003ca href=\"#template-fallback\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf a specified template doesn\u0026rsquo;t exist, markata-go falls back to:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003epost.html\u003c/code\u003e (for posts)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efeed.html\u003c/code\u003e (for feeds)\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"complete-examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComplete Examples\u003c/span\u003e \u003ca href=\"#complete-examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"base-html\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ebase.html\u003c/span\u003e \u003ca href=\"#base-html\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u0026lt;!DOCTYPE html\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehtml\u003c/span\u003e \u003cspan class=\"na\"\u003elang\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;en\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003echarset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;UTF-8\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;viewport\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;width=device-width, initial-scale=1.0\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{% block title %}{{ config.Title }}{% endblock %}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{% block description %}{{ config.Description }}{% endblock %}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {# Open Graph #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:title\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{% block og_title %}{{ config.Title }}{% endblock %}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:description\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{% block og_description %}{{ config.Description }}{% endblock %}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:url\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ config.URL }}{% block og_url %}/{% endblock %}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:site_name\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ config.Title }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {# Feeds #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/rss+xml\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ config.Title }} RSS\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ config.URL }}/blog/rss.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/atom+xml\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ config.Title }} Atom\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ config.URL }}/blog/atom.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {# Styles #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;stylesheet\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/css/style.css\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% block head %}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#main\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;skip-link\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eSkip to content\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% block header %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eheader\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;site-header\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;container\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;logo\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ config.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;main-nav\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/blog/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eBlog\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/tags/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eTags\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/about/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAbout\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eheader\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emain\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;main\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;container\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% block content %}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% block footer %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;site-footer\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;container\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"ni\"\u003e\u0026amp;copy;\u003c/span\u003e {{ config.Author }}. Built with \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://github.com/example/markata-go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003emarkata-go\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% block scripts %}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"post-html\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003epost.html\u003c/span\u003e \u003ca href=\"#post-html\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% extends \u0026#34;base.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block title %}{{ post.Title }} | {{ config.Title }}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block description %}{{ post.Description|default_if_none:config.Description }}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block og_title %}{{ post.Title }}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block og_description %}{{ post.Description|default_if_none:config.Description }}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block og_url %}{{ post.Href }}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block head %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:type\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;article\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.Date %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;article:published_time\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Date|atom_date }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.Tags %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for tag in post.Tags %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;article:tag\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ tag }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# JSON-LD structured data #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/ld+json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;@context\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://schema.org\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;@type\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;BlogPosting\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;headline\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;{{ post.Title }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;{{ post.Description }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;author\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;@type\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Person\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;{{ config.Author }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"o\"\u003e%\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nb\"\u003eDate\u003c/span\u003e \u003cspan class=\"o\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;datePublished\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;{{ post.Date|atom_date }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"o\"\u003e%\u003c/span\u003e \u003cspan class=\"nx\"\u003eendif\u003c/span\u003e \u003cspan class=\"o\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;{{ config.URL }}{{ post.Href }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post h-entry\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eheader\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post-header\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post-title p-name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post-meta\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% if post.Date %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;dt-published\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Date|atom_date }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                {{ post.Date|date_format:\u0026#34;January 2, 2006\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% if post.Extra.reading_time %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reading-time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Extra.reading_time }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% if post.Tags %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post-tags\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% for tag in post.Tags %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/tags/{{ tag|slugify }}/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;tag\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;p-category\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ tag }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eheader\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post-content e-content\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {{ body|safe }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post-footer\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;author-info\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eWritten by\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/about/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;p-author h-card\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;author\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ config.Author }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% if post.Extra.prev or post.Extra.next %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post-nav\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% if post.Extra.prev %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Extra.prev.Href }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;prev\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;prev\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"ni\"\u003e\u0026amp;larr;\u003c/span\u003e Previous\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Extra.prev.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% if post.Extra.next %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Extra.next.Href }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;next\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;next\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eNext \u003cspan class=\"ni\"\u003e\u0026amp;rarr;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Extra.next.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"feed-html\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003efeed.html\u003c/span\u003e \u003ca href=\"#feed-html\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% extends \u0026#34;base.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block title %}{{ feed.Title }} | {{ config.Title }}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block description %}{{ feed.Description|default_if_none:config.Description }}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block og_title %}{{ feed.Title }}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block og_url %}/{{ feed.Slug }}/{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block head %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:type\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;website\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;feed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eheader\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;feed-header\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ feed.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% if feed.Description %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;feed-description\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ feed.Description }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eheader\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if posts|length \u0026gt; 0 %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post-list\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% for post in posts %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post-item\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card h-entry\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card-title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.href }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;p-name u-url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                {% if post.description %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card-description p-summary\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.description }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card-meta\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    {% if post.date %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;dt-published\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.date|atom_date }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        {{ post.date|date_format:\u0026#34;Jan 2, 2006\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    {% if post.tags %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card-tags\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        {% for tag in post.tags %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/tags/{{ tag|slugify }}/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ tag }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if page.HasPrev or page.HasNext %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;pagination\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003earia-label\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Pagination\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% if page.HasPrev %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ page.PrevURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;pagination-prev\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;prev\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"ni\"\u003e\u0026amp;larr;\u003c/span\u003e Newer Posts\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;pagination-prev disabled\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"ni\"\u003e\u0026amp;larr;\u003c/span\u003e Newer Posts\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;pagination-info\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ePage {{ page.Number }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% if page.HasNext %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ page.NextURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;pagination-next\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;next\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            Older Posts \u003cspan class=\"ni\"\u003e\u0026amp;rarr;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;pagination-next disabled\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eOlder Posts \u003cspan class=\"ni\"\u003e\u0026amp;rarr;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;no-posts\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eNo posts found.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"card-media-helpers\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCard Media Helpers\u003c/span\u003e \u003ca href=\"#card-media-helpers\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOG, feed, and embed cards share the same media helpers so the image/video preview feels identical everywhere. When rendering card media:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePass the URL through \u003ccode\u003ewith_size(width, height)\u003c/code\u003e so the helper appends explicit \u003ccode\u003ew\u003c/code\u003e and \u003ccode\u003eh\u003c/code\u003e query parameters that match the printed dimensions of the card. Correct query params keep downstream screenshotters and feed readers aligned with the rendered size. Trusted media URLs are normalized to \u003ccode\u003ehttps\u003c/code\u003e first so browser pages do not hit mixed-content errors.\u003c/li\u003e\n\u003cli\u003eFor trusted remote image hosts that support width-based resizing, use \u003ccode\u003eresponsive_srcset\u003c/code\u003e with candidate widths and a matching \u003ccode\u003esizes\u003c/code\u003e attribute so browsers download an image close to the rendered size. For lazy images with variable layouts, \u003ccode\u003esizes=\u0026quot;auto, ...fallback...\u0026quot;\u003c/code\u003e uses the measured width when supported. The filter skips local paths and unknown hosts; use \u003ccode\u003eimage_optimization\u003c/code\u003e for local files. Use \u003ccode\u003eoriginal_media_url\u003c/code\u003e for a deferred lightbox URL when the reader should open the original image.\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003emedia_url\u003c/code\u003e when you only need the first non-empty media field or a search thumbnail URL. It keeps trusted media URLs on \u003ccode\u003ehttps\u003c/code\u003e without adding sizing parameters.\u003c/li\u003e\n\u003cli\u003eUse the fragment/query-safe \u003ccode\u003eis_video\u003c/code\u003e filter to decide between \u003ccode\u003e\u0026lt;video\u0026gt;\u003c/code\u003e and \u003ccode\u003e\u0026lt;img\u0026gt;\u003c/code\u003e, and call \u003ccode\u003eposter_url(post)\u003c/code\u003e to resolve the poster. \u003ccode\u003eposter_url\u003c/code\u003e enforces the alias precedence (\u003ccode\u003eposter_image\u003c/code\u003e, \u003ccode\u003eposter\u003c/code\u003e, \u003ccode\u003evideo_poster\u003c/code\u003e, \u003ccode\u003evideo_thumbnail\u003c/code\u003e, \u003ccode\u003ethumbnail\u003c/code\u003e, \u003ccode\u003ethumb\u003c/code\u003e) before falling back to deriving a \u003ccode\u003e.webp\u003c/code\u003e thumbnail from the video URL when the host is trusted.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eOnly relative URLs and hosts on the default allowlist (\u003ccode\u003edropper.wayl.one\u003c/code\u003e, \u003ccode\u003edropper.waylonwalker.com\u003c/code\u003e, \u003ccode\u003edropper-dev.wayl.one\u003c/code\u003e) gain the sizing parameters and derived posters. Override or extend the list via \u003ccode\u003e[markata-go.templates.media]\u003c/code\u003e in your configuration when you use a different CDN. If you need to opt out, you can skip these filters in your custom template, but keep alias resolution and sizing in sync across OG/feed/embed templates so the published meta stays consistent.\u003c/p\u003e\n\u003ch3 id=\"partials-card-html\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003epartials/card.html\u003c/span\u003e \u003ca href=\"#partials-card-html\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card h-entry\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if post.cover_image %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.href }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card-image\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.cover_image }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.title }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card-body\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card-title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.href }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;p-name u-url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% if post.description %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card-description p-summary\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{ post.description|truncate:160 }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card-footer\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% if post.date %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;dt-published\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.date|atom_date }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                {{ post.date|date_format:\u0026#34;Jan 2, 2006\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% if post.reading_time %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reading-time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.reading_time }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% if post.tags %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card-tags\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                {% for tag in post.tags|slice:\u0026#34;:3\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/tags/{{ tag|slugify }}/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;p-category\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ tag }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"partials-header-html\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003epartials/header.html\u003c/span\u003e \u003ca href=\"#partials-header-html\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eheader\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;site-header\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;container\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;site-logo\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% if config.Extra.logo %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ config.Extra.logo }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ config.Title }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{ config.Title }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;main-nav\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003earia-label\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Main navigation\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ebutton\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;nav-toggle\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003earia-expanded\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;false\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003earia-controls\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;nav-menu\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;sr-only\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eMenu\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hamburger\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ebutton\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;nav-menu\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;nav-menu\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eHome\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/blog/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eBlog\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/tags/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eTags\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/about/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAbout\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eheader\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"partials-footer-html\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003epartials/footer.html\u003c/span\u003e \u003ca href=\"#partials-footer-html\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;site-footer\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;container\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;footer-content\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;footer-section\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ config.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ config.Description }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;footer-section\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eLinks\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/blog/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eBlog\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/tags/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eTags\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/about/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAbout\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;footer-section\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eSubscribe\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/blog/rss.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eRSS Feed\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/blog/atom.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAtom Feed\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/blog/feed.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eJSON Feed\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;footer-bottom\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"ni\"\u003e\u0026amp;copy;\u003c/span\u003e {{ config.Author }}. Built with \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://github.com/example/markata-go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003emarkata-go\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"microformats2-support\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMicroformats2 Support\u003c/span\u003e \u003ca href=\"#microformats2-support\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go\u0026rsquo;s default templates include \u003ca href=\"https://microformats.org/wiki/microformats2\"\u003eMicroformats2\u003c/a\u003e markup for better interoperability with IndieWeb tools and feed readers.\u003c/p\u003e\n\u003ch3 id=\"h-entry-on-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eh-entry on Posts\u003c/span\u003e \u003ca href=\"#h-entry-on-posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSingle post pages include \u003ccode\u003eh-entry\u003c/code\u003e markup on the \u003ccode\u003e\u0026lt;article\u0026gt;\u003c/code\u003e element:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post h-entry\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;u-url\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com/my-post/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehidden\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eheader\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;p-name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ePost Title\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;dt-published\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;2024-01-15T00:00:00Z\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eJanuary 15, 2024\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;p-author h-card\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehidden\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;u-url p-name\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAuthor Name\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eheader\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post-content e-content\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c\"\u003e\u0026lt;!-- rendered content --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;tags\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;p-category\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/tags/topic/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003etopic\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eProperties used:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eh-entry\u003c/code\u003e - Entry/post container\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ep-name\u003c/code\u003e - Post title\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eu-url\u003c/code\u003e - Canonical permalink\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edt-published\u003c/code\u003e - Publication date\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ee-content\u003c/code\u003e - Entry content (HTML)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ep-summary\u003c/code\u003e - Post description/excerpt\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ep-category\u003c/code\u003e - Tags/categories\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ep-author h-card\u003c/code\u003e - Author information\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"h-feed-on-listings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eh-feed on Listings\u003c/span\u003e \u003ca href=\"#h-feed-on-listings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFeed and listing pages include \u003ccode\u003eh-feed\u003c/code\u003e markup:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;feed h-feed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;p-name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eBlog Posts\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;p-summary\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAll blog posts\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;p-author h-card\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehidden\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;u-url p-name\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eSite Author\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c\"\u003e\u0026lt;!-- Each card is an h-entry --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card h-entry\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e...\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"card-types\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCard Types\u003c/span\u003e \u003ca href=\"#card-types\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAll card templates include appropriate microformat classes:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCard Type\u003c/th\u003e\n\u003cth\u003eKey Classes\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003earticle-card\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eh-entry\u003c/code\u003e, \u003ccode\u003ep-name\u003c/code\u003e, \u003ccode\u003eu-url\u003c/code\u003e, \u003ccode\u003ep-summary\u003c/code\u003e, \u003ccode\u003edt-published\u003c/code\u003e, \u003ccode\u003ep-category\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003enote-card\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eh-entry\u003c/code\u003e, \u003ccode\u003ep-content\u003c/code\u003e, \u003ccode\u003edt-published\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ephoto-card\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eh-entry\u003c/code\u003e, \u003ccode\u003eu-photo\u003c/code\u003e, \u003ccode\u003eu-video\u003c/code\u003e, \u003ccode\u003ep-name\u003c/code\u003e, \u003ccode\u003ep-summary\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003evideo-card\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eh-entry\u003c/code\u003e, \u003ccode\u003eu-photo\u003c/code\u003e (thumbnail), \u003ccode\u003ep-name\u003c/code\u003e, \u003ccode\u003ep-summary\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003elink-card\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eh-entry\u003c/code\u003e, \u003ccode\u003eu-bookmark-of\u003c/code\u003e, \u003ccode\u003ep-name\u003c/code\u003e, \u003ccode\u003ep-summary\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003equote-card\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eh-entry\u003c/code\u003e, \u003ccode\u003ee-content\u003c/code\u003e, \u003ccode\u003eh-cite\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eguide-card\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eh-entry\u003c/code\u003e, \u003ccode\u003ep-name\u003c/code\u003e, \u003ccode\u003eu-url\u003c/code\u003e, \u003ccode\u003ep-summary\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003einline-card\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eh-entry\u003c/code\u003e, \u003ccode\u003ee-content\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"validation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eValidation\u003c/span\u003e \u003ca href=\"#validation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTest your microformats with:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://indiewebify.me/\"\u003eIndieWebify.me\u003c/a\u003e - Validate h-entry markup\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://pin13.net/mf2/\"\u003ePin13\u003c/a\u003e - Parse and view microformats\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"text-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eText Templates\u003c/span\u003e \u003ca href=\"#text-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go generates \u003ccode\u003e.txt\u003c/code\u003e versions of posts for consumers that need plain text (LLMs, CLI tools, accessibility readers, etc.). Text templates require special handling because pongo2 auto-escapes all \u003ccode\u003e{{ }}\u003c/code\u003e output by default, which would produce HTML entities (\u003ccode\u003e\u0026amp;amp;\u003c/code\u003e, \u003ccode\u003e\u0026amp;lt;\u003c/code\u003e) in plain text files.\u003c/p\u003e\n\u003ch3 id=\"the-plaintext-filter\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe \u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003eplaintext\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e Filter\u003c/span\u003e \u003ca href=\"#the-plaintext-filter\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse \u003ccode\u003e|plaintext\u003c/code\u003e for any variable that contains HTML content (like rendered Markdown):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.content\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003eplaintext\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis filter:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eStrips all HTML tags\u003c/li\u003e\n\u003cli\u003eDecodes HTML entities to literal characters\u003c/li\u003e\n\u003cli\u003eConverts \u003ccode\u003e\u0026lt;a href=\u0026quot;...\u0026quot;\u0026gt;\u003c/code\u003e links to footnote-style references\u003c/li\u003e\n\u003cli\u003eMarks the output as safe so pongo2 won\u0026rsquo;t re-escape it\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"the-safe-filter-for-metadata\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe \u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003esafe\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e Filter for Metadata\u003c/span\u003e \u003ca href=\"#the-safe-filter-for-metadata\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor plain text strings that never contain HTML (like title and description), use \u003ccode\u003e|safe\u003c/code\u003e to prevent auto-escaping:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.title\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003esafe\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.description\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003esafe\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"example-default-txt\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample: default.txt\u003c/span\u003e \u003ca href=\"#example-default-txt\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003ebody\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003esafe\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"example-default-ansi\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample: default.ansi\u003c/span\u003e \u003ca href=\"#example-default-ansi\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003ebody\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003esafe\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor terminal output templates, \u003ccode\u003ebody\u003c/code\u003e contains the fully rendered terminal page for the selected format. \u003ccode\u003edefault.txt\u003c/code\u003e uses the plain terminal renderer, while \u003ccode\u003edefault.ansi\u003c/code\u003e uses the ANSI-styled renderer.\u003c/p\u003e\n\u003ch3 id=\"link-footnotes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLink Footnotes\u003c/span\u003e \u003ca href=\"#link-footnotes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eLinks in HTML content are converted to numbered footnote references:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eRead the Go docs [1] for more info. See also the\nGo blog [2] for tutorials.\n\nReferences:\n[1]: https://go.dev/doc/\n[2]: https://go.dev/blog/\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eDuplicate URLs reuse the same reference number. When link text is the same as the URL, no footnote marker is added.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"tips-and-best-practices\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTips and Best Practices\u003c/span\u003e \u003ca href=\"#tips-and-best-practices\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eAlways use \u003ccode\u003e|safe\u003c/code\u003e for HTML content\u003c/strong\u003e - When outputting rendered HTML (like \u003ccode\u003ebody\u003c/code\u003e or \u003ccode\u003epost.ArticleHTML\u003c/code\u003e), use the \u003ccode\u003esafe\u003c/code\u003e filter to prevent double-escaping.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eProvide fallbacks with \u003ccode\u003edefault_if_none\u003c/code\u003e\u003c/strong\u003e - Use fallback values for optional fields to avoid empty output.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUse template inheritance\u003c/strong\u003e - Create a solid \u003ccode\u003ebase.html\u003c/code\u003e and extend it for consistency across your site.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eKeep partials small and focused\u003c/strong\u003e - Each partial should do one thing well.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUse semantic HTML\u003c/strong\u003e - Include appropriate ARIA attributes and semantic elements for accessibility.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eAdd microformats\u003c/strong\u003e - Include h-entry, h-card, and other microformats for better interoperability.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCache considerations\u003c/strong\u003e - Templates are cached for performance. Clear the cache during development if changes don\u0026rsquo;t appear.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[[configuration-guide|Configuration Guide]] - Configure template settings\u003c/li\u003e\n\u003cli\u003e[[feeds-guide|Feeds Guide]] - Learn about the feed system\u003c/li\u003e\n\u003cli\u003e[[themes-and-styling|Themes Guide]] - Create and customize themes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/flosch/pongo2\"\u003epongo2 Documentation\u003c/a\u003e - Full template engine reference\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nmarkata-go uses [pongo2](https://github.com/flosch/pongo2), a Django/Jinja2-like template engine for Go. This guide covers everything you need to know about creating and customizing templates.\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Cached HTML on Warm Builds](#cached-html-on-warm-builds)\n- [Template Location](#template-location)\n- [Template Syntax](#template-syntax)\n- [Available Variables](#available-variables)\n- [Built-in Filters](#built-in-filters)\n- [Template Inheritance](#template-inheritance)\n- [Including Partials](#including-partials)\n- [Post vs Feed Templates](#post-vs-feed-templates)\n- [Custom Templates Per Post](#custom-templates-per-post)\n- [Complete Examples](#complete-examples)\n\n---\n\n## Overview\n\nTemplates wrap your rendered Markdown content in HTML layouts. The template system supports:\n\n- **Template inheritance** - Base templates with extendable blocks\n- **Includes** - Reusable partial templates\n- **Variables and expressions** - Access post, config, and feed data\n- **Control flow** - Conditionals and loops\n- **Filters** - Transform data for display\n- **Custom templates per post** - Override templates in frontmatter\n- **Presentation templates** - Turn markdown into reveal.js slide decks\n\n---\n\n## Cached HTML on Warm Builds\n\nBoth DAG and legacy warm builds can reuse cached article and full-page HTML.\nRestored HTML preserves the exact cached bytes, without changing your template\noutput. Disk restoration reads directly into string-owned storage, avoiding\nan extra full-page byte buffer and string copy. A small reusable transfer buffer\ndoes not retain or modify the returned HTML.\n\nNo configuration changes or cache reset are needed: cache paths, keys and\nfreshness checks are unchanged. Missing or unreadable disk entries fall back to\nrendering rather than returning partial HTML. Once HTML is loaded in memory,\nlater reads in the same build can reuse it without accessing the disk.\n\n---\n\n## Template Location\n\nTemplates are loaded from these locations (in order of priority):\n\n1. **Project templates:** `templates/` directory in project root\n2. **Theme templates:** `themes/{theme}/templates/` for custom themes\n3. **Default theme:** `themes/default/templates/` as fallback\n\n```\nmy-site/\n├── templates/           # Project templates (highest priority)\n│   ├── base.html\n│   ├── post.html\n│   ├── feed.html\n│   └── partials/\n│       ├── header.html\n│       ├── footer.html\n│       └── card.html\n├── themes/\n│   └── my-theme/\n│       └── templates/   # Theme templates\n└── posts/\n```\n\nConfigure the templates directory in `markata-go.toml`:\n\n```toml\n[markata-go]\ntemplates_dir = \"templates\"\n```\n\n---\n\n## Template Syntax\n\n### Variables\n\nAccess data using double curly braces:\n\n```django\n{{ post.Title }}\n{{ config.URL }}\n{{ post.Date }}\n```\n\n### Attribute Access\n\n```django\n{{ post.Title }}              {# Direct attribute access #}\n{{ post.Extra.custom_field }} {# Nested attributes #}\n```\n\n### Filters\n\nTransform values using the pipe (`|`) operator:\n\n```django\n{{ post.Title|upper }}\n{{ post.Description|truncate:160 }}\n{{ post.Date|date_format:\"January 2, 2006\" }}\n{{ post.Tags|join:\", \" }}\n{{ post.ArticleHTML|safe }}\n{{ value|default_if_none:\"N/A\" }}\n```\n\n### Comments\n\n```django\n{# This is a comment and won't appear in output #}\n\n{#\nMulti-line\ncomment\n#}\n```\n\n### Control Flow\n\n#### Conditionals\n\n```django\n{% if post.Published %}\n    \u003cspan class=\"status\"\u003ePublished\u003c/span\u003e\n{% elif post.Draft %}\n    \u003cspan class=\"status\"\u003eDraft\u003c/span\u003e\n{% else %}\n    \u003cspan class=\"status\"\u003ePrivate\u003c/span\u003e\n{% endif %}\n```\n\n#### Loops\n\n```django\n{% for tag in post.Tags %}\n    \u003ca href=\"/tags/{{ tag|slugify }}/\"\u003e{{ tag }}\u003c/a\u003e\n    {% if not forloop.Last %}, {% endif %}\n{% endfor %}\n\n{% for post in posts %}\n    \u003cli\u003e{{ post.Title }}\u003c/li\u003e\n{% empty %}\n    \u003cli\u003eNo posts found\u003c/li\u003e\n{% endfor %}\n```\n\n#### Loop Variables\n\nInside `{% for %}` loops, these variables are available:\n\n| Variable | Description |\n|----------|-------------|\n| `forloop.Counter` | Current iteration (1-indexed) |\n| `forloop.Counter0` | Current iteration (0-indexed) |\n| `forloop.First` | True if first iteration |\n| `forloop.Last` | True if last iteration |\n| `forloop.Revcounter` | Iterations remaining (1-indexed) |\n\n---\n\n## Available Variables\n\n### Post Context\n\nWhen rendering individual posts, these variables are available:\n\n| Variable | Type | Description |\n|----------|------|-------------|\n| `post` | object | The post being rendered |\n| `post.Title` | string | Post title |\n| `post.Slug` | string | URL slug |\n| `post.Href` | string | Relative URL path (e.g., `/my-post/`) |\n| `post.Date` | time | Publication date |\n| `post.Published` | bool | Whether the post is published |\n| `post.Draft` | bool | Whether the post is a draft |\n| `post.Tags` | []string | List of tags |\n| `post.Description` | string | Post description |\n| `post.Content` | string | Raw Markdown content |\n| `post.ArticleHTML` | string | Rendered HTML content (use with `\\|safe`) |\n| `post.Extra` | map | Additional frontmatter fields |\n| `body` | string | Rendered article HTML (alias for `post.ArticleHTML`) |\n| `config` | object | Site configuration |\n\n### Config Context\n\nSite configuration is available via `config`:\n\n| Variable | Type | Description |\n|----------|------|-------------|\n| `config.Title` | string | Site title |\n| `config.Description` | string | Site description |\n| `config.URL` | string | Site base URL |\n| `config.Author` | string | Site author |\n| `config.theme.palette` | string | Active palette name |\n| `config.theme.fontpack` | string | Resolved fontpack name (emitted as `data-fontpack` on `\u003chtml\u003e` for every page, including feeds) |\n| `config.theme.aesthetic` | string | Aesthetic token set name |\n| `config.theme.texture.kind` / `.scope` | string | Surface texture dial |\n| `config.theme.text_size` | string | Effective text-size preset |\n\nShorthand aliases are also available:\n\n| Alias | Equivalent |\n|-------|------------|\n| `site_title` | `config.Title` |\n| `site_url` | `config.URL` |\n| `site_description` | `config.Description` |\n| `site_author` | `config.Author` |\n\n### Feed Context\n\nWhen rendering feeds/archives, these additional variables are available:\n\n| Variable | Type | Description |\n|----------|------|-------------|\n| `feed` | object | Feed configuration |\n| `feed.Title` | string | Feed title |\n| `feed.Description` | string | Feed description |\n| `feed.Slug` | string | Feed slug |\n| `feed.Posts` | []post | All posts in the feed |\n| `page` | object | Current page info |\n| `page.Number` | int | Current page number |\n| `page.Posts` | []post | Posts on this page |\n| `page.HasPrev` | bool | Whether there's a previous page |\n| `page.HasNext` | bool | Whether there's a next page |\n| `page.PrevURL` | string | URL to previous page |\n| `page.NextURL` | string | URL to next page |\n| `posts` | []post | Posts on current page (alias for `page.Posts`) |\n\n---\n\n## Built-in Filters\n\nThe built-in `slides_reveal` filter converts rendered HTML into reveal.js slide sections.\n\n- `h2` starts a new horizontal slide\n- `hr` starts a new horizontal slide, which aligns with the common Markdown `---` slide separator used by reveal.js and Marp\n- `h3` starts a new vertical slide under the current horizontal slide\n\n### Date Formatting\n\n| Filter | Example | Output |\n|--------|---------|--------|\n| `human_date` | `{{ date\\|human_date }}` | `Jan 15, 2024` |\n| `date_format` | `{{ date\\|date_format:\"2006-01-02\" }}` | `2024-01-15` |\n| `date_format` | `{{ date\\|date_format:\"January 2, 2006\" }}` | `January 15, 2024` |\n| `rss_date` | `{{ date\\|rss_date }}` | RFC 1123Z format for RSS |\n| `atom_date` | `{{ date\\|atom_date }}` | RFC 3339 format for Atom |\n\nUse `human_date` for visible HTML dates so cards, post bylines, archive views, and reader metadata stay consistent while `datetime` attributes remain machine-readable.\n\n**Note:** Go uses reference time formatting. Common formats:\n\n| Format | Go Pattern |\n|--------|-----------|\n| 2024-01-15 | `2006-01-02` |\n| January 15, 2024 | `January 2, 2006` |\n| Jan 15, 2024 | `Jan 2, 2006` |\n| 15 Jan 2024 | `02 Jan 2006` |\n| 2024-01-15T10:30:00Z | `2006-01-02T15:04:05Z07:00` |\n\n### String Manipulation\n\n| Filter | Example | Description |\n|--------|---------|-------------|\n| `slugify` | `{{ \"Hello World\"\\|slugify }}` | Outputs `hello-world` |\n| `truncate` | `{{ text\\|truncate:100 }}` | Truncate to 100 characters with ellipsis |\n| `truncatewords` | `{{ text\\|truncatewords:20 }}` | Truncate to 20 words |\n| `upper` | `{{ text\\|upper }}` | Convert to uppercase |\n| `lower` | `{{ text\\|lower }}` | Convert to lowercase |\n| `title` | `{{ text\\|title }}` | Title case |\n| `striptags` | `{{ html\\|striptags }}` | Remove HTML tags |\n\n### Collections\n\n| Filter | Example | Description |\n|--------|---------|-------------|\n| `length` | `{{ list\\|length }}` | Get length |\n| `first` | `{{ list\\|first }}` | Get first element |\n| `last` | `{{ list\\|last }}` | Get last element |\n| `join` | `{{ list\\|join:\", \" }}` | Join with separator |\n| `reverse` | `{{ list\\|reverse }}` | Reverse order |\n| `sort` | `{{ list\\|sort }}` | Sort alphabetically |\n\n### HTML/Text\n\n| Filter | Example | Description |\n|--------|---------|-------------|\n| `safe` | `{{ html\\|safe }}` | Mark HTML as safe (don't escape) |\n| `escape` | `{{ text\\|escape }}` | HTML escape (default behavior) |\n| `plaintext` | `{{ html\\|plaintext }}` | Convert HTML to clean plain text (entities decoded, tags stripped, links as footnotes) |\n| `summary` | `{{ post.content\\|summary:300 }}` | One-line, HTML-escaped excerpt for cards: drops code blocks, tables, figures and scripts, strips tags, collapses whitespace, truncates with `…` (default 300 chars). Safe to embed in Markdown via `render_feed` because it never contains blank lines or raw HTML |\n| `pin_preview` | `{% with post\\|pin_preview as preview %}{{ preview.image }} / {{ preview.commentary }}{% endwith %}` | Cover image and authored commentary from existing post fields and rendered embeds. Makes no metadata requests; see [Pins](./pins.md) for selection rules. |\n| `linebreaks` | `{{ text\\|linebreaks }}` | Convert newlines to `\u003cp\u003e` and `\u003cbr\u003e` |\n| `linebreaksbr` | `{{ text\\|linebreaksbr }}` | Convert newlines to `\u003cbr\u003e` |\n\n### URLs\n\n| Filter | Example | Description |\n|--------|---------|-------------|\n| `urlencode` | `{{ path\\|urlencode }}` | URL encode |\n| `absolute_url` | `{{ post.Href\\|absolute_url:config.URL }}` | Convert to absolute URL |\n\n### Default Values\n\n| Filter | Example | Description |\n|--------|---------|-------------|\n| `default_if_none` | `{{ value\\|default_if_none:\"fallback\" }}` | Provide fallback for nil/empty |\n| `default` | `{{ value\\|default:\"fallback\" }}` | pongo2 built-in default |\n\n---\n\n## Template Inheritance\n\nTemplate inheritance lets you create a base layout that child templates extend.\n\n### Base Template\n\n```html\n{# templates/base.html #}\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"en\"\u003e\n\u003chead\u003e\n    \u003cmeta charset=\"UTF-8\"\u003e\n    \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u003e\n    \u003ctitle\u003e{% block title %}{{ config.Title }}{% endblock %}\u003c/title\u003e\n    \u003cmeta name=\"description\" content=\"{% block description %}{{ config.Description }}{% endblock %}\"\u003e\n    {% block head %}{% endblock %}\n\u003c/head\u003e\n\u003cbody\u003e\n    {% block header %}\n    \u003cheader\u003e\n        \u003cnav\u003e\n            \u003ca href=\"/\"\u003e{{ config.Title }}\u003c/a\u003e\n            \u003ca href=\"/blog/\"\u003eBlog\u003c/a\u003e\n            \u003ca href=\"/about/\"\u003eAbout\u003c/a\u003e\n        \u003c/nav\u003e\n    \u003c/header\u003e\n    {% endblock %}\n\n    \u003cmain\u003e\n        {% block content %}{% endblock %}\n    \u003c/main\u003e\n\n    {% block footer %}\n    \u003cfooter\u003e\n        \u003cp\u003e\u0026copy; {{ config.Author }}\u003c/p\u003e\n    \u003c/footer\u003e\n    {% endblock %}\n\n    {% block scripts %}{% endblock %}\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n### Extending the Base\n\n```html\n{# templates/post.html #}\n{% extends \"base.html\" %}\n\n{% block title %}{{ post.Title }} | {{ config.Title }}{% endblock %}\n\n{% block description %}{{ post.Description|default_if_none:config.Description }}{% endblock %}\n\n{% block head %}\n\u003cmeta property=\"og:title\" content=\"{{ post.Title }}\"\u003e\n\u003cmeta property=\"og:type\" content=\"article\"\u003e\n\u003cmeta property=\"og:url\" content=\"{{ config.URL }}{{ post.Href }}\"\u003e\n{% if post.Date %}\n\u003cmeta property=\"article:published_time\" content=\"{{ post.Date|atom_date }}\"\u003e\n{% endif %}\n{% endblock %}\n\n{% block content %}\n\u003carticle\u003e\n    {{ body|safe }}\n\u003c/article\u003e\n{% endblock %}\n```\n\n### Using `{{ block.super }}`\n\nInclude parent block content with `{{ block.super }}`:\n\n```html\n{% block scripts %}\n{{ block.super }}\n\u003cscript src=\"/js/post.js\"\u003e\u003c/script\u003e\n{% endblock %}\n```\n\n---\n\n## Including Partials\n\nPartials are reusable template fragments. Use `{% include %}` to embed them:\n\n```html\n{% include \"partials/header.html\" %}\n{% include \"partials/card.html\" %}\n{% include \"partials/footer.html\" %}\n```\n\n### Example Partial: Card\n\n```html\n{# templates/partials/card.html #}\n\u003carticle class=\"card\"\u003e\n    \u003ca href=\"{{ post.Href }}\"\u003e\n        {% if post.Extra.cover_image %}\n        \u003cimg src=\"{{ post.Extra.cover_image }}\" alt=\"{{ post.Title }}\"\u003e\n        {% endif %}\n        \u003ch2\u003e{{ post.Title }}\u003c/h2\u003e\n    \u003c/a\u003e\n    {% if post.Description %}\n    \u003cp\u003e{{ post.Description }}\u003c/p\u003e\n    {% endif %}\n    \u003cfooter\u003e\n        {% if post.Date %}\n        \u003ctime datetime=\"{{ post.Date|atom_date }}\"\u003e\n            {{ post.Date|human_date }}\n        \u003c/time\u003e\n        {% endif %}\n        {% if post.Extra.reading_time %}\n        \u003cspan\u003e{{ post.Extra.reading_time }}\u003c/span\u003e\n        {% endif %}\n    \u003c/footer\u003e\n\u003c/article\u003e\n```\n\n### Example Partial: Navigation\n\n```html\n{# templates/partials/nav.html #}\n\u003cnav class=\"main-nav\"\u003e\n    \u003ca href=\"/\" class=\"logo\"\u003e{{ config.Title }}\u003c/a\u003e\n    \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"/blog/\"\u003eBlog\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"/tags/\"\u003eTags\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"/about/\"\u003eAbout\u003c/a\u003e\u003c/li\u003e\n    \u003c/ul\u003e\n\u003c/nav\u003e\n```\n\n---\n\n## Post vs Feed Templates\n\n### Post Templates\n\nPost templates render individual content pages. They receive the `post` and `body` variables.\n\n**Default template:** `post.html`\n\nFor an image collection, use the built-in `gallery.html` template and `gallery` frontmatter. See the [photo galleries guide](/docs/guides/galleries/).\n\n```html\n{# templates/post.html #}\n{% extends \"base.html\" %}\n\n{% block title %}{{ post.Title }} | {{ config.Title }}{% endblock %}\n\n{% block content %}\n\u003carticle class=\"post\"\u003e\n    \u003cheader\u003e\n        \u003ch1\u003e{{ post.Title }}\u003c/h1\u003e\n        {% if post.Date %}\n        \u003ctime datetime=\"{{ post.Date|atom_date }}\"\u003e\n            {{ post.Date|human_date }}\n        \u003c/time\u003e\n        {% endif %}\n\n        {% if post.Tags %}\n        \u003cul class=\"tags\"\u003e\n            {% for tag in post.Tags %}\n            \u003cli\u003e\u003ca href=\"/tags/{{ tag|slugify }}/\"\u003e{{ tag }}\u003c/a\u003e\u003c/li\u003e\n            {% endfor %}\n        \u003c/ul\u003e\n        {% endif %}\n    \u003c/header\u003e\n\n    \u003cdiv class=\"content\"\u003e\n        {{ body|safe }}\n    \u003c/div\u003e\n\u003c/article\u003e\n{% endblock %}\n```\n\n### Feed Templates\n\nFeed templates render lists/archives of posts. They receive `feed`, `page`, and `posts` variables.\n\n**Default template:** `feed.html`\n\n```html\n{# templates/feed.html #}\n{% extends \"base.html\" %}\n\n{% block title %}{{ feed.Title }} | {{ config.Title }}{% endblock %}\n\n{% block content %}\n\u003csection class=\"feed\"\u003e\n    \u003ch1\u003e{{ feed.Title }}\u003c/h1\u003e\n    {% if feed.Description %}\n    \u003cp class=\"description\"\u003e{{ feed.Description }}\u003c/p\u003e\n    {% endif %}\n\n    \u003cul class=\"post-list\"\u003e\n        {% for post in posts %}\n        \u003cli\u003e\n            {% include \"partials/card.html\" %}\n        \u003c/li\u003e\n        {% endfor %}\n    \u003c/ul\u003e\n\n    {% if page.HasPrev or page.HasNext %}\n    \u003cnav class=\"pagination\"\u003e\n        {% if page.HasPrev %}\n        \u003ca href=\"{{ page.PrevURL }}\" class=\"prev\"\u003e\u0026larr; Previous\u003c/a\u003e\n        {% endif %}\n\n        \u003cspan\u003ePage {{ page.Number }}\u003c/span\u003e\n\n        {% if page.HasNext %}\n        \u003ca href=\"{{ page.NextURL }}\" class=\"next\"\u003eNext \u0026rarr;\u003c/a\u003e\n        {% endif %}\n    \u003c/nav\u003e\n    {% endif %}\n\u003c/section\u003e\n{% endblock %}\n```\n\n---\n\n## Custom Templates Per Post\n\nOverride the default template for specific posts using the `template` frontmatter field.\n\n### Simple Override\n\n```yaml\n---\ntitle: \"My Landing Page\"\ntemplate: \"landing.html\"\n---\n```\n\nThis post will use `templates/landing.html` instead of the default `post.html`.\n\n### Creating a Slide Deck\n\n```yaml\n---\ntitle: \"Platform Roadmap\"\ntemplate: \"slides.html\"\n---\n\n## Opening\n\nIntro slide.\n\n### Details\n\nVertical follow-up slide.\n\n---\n\n## Next Section\n```\n\n`slides.html` renders the page as a reveal.js deck. In the default template:\n\n1. `##` headings become new horizontal slides.\n2. `###` headings become vertical slides nested under the current horizontal slide.\n3. `---` becomes a horizontal slide break because Markdown renders it as `\u003chr\u003e`.\n4. Reveal assets use local `assets/vendor/revealjs/...` URLs automatically when `[markata-go.assets].mode` is self-hosted or auto and the assets are available. Run `markata-go assets download` to prefetch them.\n5. On small screens, the deck sizes itself to the current viewport so slides stay readable on phones and after rotation.\n\n### Creating a Landing Page Template\n\n```html\n{# templates/landing.html #}\n{% extends \"base.html\" %}\n\n{% block title %}{{ post.Title }}{% endblock %}\n\n{% block header %}\n{# No header on landing page #}\n{% endblock %}\n\n{% block content %}\n\u003cdiv class=\"landing\"\u003e\n    \u003csection class=\"hero\"\u003e\n        \u003ch1\u003e{{ post.Title }}\u003c/h1\u003e\n        {% if post.Description %}\n        \u003cp class=\"tagline\"\u003e{{ post.Description }}\u003c/p\u003e\n        {% endif %}\n    \u003c/section\u003e\n\n    \u003csection class=\"content\"\u003e\n        {{ body|safe }}\n    \u003c/section\u003e\n\n    {% if post.Extra.cta_text %}\n    \u003csection class=\"cta\"\u003e\n        \u003ca href=\"{{ post.Extra.cta_url }}\" class=\"button\"\u003e\n            {{ post.Extra.cta_text }}\n        \u003c/a\u003e\n    \u003c/section\u003e\n    {% endif %}\n\u003c/div\u003e\n{% endblock %}\n\n{% block footer %}\n{# Minimal footer #}\n\u003cfooter class=\"minimal\"\u003e\n    \u003cp\u003e\u0026copy; {{ config.Author }}\u003c/p\u003e\n\u003c/footer\u003e\n{% endblock %}\n```\n\n### Template Fallback\n\nIf a specified template doesn't exist, markata-go falls back to:\n1. `post.html` (for posts)\n2. `feed.html` (for feeds)\n\n---\n\n## Complete Examples\n\n### base.html\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"en\"\u003e\n\u003chead\u003e\n    \u003cmeta charset=\"UTF-8\"\u003e\n    \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u003e\n    \u003ctitle\u003e{% block title %}{{ config.Title }}{% endblock %}\u003c/title\u003e\n    \u003cmeta name=\"description\" content=\"{% block description %}{{ config.Description }}{% endblock %}\"\u003e\n\n    {# Open Graph #}\n    \u003cmeta property=\"og:title\" content=\"{% block og_title %}{{ config.Title }}{% endblock %}\"\u003e\n    \u003cmeta property=\"og:description\" content=\"{% block og_description %}{{ config.Description }}{% endblock %}\"\u003e\n    \u003cmeta property=\"og:url\" content=\"{{ config.URL }}{% block og_url %}/{% endblock %}\"\u003e\n    \u003cmeta property=\"og:site_name\" content=\"{{ config.Title }}\"\u003e\n\n    {# Feeds #}\n    \u003clink rel=\"alternate\" type=\"application/rss+xml\" title=\"{{ config.Title }} RSS\" href=\"{{ config.URL }}/blog/rss.xml\"\u003e\n    \u003clink rel=\"alternate\" type=\"application/atom+xml\" title=\"{{ config.Title }} Atom\" href=\"{{ config.URL }}/blog/atom.xml\"\u003e\n\n    {# Styles #}\n    \u003clink rel=\"stylesheet\" href=\"/css/style.css\"\u003e\n\n    {% block head %}{% endblock %}\n\u003c/head\u003e\n\u003cbody\u003e\n    \u003ca href=\"#main\" class=\"skip-link\"\u003eSkip to content\u003c/a\u003e\n\n    {% block header %}\n    \u003cheader class=\"site-header\"\u003e\n        \u003cdiv class=\"container\"\u003e\n            \u003ca href=\"/\" class=\"logo\"\u003e{{ config.Title }}\u003c/a\u003e\n            \u003cnav class=\"main-nav\"\u003e\n                \u003cul\u003e\n                    \u003cli\u003e\u003ca href=\"/blog/\"\u003eBlog\u003c/a\u003e\u003c/li\u003e\n                    \u003cli\u003e\u003ca href=\"/tags/\"\u003eTags\u003c/a\u003e\u003c/li\u003e\n                    \u003cli\u003e\u003ca href=\"/about/\"\u003eAbout\u003c/a\u003e\u003c/li\u003e\n                \u003c/ul\u003e\n            \u003c/nav\u003e\n        \u003c/div\u003e\n    \u003c/header\u003e\n    {% endblock %}\n\n    \u003cmain id=\"main\"\u003e\n        \u003cdiv class=\"container\"\u003e\n            {% block content %}{% endblock %}\n        \u003c/div\u003e\n    \u003c/main\u003e\n\n    {% block footer %}\n    \u003cfooter class=\"site-footer\"\u003e\n        \u003cdiv class=\"container\"\u003e\n            \u003cp\u003e\u0026copy; {{ config.Author }}. Built with \u003ca href=\"https://github.com/example/markata-go\"\u003emarkata-go\u003c/a\u003e.\u003c/p\u003e\n        \u003c/div\u003e\n    \u003c/footer\u003e\n    {% endblock %}\n\n    {% block scripts %}{% endblock %}\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n### post.html\n\n```html\n{% extends \"base.html\" %}\n\n{% block title %}{{ post.Title }} | {{ config.Title }}{% endblock %}\n{% block description %}{{ post.Description|default_if_none:config.Description }}{% endblock %}\n\n{% block og_title %}{{ post.Title }}{% endblock %}\n{% block og_description %}{{ post.Description|default_if_none:config.Description }}{% endblock %}\n{% block og_url %}{{ post.Href }}{% endblock %}\n\n{% block head %}\n\u003cmeta property=\"og:type\" content=\"article\"\u003e\n{% if post.Date %}\n\u003cmeta property=\"article:published_time\" content=\"{{ post.Date|atom_date }}\"\u003e\n{% endif %}\n{% if post.Tags %}\n{% for tag in post.Tags %}\n\u003cmeta property=\"article:tag\" content=\"{{ tag }}\"\u003e\n{% endfor %}\n{% endif %}\n\n{# JSON-LD structured data #}\n\u003cscript type=\"application/ld+json\"\u003e\n{\n    \"@context\": \"https://schema.org\",\n    \"@type\": \"BlogPosting\",\n    \"headline\": \"{{ post.Title }}\",\n    \"description\": \"{{ post.Description }}\",\n    \"author\": {\n        \"@type\": \"Person\",\n        \"name\": \"{{ config.Author }}\"\n    },\n    {% if post.Date %}\n    \"datePublished\": \"{{ post.Date|atom_date }}\",\n    {% endif %}\n    \"url\": \"{{ config.URL }}{{ post.Href }}\"\n}\n\u003c/script\u003e\n{% endblock %}\n\n{% block content %}\n\u003carticle class=\"post h-entry\"\u003e\n    \u003cheader class=\"post-header\"\u003e\n        \u003ch1 class=\"post-title p-name\"\u003e{{ post.Title }}\u003c/h1\u003e\n\n        \u003cdiv class=\"post-meta\"\u003e\n            {% if post.Date %}\n            \u003ctime class=\"dt-published\" datetime=\"{{ post.Date|atom_date }}\"\u003e\n                {{ post.Date|date_format:\"January 2, 2006\" }}\n            \u003c/time\u003e\n            {% endif %}\n\n            {% if post.Extra.reading_time %}\n            \u003cspan class=\"reading-time\"\u003e{{ post.Extra.reading_time }}\u003c/span\u003e\n            {% endif %}\n        \u003c/div\u003e\n\n        {% if post.Tags %}\n        \u003cul class=\"post-tags\"\u003e\n            {% for tag in post.Tags %}\n            \u003cli\u003e\n                \u003ca href=\"/tags/{{ tag|slugify }}/\" rel=\"tag\" class=\"p-category\"\u003e{{ tag }}\u003c/a\u003e\n            \u003c/li\u003e\n            {% endfor %}\n        \u003c/ul\u003e\n        {% endif %}\n    \u003c/header\u003e\n\n    \u003cdiv class=\"post-content e-content\"\u003e\n        {{ body|safe }}\n    \u003c/div\u003e\n\n    \u003cfooter class=\"post-footer\"\u003e\n        \u003cdiv class=\"author-info\"\u003e\n            \u003cspan\u003eWritten by\u003c/span\u003e\n            \u003ca href=\"/about/\" class=\"p-author h-card\" rel=\"author\"\u003e{{ config.Author }}\u003c/a\u003e\n        \u003c/div\u003e\n\n        {% if post.Extra.prev or post.Extra.next %}\n        \u003cnav class=\"post-nav\"\u003e\n            {% if post.Extra.prev %}\n            \u003ca href=\"{{ post.Extra.prev.Href }}\" class=\"prev\" rel=\"prev\"\u003e\n                \u003cspan\u003e\u0026larr; Previous\u003c/span\u003e\n                \u003cspan class=\"title\"\u003e{{ post.Extra.prev.Title }}\u003c/span\u003e\n            \u003c/a\u003e\n            {% endif %}\n            {% if post.Extra.next %}\n            \u003ca href=\"{{ post.Extra.next.Href }}\" class=\"next\" rel=\"next\"\u003e\n                \u003cspan\u003eNext \u0026rarr;\u003c/span\u003e\n                \u003cspan class=\"title\"\u003e{{ post.Extra.next.Title }}\u003c/span\u003e\n            \u003c/a\u003e\n            {% endif %}\n        \u003c/nav\u003e\n        {% endif %}\n    \u003c/footer\u003e\n\u003c/article\u003e\n{% endblock %}\n```\n\n### feed.html\n\n```html\n{% extends \"base.html\" %}\n\n{% block title %}{{ feed.Title }} | {{ config.Title }}{% endblock %}\n{% block description %}{{ feed.Description|default_if_none:config.Description }}{% endblock %}\n\n{% block og_title %}{{ feed.Title }}{% endblock %}\n{% block og_url %}/{{ feed.Slug }}/{% endblock %}\n\n{% block head %}\n\u003cmeta property=\"og:type\" content=\"website\"\u003e\n{% endblock %}\n\n{% block content %}\n\u003csection class=\"feed\"\u003e\n    \u003cheader class=\"feed-header\"\u003e\n        \u003ch1\u003e{{ feed.Title }}\u003c/h1\u003e\n        {% if feed.Description %}\n        \u003cp class=\"feed-description\"\u003e{{ feed.Description }}\u003c/p\u003e\n        {% endif %}\n    \u003c/header\u003e\n\n    {% if posts|length \u003e 0 %}\n    \u003cul class=\"post-list\"\u003e\n        {% for post in posts %}\n        \u003cli class=\"post-item\"\u003e\n            \u003carticle class=\"card h-entry\"\u003e\n                \u003ch2 class=\"card-title\"\u003e\n                    \u003ca href=\"{{ post.href }}\" class=\"p-name u-url\"\u003e{{ post.title }}\u003c/a\u003e\n                \u003c/h2\u003e\n\n                {% if post.description %}\n                \u003cp class=\"card-description p-summary\"\u003e{{ post.description }}\u003c/p\u003e\n                {% endif %}\n\n                \u003cfooter class=\"card-meta\"\u003e\n                    {% if post.date %}\n                    \u003ctime class=\"dt-published\" datetime=\"{{ post.date|atom_date }}\"\u003e\n                        {{ post.date|date_format:\"Jan 2, 2006\" }}\n                    \u003c/time\u003e\n                    {% endif %}\n\n                    {% if post.tags %}\n                    \u003cul class=\"card-tags\"\u003e\n                        {% for tag in post.tags %}\n                        \u003cli\u003e\u003ca href=\"/tags/{{ tag|slugify }}/\"\u003e{{ tag }}\u003c/a\u003e\u003c/li\u003e\n                        {% endfor %}\n                    \u003c/ul\u003e\n                    {% endif %}\n                \u003c/footer\u003e\n            \u003c/article\u003e\n        \u003c/li\u003e\n        {% endfor %}\n    \u003c/ul\u003e\n\n    {% if page.HasPrev or page.HasNext %}\n    \u003cnav class=\"pagination\" aria-label=\"Pagination\"\u003e\n        {% if page.HasPrev %}\n        \u003ca href=\"{{ page.PrevURL }}\" class=\"pagination-prev\" rel=\"prev\"\u003e\n            \u0026larr; Newer Posts\n        \u003c/a\u003e\n        {% else %}\n        \u003cspan class=\"pagination-prev disabled\"\u003e\u0026larr; Newer Posts\u003c/span\u003e\n        {% endif %}\n\n        \u003cspan class=\"pagination-info\"\u003ePage {{ page.Number }}\u003c/span\u003e\n\n        {% if page.HasNext %}\n        \u003ca href=\"{{ page.NextURL }}\" class=\"pagination-next\" rel=\"next\"\u003e\n            Older Posts \u0026rarr;\n        \u003c/a\u003e\n        {% else %}\n        \u003cspan class=\"pagination-next disabled\"\u003eOlder Posts \u0026rarr;\u003c/span\u003e\n        {% endif %}\n    \u003c/nav\u003e\n    {% endif %}\n\n    {% else %}\n    \u003cp class=\"no-posts\"\u003eNo posts found.\u003c/p\u003e\n    {% endif %}\n\u003c/section\u003e\n{% endblock %}\n```\n\n### Card Media Helpers\n\nOG, feed, and embed cards share the same media helpers so the image/video preview feels identical everywhere. When rendering card media:\n\n- Pass the URL through `with_size(width, height)` so the helper appends explicit `w` and `h` query parameters that match the printed dimensions of the card. Correct query params keep downstream screenshotters and feed readers aligned with the rendered size. Trusted media URLs are normalized to `https` first so browser pages do not hit mixed-content errors.\n- For trusted remote image hosts that support width-based resizing, use `responsive_srcset` with candidate widths and a matching `sizes` attribute so browsers download an image close to the rendered size. For lazy images with variable layouts, `sizes=\"auto, ...fallback...\"` uses the measured width when supported. The filter skips local paths and unknown hosts; use `image_optimization` for local files. Use `original_media_url` for a deferred lightbox URL when the reader should open the original image.\n- Use `media_url` when you only need the first non-empty media field or a search thumbnail URL. It keeps trusted media URLs on `https` without adding sizing parameters.\n- Use the fragment/query-safe `is_video` filter to decide between `\u003cvideo\u003e` and `\u003cimg\u003e`, and call `poster_url(post)` to resolve the poster. `poster_url` enforces the alias precedence (`poster_image`, `poster`, `video_poster`, `video_thumbnail`, `thumbnail`, `thumb`) before falling back to deriving a `.webp` thumbnail from the video URL when the host is trusted.\n\nOnly relative URLs and hosts on the default allowlist (`dropper.wayl.one`, `dropper.waylonwalker.com`, `dropper-dev.wayl.one`) gain the sizing parameters and derived posters. Override or extend the list via `[markata-go.templates.media]` in your configuration when you use a different CDN. If you need to opt out, you can skip these filters in your custom template, but keep alias resolution and sizing in sync across OG/feed/embed templates so the published meta stays consistent.\n\n### partials/card.html\n\n```html\n\u003carticle class=\"card h-entry\"\u003e\n    {% if post.cover_image %}\n    \u003ca href=\"{{ post.href }}\" class=\"card-image\"\u003e\n        \u003cimg src=\"{{ post.cover_image }}\" alt=\"{{ post.title }}\" loading=\"lazy\"\u003e\n    \u003c/a\u003e\n    {% endif %}\n\n    \u003cdiv class=\"card-body\"\u003e\n        \u003ch2 class=\"card-title\"\u003e\n            \u003ca href=\"{{ post.href }}\" class=\"p-name u-url\"\u003e{{ post.title }}\u003c/a\u003e\n        \u003c/h2\u003e\n\n        {% if post.description %}\n        \u003cp class=\"card-description p-summary\"\u003e\n            {{ post.description|truncate:160 }}\n        \u003c/p\u003e\n        {% endif %}\n\n        \u003cfooter class=\"card-footer\"\u003e\n            {% if post.date %}\n            \u003ctime class=\"dt-published\" datetime=\"{{ post.date|atom_date }}\"\u003e\n                {{ post.date|date_format:\"Jan 2, 2006\" }}\n            \u003c/time\u003e\n            {% endif %}\n\n            {% if post.reading_time %}\n            \u003cspan class=\"reading-time\"\u003e{{ post.reading_time }}\u003c/span\u003e\n            {% endif %}\n\n            {% if post.tags %}\n            \u003cul class=\"card-tags\"\u003e\n                {% for tag in post.tags|slice:\":3\" %}\n                \u003cli\u003e\u003ca href=\"/tags/{{ tag|slugify }}/\" class=\"p-category\"\u003e{{ tag }}\u003c/a\u003e\u003c/li\u003e\n                {% endfor %}\n            \u003c/ul\u003e\n            {% endif %}\n        \u003c/footer\u003e\n    \u003c/div\u003e\n\u003c/article\u003e\n```\n\n### partials/header.html\n\n```html\n\u003cheader class=\"site-header\"\u003e\n    \u003cdiv class=\"container\"\u003e\n        \u003ca href=\"/\" class=\"site-logo\"\u003e\n            {% if config.Extra.logo %}\n            \u003cimg src=\"{{ config.Extra.logo }}\" alt=\"{{ config.Title }}\"\u003e\n            {% else %}\n            {{ config.Title }}\n            {% endif %}\n        \u003c/a\u003e\n\n        \u003cnav class=\"main-nav\" aria-label=\"Main navigation\"\u003e\n            \u003cbutton class=\"nav-toggle\" aria-expanded=\"false\" aria-controls=\"nav-menu\"\u003e\n                \u003cspan class=\"sr-only\"\u003eMenu\u003c/span\u003e\n                \u003cspan class=\"hamburger\"\u003e\u003c/span\u003e\n            \u003c/button\u003e\n\n            \u003cul id=\"nav-menu\" class=\"nav-menu\"\u003e\n                \u003cli\u003e\u003ca href=\"/\"\u003eHome\u003c/a\u003e\u003c/li\u003e\n                \u003cli\u003e\u003ca href=\"/blog/\"\u003eBlog\u003c/a\u003e\u003c/li\u003e\n                \u003cli\u003e\u003ca href=\"/tags/\"\u003eTags\u003c/a\u003e\u003c/li\u003e\n                \u003cli\u003e\u003ca href=\"/about/\"\u003eAbout\u003c/a\u003e\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/nav\u003e\n    \u003c/div\u003e\n\u003c/header\u003e\n```\n\n### partials/footer.html\n\n```html\n\u003cfooter class=\"site-footer\"\u003e\n    \u003cdiv class=\"container\"\u003e\n        \u003cdiv class=\"footer-content\"\u003e\n            \u003cdiv class=\"footer-section\"\u003e\n                \u003ch3\u003e{{ config.Title }}\u003c/h3\u003e\n                \u003cp\u003e{{ config.Description }}\u003c/p\u003e\n            \u003c/div\u003e\n\n            \u003cdiv class=\"footer-section\"\u003e\n                \u003ch3\u003eLinks\u003c/h3\u003e\n                \u003cul\u003e\n                    \u003cli\u003e\u003ca href=\"/blog/\"\u003eBlog\u003c/a\u003e\u003c/li\u003e\n                    \u003cli\u003e\u003ca href=\"/tags/\"\u003eTags\u003c/a\u003e\u003c/li\u003e\n                    \u003cli\u003e\u003ca href=\"/about/\"\u003eAbout\u003c/a\u003e\u003c/li\u003e\n                \u003c/ul\u003e\n            \u003c/div\u003e\n\n            \u003cdiv class=\"footer-section\"\u003e\n                \u003ch3\u003eSubscribe\u003c/h3\u003e\n                \u003cul\u003e\n                    \u003cli\u003e\u003ca href=\"/blog/rss.xml\"\u003eRSS Feed\u003c/a\u003e\u003c/li\u003e\n                    \u003cli\u003e\u003ca href=\"/blog/atom.xml\"\u003eAtom Feed\u003c/a\u003e\u003c/li\u003e\n                    \u003cli\u003e\u003ca href=\"/blog/feed.json\"\u003eJSON Feed\u003c/a\u003e\u003c/li\u003e\n                \u003c/ul\u003e\n            \u003c/div\u003e\n        \u003c/div\u003e\n\n        \u003cdiv class=\"footer-bottom\"\u003e\n            \u003cp\u003e\u0026copy; {{ config.Author }}. Built with \u003ca href=\"https://github.com/example/markata-go\"\u003emarkata-go\u003c/a\u003e.\u003c/p\u003e\n        \u003c/div\u003e\n    \u003c/div\u003e\n\u003c/footer\u003e\n```\n\n---\n\n## Microformats2 Support\n\nmarkata-go's default templates include [Microformats2](https://microformats.org/wiki/microformats2) markup for better interoperability with IndieWeb tools and feed readers.\n\n### h-entry on Posts\n\nSingle post pages include `h-entry` markup on the `\u003carticle\u003e` element:\n\n```html\n\u003carticle class=\"post h-entry\"\u003e\n  \u003ca class=\"u-url\" href=\"https://example.com/my-post/\" hidden\u003e\u003c/a\u003e\n  \u003cheader\u003e\n    \u003ch1 class=\"p-name\"\u003ePost Title\u003c/h1\u003e\n    \u003ctime class=\"dt-published\" datetime=\"2024-01-15T00:00:00Z\"\u003eJanuary 15, 2024\u003c/time\u003e\n    \u003cspan class=\"p-author h-card\" hidden\u003e\n      \u003ca class=\"u-url p-name\" href=\"https://example.com\"\u003eAuthor Name\u003c/a\u003e\n    \u003c/span\u003e\n  \u003c/header\u003e\n  \u003cdiv class=\"post-content e-content\"\u003e\n    \u003c!-- rendered content --\u003e\n  \u003c/div\u003e\n  \u003cdiv class=\"tags\"\u003e\n    \u003ca class=\"p-category\" href=\"/tags/topic/\"\u003etopic\u003c/a\u003e\n  \u003c/div\u003e\n\u003c/article\u003e\n```\n\n**Properties used:**\n- `h-entry` - Entry/post container\n- `p-name` - Post title\n- `u-url` - Canonical permalink\n- `dt-published` - Publication date\n- `e-content` - Entry content (HTML)\n- `p-summary` - Post description/excerpt\n- `p-category` - Tags/categories\n- `p-author h-card` - Author information\n\n### h-feed on Listings\n\nFeed and listing pages include `h-feed` markup:\n\n```html\n\u003cdiv class=\"feed h-feed\"\u003e\n  \u003ch1 class=\"p-name\"\u003eBlog Posts\u003c/h1\u003e\n  \u003cp class=\"p-summary\"\u003eAll blog posts\u003c/p\u003e\n  \u003cspan class=\"p-author h-card\" hidden\u003e\n    \u003ca class=\"u-url p-name\" href=\"https://example.com\"\u003eSite Author\u003c/a\u003e\n  \u003c/span\u003e\n\n  \u003c!-- Each card is an h-entry --\u003e\n  \u003carticle class=\"card h-entry\"\u003e...\u003c/article\u003e\n\u003c/div\u003e\n```\n\n### Card Types\n\nAll card templates include appropriate microformat classes:\n\n| Card Type | Key Classes |\n|-----------|-------------|\n| article-card | `h-entry`, `p-name`, `u-url`, `p-summary`, `dt-published`, `p-category` |\n| note-card | `h-entry`, `p-content`, `dt-published` |\n| photo-card | `h-entry`, `u-photo`, `u-video`, `p-name`, `p-summary` |\n| video-card | `h-entry`, `u-photo` (thumbnail), `p-name`, `p-summary` |\n| link-card | `h-entry`, `u-bookmark-of`, `p-name`, `p-summary` |\n| quote-card | `h-entry`, `e-content`, `h-cite` |\n| guide-card | `h-entry`, `p-name`, `u-url`, `p-summary` |\n| inline-card | `h-entry`, `e-content` |\n\n### Validation\n\nTest your microformats with:\n- [IndieWebify.me](https://indiewebify.me/) - Validate h-entry markup\n- [Pin13](https://pin13.net/mf2/) - Parse and view microformats\n\n---\n\n## Text Templates\n\nmarkata-go generates `.txt` versions of posts for consumers that need plain text (LLMs, CLI tools, accessibility readers, etc.). Text templates require special handling because pongo2 auto-escapes all `{{ }}` output by default, which would produce HTML entities (`\u0026amp;`, `\u0026lt;`) in plain text files.\n\n### The `plaintext` Filter\n\nUse `|plaintext` for any variable that contains HTML content (like rendered Markdown):\n\n```django\n{{ post.content|plaintext }}\n```\n\nThis filter:\n1. Strips all HTML tags\n2. Decodes HTML entities to literal characters\n3. Converts `\u003ca href=\"...\"\u003e` links to footnote-style references\n4. Marks the output as safe so pongo2 won't re-escape it\n\n### The `safe` Filter for Metadata\n\nFor plain text strings that never contain HTML (like title and description), use `|safe` to prevent auto-escaping:\n\n```django\n{{ post.title|safe }}\n{{ post.description|safe }}\n```\n\n### Example: default.txt\n\n```django\n{{ body|safe }}\n```\n\n### Example: default.ansi\n\n```django\n{{ body|safe }}\n```\n\nFor terminal output templates, `body` contains the fully rendered terminal page for the selected format. `default.txt` uses the plain terminal renderer, while `default.ansi` uses the ANSI-styled renderer.\n\n### Link Footnotes\n\nLinks in HTML content are converted to numbered footnote references:\n\n```\nRead the Go docs [1] for more info. See also the\nGo blog [2] for tutorials.\n\nReferences:\n[1]: https://go.dev/doc/\n[2]: https://go.dev/blog/\n```\n\nDuplicate URLs reuse the same reference number. When link text is the same as the URL, no footnote marker is added.\n\n---\n\n## Tips and Best Practices\n\n1. **Always use `|safe` for HTML content** - When outputting rendered HTML (like `body` or `post.ArticleHTML`), use the `safe` filter to prevent double-escaping.\n\n2. **Provide fallbacks with `default_if_none`** - Use fallback values for optional fields to avoid empty output.\n\n3. **Use template inheritance** - Create a solid `base.html` and extend it for consistency across your site.\n\n4. **Keep partials small and focused** - Each partial should do one thing well.\n\n5. **Use semantic HTML** - Include appropriate ARIA attributes and semantic elements for accessibility.\n\n6. **Add microformats** - Include h-entry, h-card, and other microformats for better interoperability.\n\n7. **Cache considerations** - Templates are cached for performance. Clear the cache during development if changes don't appear.\n\n---\n\n## See Also\n\n- [[configuration-guide|Configuration Guide]] - Configure template settings\n- [[feeds-guide|Feeds Guide]] - Learn about the feed system\n- [[themes-and-styling|Themes Guide]] - Create and customize themes\n- [pongo2 Documentation](https://github.com/flosch/pongo2) - Full template engine reference\n",
      "summary": "Complete guide to creating and customizing templates with pongo2/Jinja2 syntax",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "templates"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/syndication-feeds/",
      "url": "https://markata.dev/docs/guides/syndication-feeds/",
      "title": "Syndication Feeds",
      "content_html": "\u003cp\u003eThis guide covers generating syndication feeds for your markata-go site: \u003cstrong\u003eSitemap\u003c/strong\u003e, \u003cstrong\u003eRSS\u003c/strong\u003e, \u003cstrong\u003eAtom\u003c/strong\u003e, and \u003cstrong\u003eJSON Feed\u003c/strong\u003e. Each format serves different consumers - search engines, feed readers, and JavaScript applications.\u003c/p\u003e\n\u003ch2 id=\"quick-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Reference\u003c/span\u003e \u003ca href=\"#quick-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFormat\u003c/th\u003e\n\u003cth\u003eFile\u003c/th\u003e\n\u003cth\u003eMIME Type\u003c/th\u003e\n\u003cth\u003eUse Case\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eSitemap\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003esitemap.xml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eapplication/xml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSearch engine indexing\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRSS 2.0\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003erss.xml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eapplication/rss+xml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTraditional feed readers\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAtom\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eatom.xml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eapplication/atom+xml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eModern feed readers\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJSON Feed\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efeed.json\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eapplication/feed+json\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eJavaScript apps, APIs\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"prerequisites\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrerequisites\u003c/span\u003e \u003ca href=\"#prerequisites\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBefore generating syndication feeds, ensure your \u003ccode\u003emarkata-go.toml\u003c/code\u003e has the required site metadata:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Blog\u0026#34;\u003c/span\u003e                      \u003cspan class=\"c\"\u003e# Required for all feeds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;A blog about things\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Used in RSS/Atom/JSON\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e            \u003cspan class=\"c\"\u003e# Required for absolute URLs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauthor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Jane Doe\u0026#34;\u003c/span\u003e                    \u003cspan class=\"c\"\u003e# Used in Atom/JSON feeds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"1-generate-a-sitemap\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e1. Generate a Sitemap\u003c/span\u003e \u003ca href=\"#1-generate-a-sitemap\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe sitemap plugin automatically generates a \u003ccode\u003esitemap.xml\u003c/code\u003e file containing all published posts and feed index pages.\u003c/p\u003e\n\u003ch3 id=\"enable-the-sitemap\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnable the Sitemap\u003c/span\u003e \u003ca href=\"#enable-the-sitemap\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe sitemap is generated automatically when the \u003ccode\u003esitemap\u003c/code\u003e plugin runs. No additional configuration is required for basic usage.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e \u003ccode\u003e/sitemap.xml\u003c/code\u003e in your output directory\u003c/p\u003e\n\u003ch3 id=\"example-sitemap-output\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample Sitemap Output\u003c/span\u003e \u003ca href=\"#example-sitemap-output\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;urlset\u003c/span\u003e \u003cspan class=\"na\"\u003exmlns=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;http://www.sitemaps.org/schemas/sitemap/0.9\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;url\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;loc\u0026gt;\u003c/span\u003ehttps://example.com/\u003cspan class=\"nt\"\u003e\u0026lt;/loc\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;lastmod\u0026gt;\u003c/span\u003e2024-01-15\u003cspan class=\"nt\"\u003e\u0026lt;/lastmod\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;changefreq\u0026gt;\u003c/span\u003edaily\u003cspan class=\"nt\"\u003e\u0026lt;/changefreq\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;priority\u0026gt;\u003c/span\u003e1.0\u003cspan class=\"nt\"\u003e\u0026lt;/priority\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;/url\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;url\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;loc\u0026gt;\u003c/span\u003ehttps://example.com/my-first-post/\u003cspan class=\"nt\"\u003e\u0026lt;/loc\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;lastmod\u0026gt;\u003c/span\u003e2024-01-15\u003cspan class=\"nt\"\u003e\u0026lt;/lastmod\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;changefreq\u0026gt;\u003c/span\u003eweekly\u003cspan class=\"nt\"\u003e\u0026lt;/changefreq\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;priority\u0026gt;\u003c/span\u003e0.8\u003cspan class=\"nt\"\u003e\u0026lt;/priority\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;/url\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;url\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;loc\u0026gt;\u003c/span\u003ehttps://example.com/blog/\u003cspan class=\"nt\"\u003e\u0026lt;/loc\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;lastmod\u0026gt;\u003c/span\u003e2024-01-15\u003cspan class=\"nt\"\u003e\u0026lt;/lastmod\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;changefreq\u0026gt;\u003c/span\u003eweekly\u003cspan class=\"nt\"\u003e\u0026lt;/changefreq\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;priority\u0026gt;\u003c/span\u003e0.6\u003cspan class=\"nt\"\u003e\u0026lt;/priority\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;/url\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;/urlset\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"customize-sitemap-values-via-frontmatter\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustomize Sitemap Values via Frontmatter\u003c/span\u003e \u003ca href=\"#customize-sitemap-values-via-frontmatter\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOverride \u003ccode\u003echangefreq\u003c/code\u003e and \u003ccode\u003epriority\u003c/code\u003e per-post in your markdown frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Important Announcement\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003esitemap\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003echangefreq\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edaily     \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Options: always, hourly, daily, weekly, monthly, yearly, never\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epriority\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e0.9\u003c/span\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"c\"\u003e# Range: 0.0 to 1.0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"default-sitemap-values\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDefault Sitemap Values\u003c/span\u003e \u003ca href=\"#default-sitemap-values\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePage Type\u003c/th\u003e\n\u003cth\u003echangefreq\u003c/th\u003e\n\u003cth\u003epriority\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eHome page\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edaily\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e1.0\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePosts\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eweekly\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e0.8\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFeed index pages\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eweekly\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e0.6\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"exclude-posts-from-sitemap\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExclude Posts from Sitemap\u003c/span\u003e \u003ca href=\"#exclude-posts-from-sitemap\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse \u003ccode\u003eskip: true\u003c/code\u003e in frontmatter to exclude a post from the sitemap:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Draft Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eskip\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"2-generate-rss-feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e2. Generate RSS Feeds\u003c/span\u003e \u003ca href=\"#2-generate-rss-feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRSS 2.0 feeds are the most widely supported format for feed readers.\u003c/p\u003e\n\u003ch3 id=\"enable-rss-for-a-feed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnable RSS for a Feed\u003c/span\u003e \u003ca href=\"#enable-rss-for-a-feed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# Enable RSS output\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e \u003ccode\u003e/blog/rss.xml\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"example-rss-output\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample RSS Output\u003c/span\u003e \u003ca href=\"#example-rss-output\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;rss\u003c/span\u003e \u003cspan class=\"na\"\u003eversion=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;2.0\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003exmlns:atom=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;http://www.w3.org/2005/Atom\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;channel\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003eMy Blog\u003cspan class=\"nt\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;link\u0026gt;\u003c/span\u003ehttps://example.com\u003cspan class=\"nt\"\u003e\u0026lt;/link\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;description\u0026gt;\u003c/span\u003eA blog about things\u003cspan class=\"nt\"\u003e\u0026lt;/description\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;language\u0026gt;\u003c/span\u003een-us\u003cspan class=\"nt\"\u003e\u0026lt;/language\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;lastBuildDate\u0026gt;\u003c/span\u003eMon, 15 Jan 2024 12:00:00 +0000\u003cspan class=\"nt\"\u003e\u0026lt;/lastBuildDate\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;atom:link\u003c/span\u003e \u003cspan class=\"na\"\u003ehref=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com/blog/rss.xml\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;self\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/rss+xml\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;item\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003eMy First Post\u003cspan class=\"nt\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026lt;link\u0026gt;\u003c/span\u003ehttps://example.com/my-first-post/\u003cspan class=\"nt\"\u003e\u0026lt;/link\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026lt;description\u0026gt;\u003c/span\u003eThis is the post description...\u003cspan class=\"nt\"\u003e\u0026lt;/description\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026lt;pubDate\u0026gt;\u003c/span\u003eMon, 15 Jan 2024 12:00:00 +0000\u003cspan class=\"nt\"\u003e\u0026lt;/pubDate\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026lt;guid\u003c/span\u003e \u003cspan class=\"na\"\u003eisPermaLink=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003ehttps://example.com/my-first-post/\u003cspan class=\"nt\"\u003e\u0026lt;/guid\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;/item\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;/channel\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;/rss\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"rss-configuration-options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRSS Configuration Options\u003c/span\u003e \u003ca href=\"#rss-configuration-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eControl RSS behavior via feed defaults:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esyndication\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_items\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Maximum items in RSS feed (default: 20)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_content\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Include full content or just description\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"rss-with-full-content\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRSS with Full Content\u003c/span\u003e \u003ca href=\"#rss-with-full-content\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTo include full post content instead of just the description:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esyndication\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_content\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen \u003ccode\u003einclude_content = true\u003c/code\u003e, the \u003ccode\u003e\u0026lt;description\u0026gt;\u003c/code\u003e element contains the rendered HTML content (truncated to 500 characters). When \u003ccode\u003efalse\u003c/code\u003e, it uses the post\u0026rsquo;s \u003ccode\u003edescription\u003c/code\u003e frontmatter field.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"3-generate-atom-feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e3. Generate Atom Feeds\u003c/span\u003e \u003ca href=\"#3-generate-atom-feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAtom feeds (RFC 4287) provide richer metadata than RSS and are well-supported by modern feed readers.\u003c/p\u003e\n\u003ch3 id=\"enable-atom-for-a-feed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnable Atom for a Feed\u003c/span\u003e \u003ca href=\"#enable-atom-for-a-feed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# Enable Atom output\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e \u003ccode\u003e/blog/atom.xml\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"example-atom-output\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample Atom Output\u003c/span\u003e \u003ca href=\"#example-atom-output\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;feed\u003c/span\u003e \u003cspan class=\"na\"\u003exmlns=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;http://www.w3.org/2005/Atom\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003eMy Blog\u003cspan class=\"nt\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;id\u0026gt;\u003c/span\u003ehttps://example.com/blog/atom.xml\u003cspan class=\"nt\"\u003e\u0026lt;/id\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;updated\u0026gt;\u003c/span\u003e2024-01-15T12:00:00Z\u003cspan class=\"nt\"\u003e\u0026lt;/updated\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;link\u003c/span\u003e \u003cspan class=\"na\"\u003ehref=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text/html\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;link\u003c/span\u003e \u003cspan class=\"na\"\u003ehref=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com/blog/atom.xml\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;self\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/atom+xml\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;author\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;name\u0026gt;\u003c/span\u003eJane Doe\u003cspan class=\"nt\"\u003e\u0026lt;/name\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;/author\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;entry\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003eMy First Post\u003cspan class=\"nt\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;id\u0026gt;\u003c/span\u003ehttps://example.com/my-first-post/\u003cspan class=\"nt\"\u003e\u0026lt;/id\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;updated\u0026gt;\u003c/span\u003e2024-01-15T12:00:00Z\u003cspan class=\"nt\"\u003e\u0026lt;/updated\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;published\u0026gt;\u003c/span\u003e2024-01-15T12:00:00Z\u003cspan class=\"nt\"\u003e\u0026lt;/published\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;link\u003c/span\u003e \u003cspan class=\"na\"\u003ehref=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com/my-first-post/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text/html\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;summary\u003c/span\u003e \u003cspan class=\"na\"\u003etype=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003eThis is the post description...\u003cspan class=\"nt\"\u003e\u0026lt;/summary\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;content\u003c/span\u003e \u003cspan class=\"na\"\u003etype=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;html\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"ni\"\u003e\u0026amp;lt;\u003c/span\u003ep\u003cspan class=\"ni\"\u003e\u0026amp;gt;\u003c/span\u003eFull post content...\u003cspan class=\"ni\"\u003e\u0026amp;lt;\u003c/span\u003e/p\u003cspan class=\"ni\"\u003e\u0026amp;gt;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026lt;/content\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;/entry\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;/feed\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"atom-vs-rss-key-differences\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAtom vs RSS: Key Differences\u003c/span\u003e \u003ca href=\"#atom-vs-rss-key-differences\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFeature\u003c/th\u003e\n\u003cth\u003eRSS 2.0\u003c/th\u003e\n\u003cth\u003eAtom\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eAuthor info\u003c/td\u003e\n\u003ctd\u003eLimited\u003c/td\u003e\n\u003ctd\u003eFull (name, email, URI)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eContent types\u003c/td\u003e\n\u003ctd\u003eText only\u003c/td\u003e\n\u003ctd\u003eText, HTML, XHTML\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUpdate tracking\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003elastBuildDate\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eupdated\u003c/code\u003e per-entry\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSelf-reference\u003c/td\u003e\n\u003ctd\u003eVia extension\u003c/td\u003e\n\u003ctd\u003eBuilt-in \u003ccode\u003erel=\u0026quot;self\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eID format\u003c/td\u003e\n\u003ctd\u003eURL (guid)\u003c/td\u003e\n\u003ctd\u003eIRI (more flexible)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"when-to-use-atom\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhen to Use Atom\u003c/span\u003e \u003ca href=\"#when-to-use-atom\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eYou need author information (name, email)\u003c/li\u003e\n\u003cli\u003eYou want both summary and full content\u003c/li\u003e\n\u003cli\u003eYou need per-entry update timestamps\u003c/li\u003e\n\u003cli\u003eYour audience uses modern feed readers\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"when-to-use-rss\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhen to Use RSS\u003c/span\u003e \u003ca href=\"#when-to-use-rss\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eMaximum compatibility with older readers\u003c/li\u003e\n\u003cli\u003eSimpler format requirements\u003c/li\u003e\n\u003cli\u003ePodcast feeds (RSS is the standard)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eRecommendation:\u003c/strong\u003e Enable both RSS and Atom - let your users choose.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"4-generate-json-feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e4. Generate JSON Feeds\u003c/span\u003e \u003ca href=\"#4-generate-json-feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eJSON Feed (version 1.1) is a modern feed format designed for easy consumption by JavaScript applications.\u003c/p\u003e\n\u003ch3 id=\"enable-json-feed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnable JSON Feed\u003c/span\u003e \u003ca href=\"#enable-json-feed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# Enable JSON Feed output\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e \u003ccode\u003e/blog/feed.json\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"example-json-feed-output\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample JSON Feed Output\u003c/span\u003e \u003ca href=\"#example-json-feed-output\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://jsonfeed.org/version/1.1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Blog\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;home_page_url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;feed_url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/blog/feed.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;A blog about things\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;language\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;en\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;authors\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Jane Doe\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;items\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/my-first-post/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/my-first-post/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My First Post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;content_html\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026lt;p\u0026gt;Full post content...\u0026lt;/p\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;content_text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Full post content...\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;summary\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;This is the post description...\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;date_published\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2024-01-15T12:00:00Z\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;date_modified\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2024-01-15T12:00:00Z\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;tags\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorial\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"json-feed-use-cases\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJSON Feed Use Cases\u003c/span\u003e \u003ca href=\"#json-feed-use-cases\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eJavaScript consumption\u003c/strong\u003e - Parse with \u003ccode\u003efetch()\u003c/code\u003e and \u003ccode\u003eJSON.parse()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAPI endpoints\u003c/strong\u003e - Serve as a simple read-only API\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eStatic search indexes\u003c/strong\u003e - Power client-side search\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCross-origin requests\u003c/strong\u003e - JSON has better CORS support than XML\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"using-json-feed-in-javascript\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing JSON Feed in JavaScript\u003c/span\u003e \u003ca href=\"#using-json-feed-in-javascript\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efetch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;/blog/feed.json\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ethen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eresponse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003eresponse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ethen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003efeed\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eitems\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eforEach\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eitem\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eitem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eitem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"5-combining-multiple-formats\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e5. Combining Multiple Formats\u003c/span\u003e \u003ca href=\"#5-combining-multiple-formats\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe real power of markata-go\u0026rsquo;s feed system is generating all formats from a single definition.\u003c/p\u003e\n\u003ch3 id=\"complete-multi-format-feed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComplete Multi-Format Feed\u003c/span\u003e \u003ca href=\"#complete-multi-format-feed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Tech Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Articles about Go, Python, and web development\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://techblog.example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauthor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Jane Doe\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Global feed defaults\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esyndication\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_items\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_content\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Main blog feed with ALL formats\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Tech Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Latest articles about programming\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# /blog/index.html, /blog/page/2/index.html\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# /blog/rss.xml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# /blog/atom.xml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# /blog/feed.json\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"output-structure\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOutput Structure\u003c/span\u003e \u003ca href=\"#output-structure\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003epublic/\n  sitemap.xml                    # Global sitemap (auto-generated)\n  blog/\n    index.html                   # HTML page 1\n    page/\n      2/\n        index.html               # HTML page 2\n    rss.xml                      # RSS 2.0 feed\n    atom.xml                     # Atom feed\n    feed.json                    # JSON Feed\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"multiple-feeds-with-different-formats\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMultiple Feeds with Different Formats\u003c/span\u003e \u003ca href=\"#multiple-feeds-with-different-formats\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Home page - HTML only\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Home\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Blog - All syndication formats\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# API endpoint - JSON only\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;api/posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Posts API\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e              \u003cspan class=\"c\"\u003e# No pagination - all posts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"6-adding-feed-discovery-links\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e6. Adding Feed Discovery Links\u003c/span\u003e \u003ca href=\"#6-adding-feed-discovery-links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHelp feed readers and browsers automatically discover your feeds by adding \u003ccode\u003e\u0026lt;link\u0026gt;\u003c/code\u003e tags to your HTML templates.\u003c/p\u003e\n\u003ch3 id=\"template-with-feed-discovery\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate with Feed Discovery\u003c/span\u003e \u003ca href=\"#template-with-feed-discovery\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd these links to your base template\u0026rsquo;s \u003ccode\u003e\u0026lt;head\u0026gt;\u003c/code\u003e section:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u0026lt;!DOCTYPE html\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehtml\u003c/span\u003e \u003cspan class=\"na\"\u003elang\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;en\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003echarset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;UTF-8\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;viewport\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;width=device-width, initial-scale=1.0\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c\"\u003e\u0026lt;!-- RSS Feed Discovery --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/rss+xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ site.title }} (RSS)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ site.url }}/blog/rss.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c\"\u003e\u0026lt;!-- Atom Feed Discovery --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/atom+xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ site.title }} (Atom)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ site.url }}/blog/atom.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c\"\u003e\u0026lt;!-- JSON Feed Discovery --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/feed+json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ site.title }} (JSON)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ site.url }}/blog/feed.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c\"\u003e\u0026lt;!-- ... --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"feed-links-per-section\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Links Per Section\u003c/span\u003e \u003ca href=\"#feed-links-per-section\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf you have multiple feeds (blog, tutorials, etc.), add discovery links for each:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c\"\u003e\u0026lt;!-- Blog feeds --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/rss+xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Blog (RSS)\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/blog/rss.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/atom+xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Blog (Atom)\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/blog/atom.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c\"\u003e\u0026lt;!-- Tutorial feeds --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/rss+xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Tutorials (RSS)\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/tutorials/rss.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/atom+xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Tutorials (Atom)\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/tutorials/atom.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"dynamic-feed-discovery-in-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDynamic Feed Discovery in Templates\u003c/span\u003e \u003ca href=\"#dynamic-feed-discovery-in-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor feed-specific pages, use template variables:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if feed %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if feed.formats.rss %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/rss+xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.title }} (RSS)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.href }}rss.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if feed.formats.atom %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/atom+xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.title }} (Atom)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.href }}atom.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if feed.formats.json %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/feed+json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.title }} (JSON)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.href }}feed.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"visible-feed-links\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVisible Feed Links\u003c/span\u003e \u003ca href=\"#visible-feed-links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAlso provide visible links for users who want to manually subscribe:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eSubscribe\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;feed-links\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/blog/rss.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eRSS Feed\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/blog/atom.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAtom Feed\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/blog/feed.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eJSON Feed\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"complete-example-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComplete Example Configuration\u003c/span\u003e \u003ca href=\"#complete-example-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere\u0026rsquo;s a full \u003ccode\u003emarkata-go.toml\u003c/code\u003e with all syndication features configured:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Site metadata (required for syndication feeds)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Tech Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Articles about Go, Python, and web development\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://techblog.example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauthor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Jane Doe\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Build settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplates_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;templates\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Content discovery\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;posts/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pages/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Markdown extensions\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eextensions\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tables\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;strikethrough\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tasklist\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# FEED DEFAULTS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eorphan_threshold\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esyndication\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_items\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# Items in RSS/Atom/JSON feeds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_content\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Include full content in feeds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# FEEDS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Home page - HTML only, no syndication\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Recent Posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Main blog - Full syndication\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;All blog posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Tutorials - RSS and Atom only\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Step-by-step programming guides\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and \u0026#39;tutorial\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# JSON API endpoint\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;api/posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Posts API\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e              \u003cspan class=\"c\"\u003e# All posts, no pagination\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"generated-output\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGenerated Output\u003c/span\u003e \u003ca href=\"#generated-output\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003epublic/\n  index.html                     # Home page\n  sitemap.xml                    # Global sitemap\n\n  blog/\n    index.html                   # Blog page 1\n    page/2/index.html            # Blog page 2\n    rss.xml                      # RSS feed\n    atom.xml                     # Atom feed\n    feed.json                    # JSON feed\n\n  tutorials/\n    index.html                   # Tutorials page 1\n    rss.xml                      # RSS feed\n    atom.xml                     # Atom feed\n\n  api/\n    posts/\n      feed.json                  # JSON API (all posts)\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"feed-urls-show-https-example-com\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed URLs show \u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003ehttps://example.com\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#feed-urls-show-https-example-com\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnsure you\u0026rsquo;ve set the \u003ccode\u003eurl\u003c/code\u003e field in your config:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://your-actual-domain.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"feeds-are-empty\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeeds are empty\u003c/span\u003e \u003ca href=\"#feeds-are-empty\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCheck that posts have \u003ccode\u003epublished = true\u003c/code\u003e (or your filter matches):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# Required for most filters\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"author-missing-in-atom-json-feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuthor missing in Atom/JSON feeds\u003c/span\u003e \u003ca href=\"#author-missing-in-atom-json-feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSet the \u003ccode\u003eauthor\u003c/code\u003e field:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauthor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Your Name\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"feed-not-generating\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed not generating\u003c/span\u003e \u003ca href=\"#feed-not-generating\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnsure the format is enabled:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e     \u003cspan class=\"c\"\u003e# Must be explicitly true\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[[feeds-guide|Feeds Guide]] - Complete feed system documentation\u003c/li\u003e\n\u003cli\u003e[[configuration-guide|Configuration Guide]] - Full configuration reference\u003c/li\u003e\n\u003cli\u003e[[templates-guide|Templates Guide]] - Template system and filters\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nThis guide covers generating syndication feeds for your markata-go site: **Sitemap**, **RSS**, **Atom**, and **JSON Feed**. Each format serves different consumers - search engines, feed readers, and JavaScript applications.\n\n## Quick Reference\n\n| Format | File | MIME Type | Use Case |\n|--------|------|-----------|----------|\n| Sitemap | `sitemap.xml` | `application/xml` | Search engine indexing |\n| RSS 2.0 | `rss.xml` | `application/rss+xml` | Traditional feed readers |\n| Atom | `atom.xml` | `application/atom+xml` | Modern feed readers |\n| JSON Feed | `feed.json` | `application/feed+json` | JavaScript apps, APIs |\n\n## Prerequisites\n\nBefore generating syndication feeds, ensure your `markata-go.toml` has the required site metadata:\n\n```toml\n[markata-go]\ntitle = \"My Blog\"                      # Required for all feeds\ndescription = \"A blog about things\"    # Used in RSS/Atom/JSON\nurl = \"https://example.com\"            # Required for absolute URLs\nauthor = \"Jane Doe\"                    # Used in Atom/JSON feeds\n```\n\n---\n\n## 1. Generate a Sitemap\n\nThe sitemap plugin automatically generates a `sitemap.xml` file containing all published posts and feed index pages.\n\n### Enable the Sitemap\n\nThe sitemap is generated automatically when the `sitemap` plugin runs. No additional configuration is required for basic usage.\n\n**Output:** `/sitemap.xml` in your output directory\n\n### Example Sitemap Output\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003curlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\u003e\n    \u003curl\u003e\n        \u003cloc\u003ehttps://example.com/\u003c/loc\u003e\n        \u003clastmod\u003e2024-01-15\u003c/lastmod\u003e\n        \u003cchangefreq\u003edaily\u003c/changefreq\u003e\n        \u003cpriority\u003e1.0\u003c/priority\u003e\n    \u003c/url\u003e\n    \u003curl\u003e\n        \u003cloc\u003ehttps://example.com/my-first-post/\u003c/loc\u003e\n        \u003clastmod\u003e2024-01-15\u003c/lastmod\u003e\n        \u003cchangefreq\u003eweekly\u003c/changefreq\u003e\n        \u003cpriority\u003e0.8\u003c/priority\u003e\n    \u003c/url\u003e\n    \u003curl\u003e\n        \u003cloc\u003ehttps://example.com/blog/\u003c/loc\u003e\n        \u003clastmod\u003e2024-01-15\u003c/lastmod\u003e\n        \u003cchangefreq\u003eweekly\u003c/changefreq\u003e\n        \u003cpriority\u003e0.6\u003c/priority\u003e\n    \u003c/url\u003e\n\u003c/urlset\u003e\n```\n\n### Customize Sitemap Values via Frontmatter\n\nOverride `changefreq` and `priority` per-post in your markdown frontmatter:\n\n```yaml\n---\ntitle: \"Important Announcement\"\ndate: 2024-01-15\npublished: true\nsitemap:\n  changefreq: daily      # Options: always, hourly, daily, weekly, monthly, yearly, never\n  priority: 0.9          # Range: 0.0 to 1.0\n---\n```\n\n### Default Sitemap Values\n\n| Page Type | changefreq | priority |\n|-----------|------------|----------|\n| Home page | `daily` | `1.0` |\n| Posts | `weekly` | `0.8` |\n| Feed index pages | `weekly` | `0.6` |\n\n### Exclude Posts from Sitemap\n\nUse `skip: true` in frontmatter to exclude a post from the sitemap:\n\n```yaml\n---\ntitle: \"Draft Post\"\nskip: true\n---\n```\n\n---\n\n## 2. Generate RSS Feeds\n\nRSS 2.0 feeds are the most widely supported format for feed readers.\n\n### Enable RSS for a Feed\n\n```toml\n[[markata-go.feeds]]\nslug = \"blog\"\ntitle = \"My Blog\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\n\n[markata-go.feeds.formats]\nhtml = true\nrss = true                  # Enable RSS output\n```\n\n**Output:** `/blog/rss.xml`\n\n### Example RSS Output\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003crss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\"\u003e\n  \u003cchannel\u003e\n    \u003ctitle\u003eMy Blog\u003c/title\u003e\n    \u003clink\u003ehttps://example.com\u003c/link\u003e\n    \u003cdescription\u003eA blog about things\u003c/description\u003e\n    \u003clanguage\u003een-us\u003c/language\u003e\n    \u003clastBuildDate\u003eMon, 15 Jan 2024 12:00:00 +0000\u003c/lastBuildDate\u003e\n    \u003catom:link href=\"https://example.com/blog/rss.xml\" rel=\"self\" type=\"application/rss+xml\"/\u003e\n\n    \u003citem\u003e\n      \u003ctitle\u003eMy First Post\u003c/title\u003e\n      \u003clink\u003ehttps://example.com/my-first-post/\u003c/link\u003e\n      \u003cdescription\u003eThis is the post description...\u003c/description\u003e\n      \u003cpubDate\u003eMon, 15 Jan 2024 12:00:00 +0000\u003c/pubDate\u003e\n      \u003cguid isPermaLink=\"true\"\u003ehttps://example.com/my-first-post/\u003c/guid\u003e\n    \u003c/item\u003e\n  \u003c/channel\u003e\n\u003c/rss\u003e\n```\n\n### RSS Configuration Options\n\nControl RSS behavior via feed defaults:\n\n```toml\n[markata-go.feed_defaults.syndication]\nmax_items = 20              # Maximum items in RSS feed (default: 20)\ninclude_content = true      # Include full content or just description\n```\n\n### RSS with Full Content\n\nTo include full post content instead of just the description:\n\n```toml\n[markata-go.feed_defaults.syndication]\ninclude_content = true\n```\n\nWhen `include_content = true`, the `\u003cdescription\u003e` element contains the rendered HTML content (truncated to 500 characters). When `false`, it uses the post's `description` frontmatter field.\n\n---\n\n## 3. Generate Atom Feeds\n\nAtom feeds (RFC 4287) provide richer metadata than RSS and are well-supported by modern feed readers.\n\n### Enable Atom for a Feed\n\n```toml\n[[markata-go.feeds]]\nslug = \"blog\"\ntitle = \"My Blog\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\n\n[markata-go.feeds.formats]\nhtml = true\nrss = true\natom = true                 # Enable Atom output\n```\n\n**Output:** `/blog/atom.xml`\n\n### Example Atom Output\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cfeed xmlns=\"http://www.w3.org/2005/Atom\"\u003e\n  \u003ctitle\u003eMy Blog\u003c/title\u003e\n  \u003cid\u003ehttps://example.com/blog/atom.xml\u003c/id\u003e\n  \u003cupdated\u003e2024-01-15T12:00:00Z\u003c/updated\u003e\n  \u003clink href=\"https://example.com\" rel=\"alternate\" type=\"text/html\"/\u003e\n  \u003clink href=\"https://example.com/blog/atom.xml\" rel=\"self\" type=\"application/atom+xml\"/\u003e\n  \u003cauthor\u003e\n    \u003cname\u003eJane Doe\u003c/name\u003e\n  \u003c/author\u003e\n\n  \u003centry\u003e\n    \u003ctitle\u003eMy First Post\u003c/title\u003e\n    \u003cid\u003ehttps://example.com/my-first-post/\u003c/id\u003e\n    \u003cupdated\u003e2024-01-15T12:00:00Z\u003c/updated\u003e\n    \u003cpublished\u003e2024-01-15T12:00:00Z\u003c/published\u003e\n    \u003clink href=\"https://example.com/my-first-post/\" rel=\"alternate\" type=\"text/html\"/\u003e\n    \u003csummary type=\"text\"\u003eThis is the post description...\u003c/summary\u003e\n    \u003ccontent type=\"html\"\u003e\u0026lt;p\u0026gt;Full post content...\u0026lt;/p\u0026gt;\u003c/content\u003e\n  \u003c/entry\u003e\n\u003c/feed\u003e\n```\n\n### Atom vs RSS: Key Differences\n\n| Feature | RSS 2.0 | Atom |\n|---------|---------|------|\n| Author info | Limited | Full (name, email, URI) |\n| Content types | Text only | Text, HTML, XHTML |\n| Update tracking | `lastBuildDate` | `updated` per-entry |\n| Self-reference | Via extension | Built-in `rel=\"self\"` |\n| ID format | URL (guid) | IRI (more flexible) |\n\n### When to Use Atom\n\n- You need author information (name, email)\n- You want both summary and full content\n- You need per-entry update timestamps\n- Your audience uses modern feed readers\n\n### When to Use RSS\n\n- Maximum compatibility with older readers\n- Simpler format requirements\n- Podcast feeds (RSS is the standard)\n\n**Recommendation:** Enable both RSS and Atom - let your users choose.\n\n---\n\n## 4. Generate JSON Feeds\n\nJSON Feed (version 1.1) is a modern feed format designed for easy consumption by JavaScript applications.\n\n### Enable JSON Feed\n\n```toml\n[[markata-go.feeds]]\nslug = \"blog\"\ntitle = \"My Blog\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\n\n[markata-go.feeds.formats]\nhtml = true\nrss = true\natom = true\njson = true                 # Enable JSON Feed output\n```\n\n**Output:** `/blog/feed.json`\n\n### Example JSON Feed Output\n\n```json\n{\n  \"version\": \"https://jsonfeed.org/version/1.1\",\n  \"title\": \"My Blog\",\n  \"home_page_url\": \"https://example.com\",\n  \"feed_url\": \"https://example.com/blog/feed.json\",\n  \"description\": \"A blog about things\",\n  \"language\": \"en\",\n  \"authors\": [\n    {\n      \"name\": \"Jane Doe\"\n    }\n  ],\n  \"items\": [\n    {\n      \"id\": \"https://example.com/my-first-post/\",\n      \"url\": \"https://example.com/my-first-post/\",\n      \"title\": \"My First Post\",\n      \"content_html\": \"\u003cp\u003eFull post content...\u003c/p\u003e\",\n      \"content_text\": \"Full post content...\",\n      \"summary\": \"This is the post description...\",\n      \"date_published\": \"2024-01-15T12:00:00Z\",\n      \"date_modified\": \"2024-01-15T12:00:00Z\",\n      \"tags\": [\"go\", \"tutorial\"]\n    }\n  ]\n}\n```\n\n### JSON Feed Use Cases\n\n1. **JavaScript consumption** - Parse with `fetch()` and `JSON.parse()`\n2. **API endpoints** - Serve as a simple read-only API\n3. **Static search indexes** - Power client-side search\n4. **Cross-origin requests** - JSON has better CORS support than XML\n\n### Using JSON Feed in JavaScript\n\n```javascript\nfetch('/blog/feed.json')\n  .then(response =\u003e response.json())\n  .then(feed =\u003e {\n    feed.items.forEach(item =\u003e {\n      console.log(item.title, item.url);\n    });\n  });\n```\n\n---\n\n## 5. Combining Multiple Formats\n\nThe real power of markata-go's feed system is generating all formats from a single definition.\n\n### Complete Multi-Format Feed\n\n```toml\n[markata-go]\ntitle = \"My Tech Blog\"\ndescription = \"Articles about Go, Python, and web development\"\nurl = \"https://techblog.example.com\"\nauthor = \"Jane Doe\"\noutput_dir = \"public\"\n\n# Global feed defaults\n[markata-go.feed_defaults]\nitems_per_page = 10\n\n[markata-go.feed_defaults.syndication]\nmax_items = 20\ninclude_content = true\n\n# Main blog feed with ALL formats\n[[markata-go.feeds]]\nslug = \"blog\"\ntitle = \"Tech Blog\"\ndescription = \"Latest articles about programming\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\n\n[markata-go.feeds.formats]\nhtml = true                 # /blog/index.html, /blog/page/2/index.html\nrss = true                  # /blog/rss.xml\natom = true                 # /blog/atom.xml\njson = true                 # /blog/feed.json\n```\n\n### Output Structure\n\n```\npublic/\n  sitemap.xml                    # Global sitemap (auto-generated)\n  blog/\n    index.html                   # HTML page 1\n    page/\n      2/\n        index.html               # HTML page 2\n    rss.xml                      # RSS 2.0 feed\n    atom.xml                     # Atom feed\n    feed.json                    # JSON Feed\n```\n\n### Multiple Feeds with Different Formats\n\n```toml\n# Home page - HTML only\n[[markata-go.feeds]]\nslug = \"\"\ntitle = \"Home\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 5\n\n[markata-go.feeds.formats]\nhtml = true\nrss = false\natom = false\njson = false\n\n# Blog - All syndication formats\n[[markata-go.feeds]]\nslug = \"blog\"\ntitle = \"Blog\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\n\n[markata-go.feeds.formats]\nhtml = true\nrss = true\natom = true\njson = true\n\n# API endpoint - JSON only\n[[markata-go.feeds]]\nslug = \"api/posts\"\ntitle = \"Posts API\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 0              # No pagination - all posts\n\n[markata-go.feeds.formats]\nhtml = false\nrss = false\natom = false\njson = true\n```\n\n---\n\n## 6. Adding Feed Discovery Links\n\nHelp feed readers and browsers automatically discover your feeds by adding `\u003clink\u003e` tags to your HTML templates.\n\n### Template with Feed Discovery\n\nAdd these links to your base template's `\u003chead\u003e` section:\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"en\"\u003e\n\u003chead\u003e\n    \u003cmeta charset=\"UTF-8\"\u003e\n    \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u003e\n    \u003ctitle\u003e{{ title }}\u003c/title\u003e\n\n    \u003c!-- RSS Feed Discovery --\u003e\n    \u003clink rel=\"alternate\"\n          type=\"application/rss+xml\"\n          title=\"{{ site.title }} (RSS)\"\n          href=\"{{ site.url }}/blog/rss.xml\"\u003e\n\n    \u003c!-- Atom Feed Discovery --\u003e\n    \u003clink rel=\"alternate\"\n          type=\"application/atom+xml\"\n          title=\"{{ site.title }} (Atom)\"\n          href=\"{{ site.url }}/blog/atom.xml\"\u003e\n\n    \u003c!-- JSON Feed Discovery --\u003e\n    \u003clink rel=\"alternate\"\n          type=\"application/feed+json\"\n          title=\"{{ site.title }} (JSON)\"\n          href=\"{{ site.url }}/blog/feed.json\"\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n    \u003c!-- ... --\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n### Feed Links Per Section\n\nIf you have multiple feeds (blog, tutorials, etc.), add discovery links for each:\n\n```html\n\u003chead\u003e\n    \u003c!-- Blog feeds --\u003e\n    \u003clink rel=\"alternate\" type=\"application/rss+xml\"\n          title=\"Blog (RSS)\" href=\"/blog/rss.xml\"\u003e\n    \u003clink rel=\"alternate\" type=\"application/atom+xml\"\n          title=\"Blog (Atom)\" href=\"/blog/atom.xml\"\u003e\n\n    \u003c!-- Tutorial feeds --\u003e\n    \u003clink rel=\"alternate\" type=\"application/rss+xml\"\n          title=\"Tutorials (RSS)\" href=\"/tutorials/rss.xml\"\u003e\n    \u003clink rel=\"alternate\" type=\"application/atom+xml\"\n          title=\"Tutorials (Atom)\" href=\"/tutorials/atom.xml\"\u003e\n\u003c/head\u003e\n```\n\n### Dynamic Feed Discovery in Templates\n\nFor feed-specific pages, use template variables:\n\n```html\n{% if feed %}\n    {% if feed.formats.rss %}\n    \u003clink rel=\"alternate\" type=\"application/rss+xml\"\n          title=\"{{ feed.title }} (RSS)\"\n          href=\"{{ feed.href }}rss.xml\"\u003e\n    {% endif %}\n\n    {% if feed.formats.atom %}\n    \u003clink rel=\"alternate\" type=\"application/atom+xml\"\n          title=\"{{ feed.title }} (Atom)\"\n          href=\"{{ feed.href }}atom.xml\"\u003e\n    {% endif %}\n\n    {% if feed.formats.json %}\n    \u003clink rel=\"alternate\" type=\"application/feed+json\"\n          title=\"{{ feed.title }} (JSON)\"\n          href=\"{{ feed.href }}feed.json\"\u003e\n    {% endif %}\n{% endif %}\n```\n\n### Visible Feed Links\n\nAlso provide visible links for users who want to manually subscribe:\n\n```html\n\u003cfooter\u003e\n    \u003ch3\u003eSubscribe\u003c/h3\u003e\n    \u003cul class=\"feed-links\"\u003e\n        \u003cli\u003e\u003ca href=\"/blog/rss.xml\"\u003eRSS Feed\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"/blog/atom.xml\"\u003eAtom Feed\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"/blog/feed.json\"\u003eJSON Feed\u003c/a\u003e\u003c/li\u003e\n    \u003c/ul\u003e\n\u003c/footer\u003e\n```\n\n---\n\n## Complete Example Configuration\n\nHere's a full `markata-go.toml` with all syndication features configured:\n\n```toml\n[markata-go]\n# Site metadata (required for syndication feeds)\ntitle = \"My Tech Blog\"\ndescription = \"Articles about Go, Python, and web development\"\nurl = \"https://techblog.example.com\"\nauthor = \"Jane Doe\"\n\n# Build settings\noutput_dir = \"public\"\ntemplates_dir = \"templates\"\n\n# Content discovery\n[markata-go.glob]\npatterns = [\"posts/**/*.md\", \"pages/*.md\"]\n\n# Markdown extensions\n[markata-go.markdown]\nextensions = [\"tables\", \"strikethrough\", \"tasklist\"]\n\n# =============================================================================\n# FEED DEFAULTS\n# =============================================================================\n\n[markata-go.feed_defaults]\nitems_per_page = 10\norphan_threshold = 3\n\n[markata-go.feed_defaults.formats]\nhtml = true\nrss = true\natom = true\njson = false\n\n[markata-go.feed_defaults.syndication]\nmax_items = 20                  # Items in RSS/Atom/JSON feeds\ninclude_content = true          # Include full content in feeds\n\n# =============================================================================\n# FEEDS\n# =============================================================================\n\n# Home page - HTML only, no syndication\n[[markata-go.feeds]]\nslug = \"\"\ntitle = \"Recent Posts\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 5\n\n[markata-go.feeds.formats]\nhtml = true\nrss = false\natom = false\n\n# Main blog - Full syndication\n[[markata-go.feeds]]\nslug = \"blog\"\ntitle = \"Blog\"\ndescription = \"All blog posts\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\n\n[markata-go.feeds.formats]\nhtml = true\nrss = true\natom = true\njson = true\n\n# Tutorials - RSS and Atom only\n[[markata-go.feeds]]\nslug = \"tutorials\"\ntitle = \"Tutorials\"\ndescription = \"Step-by-step programming guides\"\nfilter = \"published == True and 'tutorial' in tags\"\nsort = \"date\"\nreverse = true\n\n[markata-go.feeds.formats]\nhtml = true\nrss = true\natom = true\njson = false\n\n# JSON API endpoint\n[[markata-go.feeds]]\nslug = \"api/posts\"\ntitle = \"Posts API\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 0              # All posts, no pagination\n\n[markata-go.feeds.formats]\nhtml = false\nrss = false\natom = false\njson = true\n```\n\n### Generated Output\n\n```\npublic/\n  index.html                     # Home page\n  sitemap.xml                    # Global sitemap\n\n  blog/\n    index.html                   # Blog page 1\n    page/2/index.html            # Blog page 2\n    rss.xml                      # RSS feed\n    atom.xml                     # Atom feed\n    feed.json                    # JSON feed\n\n  tutorials/\n    index.html                   # Tutorials page 1\n    rss.xml                      # RSS feed\n    atom.xml                     # Atom feed\n\n  api/\n    posts/\n      feed.json                  # JSON API (all posts)\n```\n\n---\n\n## Troubleshooting\n\n### Feed URLs show `https://example.com`\n\nEnsure you've set the `url` field in your config:\n\n```toml\n[markata-go]\nurl = \"https://your-actual-domain.com\"\n```\n\n### Feeds are empty\n\nCheck that posts have `published = true` (or your filter matches):\n\n```yaml\n---\ntitle: \"My Post\"\npublished: true    # Required for most filters\n---\n```\n\n### Author missing in Atom/JSON feeds\n\nSet the `author` field:\n\n```toml\n[markata-go]\nauthor = \"Your Name\"\n```\n\n### Feed not generating\n\nEnsure the format is enabled:\n\n```toml\n[markata-go.feeds.formats]\nrss = true     # Must be explicitly true\n```\n\n---\n\n## See Also\n\n- [[feeds-guide|Feeds Guide]] - Complete feed system documentation\n- [[configuration-guide|Configuration Guide]] - Full configuration reference\n- [[templates-guide|Templates Guide]] - Template system and filters\n",
      "summary": "Guide to generating Sitemap, RSS, Atom, and JSON Feed outputs for your site",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "feeds",
        "rss",
        "atom"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/structured-data/",
      "url": "https://markata.dev/docs/guides/structured-data/",
      "title": "Structured Data \u0026 SEO",
      "content_html": "\u003cp\u003emarkata-go automatically generates comprehensive structured data for your posts to improve search engine visibility and social media sharing.\u003c/p\u003e\n\u003ch2 id=\"features\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeatures\u003c/span\u003e \u003ca href=\"#features\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eJSON-LD Schema.org\u003c/strong\u003e - Structured data for Google Rich Results\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOpenGraph\u003c/strong\u003e - Meta tags for Facebook, LinkedIn, and general social sharing\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTwitter Cards\u003c/strong\u003e - Meta tags for Twitter/X sharing previews\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eStructured data is enabled by default. For basic usage, just ensure your posts have good frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Post Title\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;A compelling description for SEO\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tag1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tag2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"site-level-seo-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSite-Level SEO Configuration\u003c/span\u003e \u003ca href=\"#site-level-seo-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigure SEO settings in your \u003ccode\u003emarkata-go.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseo\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Twitter/X username (without @)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etwitter_handle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;yourusername\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Default image for posts without images\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault_image\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/images/og-default.jpg\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Site logo for Schema.org\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elogo_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/images/logo.png\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estructured_data\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Enable/disable structured data (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Publisher information\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estructured_data\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epublisher\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Organization\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# or \u0026#34;Person\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Your Site Name\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elogo\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/images/logo.png\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Default author for posts without explicit author\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estructured_data\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefault_author\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Person\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Author Name\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/about\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"frontmatter-fields\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFrontmatter Fields\u003c/span\u003e \u003ca href=\"#frontmatter-fields\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOverride structured data per-post via frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Post Title\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Post description for meta tags\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Optional fields\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Author Name\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"c\"\u003e# Override default author\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/images/post.jpg\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# OG/Twitter image\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003esocial_image\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/images/og.jpg\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Specific OG image override\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etwitter\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;authorhandle\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c\"\u003e# Author\u0026#39;s Twitter (without @)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emodified\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;2024-01-16\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e         \u003c/span\u003e\u003cspan class=\"c\"\u003e# Last modified date\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tag1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tag2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"generated-output\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGenerated Output\u003c/span\u003e \u003ca href=\"#generated-output\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"json-ld-schema\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJSON-LD Schema\u003c/span\u003e \u003ca href=\"#json-ld-schema\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor each post, markata-go generates a \u003ccode\u003eBlogPosting\u003c/code\u003e schema:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;@context\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://schema.org\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;@type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;BlogPosting\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;headline\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Post Title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Post description\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;datePublished\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2024-01-15T00:00:00Z\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;dateModified\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2024-01-16T00:00:00Z\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;author\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;@type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Person\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Author Name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/about\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;publisher\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;@type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Organization\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Site Name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;logo\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;@type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ImageObject\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/logo.png\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;mainEntityOfPage\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;@type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;WebPage\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;@id\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/post-slug/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;image\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/images/post.jpg\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;keywords\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tag1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tag2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"opengraph-tags\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOpenGraph Tags\u003c/span\u003e \u003ca href=\"#opengraph-tags\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGenerated tags include:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eog:title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePost title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eog:description\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePost description\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eog:type\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u0026ldquo;article\u0026rdquo; for posts, \u0026ldquo;website\u0026rdquo; for pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eog:url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCanonical URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eog:site_name\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eog:image\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePost or default image\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eog:locale\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eContent locale\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003earticle:published_time\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePublication date\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003earticle:modified_time\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLast modified date\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003earticle:author\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAuthor URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003earticle:tag\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePost tags\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"twitter-card-tags\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTwitter Card Tags\u003c/span\u003e \u003ca href=\"#twitter-card-tags\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGenerated tags include:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTag\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etwitter:card\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u0026ldquo;summary_large_image\u0026rdquo; or \u0026ldquo;summary\u0026rdquo;\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etwitter:site\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite Twitter handle\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etwitter:creator\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAuthor Twitter handle\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etwitter:title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePost title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etwitter:description\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePost description (truncated to 200 chars)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etwitter:image\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePost or default image\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"image-priority\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eImage Priority\u003c/span\u003e \u003ca href=\"#image-priority\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eImages are selected in this order:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003esocial_image\u003c/code\u003e from frontmatter (OG-specific override)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eimage\u003c/code\u003e from frontmatter\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edefault_image\u003c/code\u003e from SEO config\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"author-priority\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuthor Priority\u003c/span\u003e \u003ca href=\"#author-priority\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAuthors are determined in this order:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003eauthor\u003c/code\u003e field from frontmatter\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edefault_author\u003c/code\u003e from structured data config\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eauthor\u003c/code\u003e from site config\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"disabling-structured-data\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDisabling Structured Data\u003c/span\u003e \u003ca href=\"#disabling-structured-data\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTo disable structured data generation:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estructured_data\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"testing-your-structured-data\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTesting Your Structured Data\u003c/span\u003e \u003ca href=\"#testing-your-structured-data\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse these tools to validate your structured data:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://search.google.com/test/rich-results\"\u003eGoogle Rich Results Test\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://developers.facebook.com/tools/debug/\"\u003eFacebook Sharing Debugger\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://cards-dev.twitter.com/validator\"\u003eTwitter Card Validator\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://validator.schema.org/\"\u003eSchema.org Validator\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"best-practices\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBest Practices\u003c/span\u003e \u003ca href=\"#best-practices\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eAlways include descriptions\u003c/strong\u003e - Good descriptions improve both SEO and social sharing\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUse quality images\u003c/strong\u003e - Social images should be at least 1200x630 pixels\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eKeep titles under 60 characters\u003c/strong\u003e - Prevents truncation in search results\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSet publication dates\u003c/strong\u003e - Helps search engines understand content freshness\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUse relevant tags\u003c/strong\u003e - Tags become keywords in schema markup\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"template-access\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Access\u003c/span\u003e \u003ca href=\"#template-access\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eStructured data is available in templates via \u003ccode\u003epost.structured_data\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# JSON-LD #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.structured_data.jsonld %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/ld+json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estructured_data\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ejsonld\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"nx\"\u003esafe\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# OpenGraph #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for meta in post.structured_data.opengraph %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ meta.property }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ meta.content }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# Twitter Cards #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for meta in post.structured_data.twitter %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ meta.name }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ meta.content }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfiguration Reference\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/post-formats/\"\u003ePost Formats\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/themes/\"\u003eThemes\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nmarkata-go automatically generates comprehensive structured data for your posts to improve search engine visibility and social media sharing.\n\n## Features\n\n- **JSON-LD Schema.org** - Structured data for Google Rich Results\n- **OpenGraph** - Meta tags for Facebook, LinkedIn, and general social sharing  \n- **Twitter Cards** - Meta tags for Twitter/X sharing previews\n\n## Quick Start\n\nStructured data is enabled by default. For basic usage, just ensure your posts have good frontmatter:\n\n```yaml\n---\ntitle: \"My Post Title\"\ndescription: \"A compelling description for SEO\"\ndate: 2024-01-15\ntags: [\"tag1\", \"tag2\"]\n---\n```\n\n## Configuration\n\n### Site-Level SEO Configuration\n\nConfigure SEO settings in your `markata-go.toml`:\n\n```toml\n[markata-go.seo]\n# Twitter/X username (without @)\ntwitter_handle = \"yourusername\"\n\n# Default image for posts without images\ndefault_image = \"/images/og-default.jpg\"\n\n# Site logo for Schema.org\nlogo_url = \"/images/logo.png\"\n\n[markata-go.seo.structured_data]\n# Enable/disable structured data (default: true)\nenabled = true\n\n# Publisher information\n[markata-go.seo.structured_data.publisher]\ntype = \"Organization\"  # or \"Person\"\nname = \"Your Site Name\"\nurl = \"https://example.com\"\nlogo = \"/images/logo.png\"\n\n# Default author for posts without explicit author\n[markata-go.seo.structured_data.default_author]\ntype = \"Person\"\nname = \"Author Name\"\nurl = \"https://example.com/about\"\n```\n\n### Frontmatter Fields\n\nOverride structured data per-post via frontmatter:\n\n```yaml\n---\ntitle: \"Post Title\"\ndescription: \"Post description for meta tags\"\ndate: 2024-01-15\n\n# Optional fields\nauthor: \"Author Name\"          # Override default author\nimage: \"/images/post.jpg\"      # OG/Twitter image\nsocial_image: \"/images/og.jpg\" # Specific OG image override\ntwitter: \"authorhandle\"        # Author's Twitter (without @)\nmodified: \"2024-01-16\"         # Last modified date\ntags: [\"tag1\", \"tag2\"]\n---\n```\n\n## Generated Output\n\n### JSON-LD Schema\n\nFor each post, markata-go generates a `BlogPosting` schema:\n\n```json\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"BlogPosting\",\n  \"headline\": \"Post Title\",\n  \"description\": \"Post description\",\n  \"datePublished\": \"2024-01-15T00:00:00Z\",\n  \"dateModified\": \"2024-01-16T00:00:00Z\",\n  \"author\": {\n    \"@type\": \"Person\",\n    \"name\": \"Author Name\",\n    \"url\": \"https://example.com/about\"\n  },\n  \"publisher\": {\n    \"@type\": \"Organization\",\n    \"name\": \"Site Name\",\n    \"logo\": {\n      \"@type\": \"ImageObject\",\n      \"url\": \"https://example.com/logo.png\"\n    }\n  },\n  \"mainEntityOfPage\": {\n    \"@type\": \"WebPage\",\n    \"@id\": \"https://example.com/post-slug/\"\n  },\n  \"image\": \"https://example.com/images/post.jpg\",\n  \"keywords\": [\"tag1\", \"tag2\"]\n}\n```\n\n### OpenGraph Tags\n\nGenerated tags include:\n\n| Tag | Description |\n|-----|-------------|\n| `og:title` | Post title |\n| `og:description` | Post description |\n| `og:type` | \"article\" for posts, \"website\" for pages |\n| `og:url` | Canonical URL |\n| `og:site_name` | Site title |\n| `og:image` | Post or default image |\n| `og:locale` | Content locale |\n| `article:published_time` | Publication date |\n| `article:modified_time` | Last modified date |\n| `article:author` | Author URL |\n| `article:tag` | Post tags |\n\n### Twitter Card Tags\n\nGenerated tags include:\n\n| Tag | Description |\n|-----|-------------|\n| `twitter:card` | \"summary_large_image\" or \"summary\" |\n| `twitter:site` | Site Twitter handle |\n| `twitter:creator` | Author Twitter handle |\n| `twitter:title` | Post title |\n| `twitter:description` | Post description (truncated to 200 chars) |\n| `twitter:image` | Post or default image |\n\n## Image Priority\n\nImages are selected in this order:\n\n1. `social_image` from frontmatter (OG-specific override)\n2. `image` from frontmatter\n3. `default_image` from SEO config\n\n## Author Priority\n\nAuthors are determined in this order:\n\n1. `author` field from frontmatter\n2. `default_author` from structured data config\n3. `author` from site config\n\n## Disabling Structured Data\n\nTo disable structured data generation:\n\n```toml\n[markata-go.seo.structured_data]\nenabled = false\n```\n\n## Testing Your Structured Data\n\nUse these tools to validate your structured data:\n\n- [Google Rich Results Test](https://search.google.com/test/rich-results)\n- [Facebook Sharing Debugger](https://developers.facebook.com/tools/debug/)\n- [Twitter Card Validator](https://cards-dev.twitter.com/validator)\n- [Schema.org Validator](https://validator.schema.org/)\n\n## Best Practices\n\n1. **Always include descriptions** - Good descriptions improve both SEO and social sharing\n2. **Use quality images** - Social images should be at least 1200x630 pixels\n3. **Keep titles under 60 characters** - Prevents truncation in search results\n4. **Set publication dates** - Helps search engines understand content freshness\n5. **Use relevant tags** - Tags become keywords in schema markup\n\n## Template Access\n\nStructured data is available in templates via `post.structured_data`:\n\n```html\n{# JSON-LD #}\n{% if post.structured_data.jsonld %}\n\u003cscript type=\"application/ld+json\"\u003e\n{{ post.structured_data.jsonld | safe }}\n\u003c/script\u003e\n{% endif %}\n\n{# OpenGraph #}\n{% for meta in post.structured_data.opengraph %}\n\u003cmeta property=\"{{ meta.property }}\" content=\"{{ meta.content }}\"\u003e\n{% endfor %}\n\n{# Twitter Cards #}\n{% for meta in post.structured_data.twitter %}\n\u003cmeta name=\"{{ meta.name }}\" content=\"{{ meta.content }}\"\u003e\n{% endfor %}\n```\n\n## See Also\n\n- [Configuration Reference](/docs/guides/configuration/)\n- [Post Formats](/docs/guides/post-formats/)\n- [Themes](/docs/guides/themes/)\n",
      "summary": "Configure JSON-LD Schema.org markup, OpenGraph, and Twitter Cards for better SEO and social sharing",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "seo",
        "structured-data"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/series/",
      "url": "https://markata.dev/docs/guides/series/",
      "title": "Series Guide",
      "content_html": "\u003ch2 id=\"series\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSeries\u003c/span\u003e \u003ca href=\"#series\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSeries are \u003cstrong\u003eordered collections of posts meant to be read sequentially\u003c/strong\u003e. They are perfect for multi-part tutorials, article series, and course chapters.\u003c/p\u003e\n\u003cp\u003eA series automatically generates a feed with an index page, RSS/Atom feeds, sidebar navigation, prev/next links, and keyboard shortcuts \u0026ndash; all from a single frontmatter field.\u003c/p\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd \u003ccode\u003eseries\u003c/code\u003e to your post\u0026rsquo;s frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Building a REST API - Part 1: Setup\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;building-a-rest-api\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThat\u0026rsquo;s it. All posts with the same \u003ccode\u003eseries\u003c/code\u003e value are automatically grouped, ordered by date, and given navigation.\u003c/p\u003e\n\u003ch2 id=\"how-it-works\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow It Works\u003c/span\u003e \u003ca href=\"#how-it-works\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003e  Frontmatter                 Auto-Generated Feed              Output\n  +--------------+            +------------------+           +------------------+\n  | series:      |            | slug: series/X   |           | /series/X/       |\n  |   \u0026quot;rest-api\u0026quot; |---scan---\u0026gt;| type: series     |--render--\u0026gt;|   index.html     |\n  | series_order:|            | sort: order/date |           |   rss.xml        |\n  |   1          |            | sidebar: true    |           |   atom.xml       |\n  +--------------+            +------------------+           |   feed.json      |\n                                                              +------------------+\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe series plugin scans all posts during the build\u0026rsquo;s \u003cstrong\u003eCollect\u003c/strong\u003e stage, groups them by series name, sorts them, and injects feed configurations. The feeds plugin then generates all the output formats.\u003c/p\u003e\n\u003ch2 id=\"frontmatter-fields\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFrontmatter Fields\u003c/span\u003e \u003ca href=\"#frontmatter-fields\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"series-required\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003eseries\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e (required)\u003c/span\u003e \u003ca href=\"#series-required\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe series identifier. Becomes the URL slug (prefixed with \u003ccode\u003eseries/\u003c/code\u003e).\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;building-a-rest-api\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe value is slugified, so \u003ccode\u003e\u0026quot;Building a REST API\u0026quot;\u003c/code\u003e and \u003ccode\u003e\u0026quot;building-a-rest-api\u0026quot;\u003c/code\u003e are treated as the same series.\u003c/p\u003e\n\u003cp\u003eA post can belong to \u003cstrong\u003eat most one series\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"series_order-optional\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003eseries_order\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e (optional)\u003c/span\u003e \u003ca href=\"#series_order-optional\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eExplicit position in the series (1-indexed).\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;building-a-rest-api\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries_order\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"ordering\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOrdering\u003c/span\u003e \u003ca href=\"#ordering\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePosts within a series are ordered according to these rules:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eIf \u003cstrong\u003eany\u003c/strong\u003e post has \u003ccode\u003eseries_order\u003c/code\u003e, sort by \u003ccode\u003eseries_order\u003c/code\u003e ascending\u003c/li\u003e\n\u003cli\u003ePosts without \u003ccode\u003eseries_order\u003c/code\u003e in a mixed series are placed after ordered posts, sorted by date\u003c/li\u003e\n\u003cli\u003eIf \u003cstrong\u003eno\u003c/strong\u003e post has \u003ccode\u003eseries_order\u003c/code\u003e, sort by date ascending (oldest first)\u003c/li\u003e\n\u003cli\u003eTies are broken by file path for deterministic ordering\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eSeries default to ascending order (oldest/lowest first) because they are meant to be read from beginning to end, unlike blog feeds which show newest first.\u003c/p\u003e\n\u003ch3 id=\"example-date-based-ordering\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample: Date-based ordering\u003c/span\u003e \u003ca href=\"#example-date-based-ordering\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen no \u003ccode\u003eseries_order\u003c/code\u003e is specified, posts are ordered by date:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# part-1.md (2024-01-01) -\u0026gt; Position 1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Setup\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;go-tutorial\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-01\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# part-2.md (2024-01-15) -\u0026gt; Position 2\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Basics\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;go-tutorial\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# part-3.md (2024-02-01) -\u0026gt; Position 3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Advanced\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;go-tutorial\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-02-01\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"example-explicit-ordering\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample: Explicit ordering\u003c/span\u003e \u003ca href=\"#example-explicit-ordering\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse \u003ccode\u003eseries_order\u003c/code\u003e when you want control over the sequence regardless of dates:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# intro.md -\u0026gt; Position 1 (despite being written last)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Introduction\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;go-tutorial\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries_order\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-03-01\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# basics.md -\u0026gt; Position 2\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;The Basics\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;go-tutorial\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries_order\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-01\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"navigation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNavigation\u003c/span\u003e \u003ca href=\"#navigation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"feed-sidebar\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Sidebar\u003c/span\u003e \u003ca href=\"#feed-sidebar\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen a post belongs to a series, a sidebar automatically appears showing all posts as a table of contents. The current post is highlighted.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e+---------------------------+\n|  Building a REST API      |\n|  --------------------     |\n|  1. Project Setup      \u0026lt;  |  \u0026lt;- current post\n|  2. Database Models       |\n|  3. Handlers              |\n|  4. Auth \u0026amp; Middleware     |\n|  5. Testing \u0026amp; Deploy      |\n|                           |\n|  Part 1 of 5              |\n+---------------------------+\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe series sidebar \u003cstrong\u003etakes precedence\u003c/strong\u003e over any other feed sidebar. If a post has \u003ccode\u003eseries\u003c/code\u003e frontmatter, the series sidebar is shown instead of feed-based sidebars.\u003c/p\u003e\n\u003ch3 id=\"prev-next-links\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrev/Next Links\u003c/span\u003e \u003ca href=\"#prev-next-links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSeries posts get prev/next navigation that follows series order. The first post has no \u0026ldquo;previous\u0026rdquo; link, and the last post has no \u0026ldquo;next\u0026rdquo; link.\u003c/p\u003e\n\u003cp\u003eA \u0026ldquo;View All\u0026rdquo; link points to the series index page.\u003c/p\u003e\n\u003ch3 id=\"keyboard-shortcuts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKeyboard Shortcuts\u003c/span\u003e \u003ca href=\"#keyboard-shortcuts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eKey\u003c/th\u003e\n\u003cth\u003eAction\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e[\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNavigate to previous post in series\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNavigate to next post in series\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThese use the existing keyboard navigation infrastructure.\u003c/p\u003e\n\u003ch3 id=\"position-indicator\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePosition Indicator\u003c/span\u003e \u003ca href=\"#position-indicator\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePosts show their position in the series. In templates:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003ePart {{ post.PrevNextContext.Position }} of {{ post.PrevNextContext.Total }}\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"output\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOutput\u003c/span\u003e \u003ca href=\"#output\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor a series named \u003ccode\u003ebuilding-a-rest-api\u003c/code\u003e, the following files are generated:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eoutput/\n  series/\n    building-a-rest-api/\n      index.html       # Series listing page\n      simple/\n        index.html     # Simple list view\n      rss.xml          # RSS feed\n      atom.xml         # Atom feed\n      feed.json        # JSON feed\n      sitemap.xml      # Sitemap\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe index page lists all posts in order with their titles and descriptions.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSeries work with zero configuration \u0026ndash; just add \u003ccode\u003eseries\u003c/code\u003e to your frontmatter. For advanced use cases, you can customize behavior in \u003ccode\u003emarkata-go.toml\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"global-series-defaults\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGlobal Series Defaults\u003c/span\u003e \u003ca href=\"#global-series-defaults\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug_prefix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;series\u0026#34;\u003c/span\u003e        \u003cspan class=\"c\"\u003e# URL prefix (default: \u0026#34;series\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_sidebar\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e            \u003cspan class=\"c\"\u003e# Auto-enable sidebar (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefaults\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e             \u003cspan class=\"c\"\u003e# No pagination (default: 0 = show all)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esidebar\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# Show sidebar on series posts (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esimple_html\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esitemap\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"per-series-overrides\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePer-Series Overrides\u003c/span\u003e \u003ca href=\"#per-series-overrides\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOverride settings for a specific series:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eoverrides\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;building-a-rest-api\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Building a REST API with Go\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;A complete guide from zero to production\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eoverrides\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;building-a-rest-api\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                \u003cspan class=\"c\"\u003e# Also generate markdown for this series\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"series-vs-feed-defaults\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSeries vs Feed Defaults\u003c/span\u003e \u003ca href=\"#series-vs-feed-defaults\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSeries have different defaults than regular feeds:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSetting\u003c/th\u003e\n\u003cth\u003eSeries Default\u003c/th\u003e\n\u003cth\u003eFeed Default\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eitems_per_page\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e0 (no pagination)\u003c/td\u003e\n\u003ctd\u003e10\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esidebar\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003etrue\u003c/td\u003e\n\u003ctd\u003efalse\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etype\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;series\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;blog\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ereverse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003efalse (ascending)\u003c/td\u003e\n\u003ctd\u003etrue (descending)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"template-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Variables\u003c/span\u003e \u003ca href=\"#template-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"post-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePost Templates\u003c/span\u003e \u003ca href=\"#post-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen a post belongs to a series:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Extra.series\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSeries identifier\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Extra.series_order\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eExplicit position (if set)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Extra.series_slug\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eFull series feed slug\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Extra.series_total\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eTotal posts in series\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Prev\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePost\u003c/td\u003e\n\u003ctd\u003ePrevious post in series\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Next\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePost\u003c/td\u003e\n\u003ctd\u003eNext post in series\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.PrevNextFeed\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSeries feed slug\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.PrevNextContext.FeedSlug\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSeries feed slug\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.PrevNextContext.FeedTitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSeries title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.PrevNextContext.Position\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e1-indexed position\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.PrevNextContext.Total\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eTotal posts in series\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"example-series-banner\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample: Series Banner\u003c/span\u003e \u003ca href=\"#example-series-banner\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003e{% if post.Extra.series %}\n\u0026lt;div class=\u0026quot;series-banner\u0026quot;\u0026gt;\n    \u0026lt;h3\u0026gt;{{ post.PrevNextContext.FeedTitle }}\u0026lt;/h3\u0026gt;\n    \u0026lt;p\u0026gt;Part {{ post.PrevNextContext.Position }} of {{ post.PrevNextContext.Total }}\u0026lt;/p\u0026gt;\n    \u0026lt;a href=\u0026quot;/{{ post.PrevNextContext.FeedSlug }}/\u0026quot;\u0026gt;View all parts\u0026lt;/a\u0026gt;\n\u0026lt;/div\u0026gt;\n{% endif %}\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"edge-cases\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEdge Cases\u003c/span\u003e \u003ca href=\"#edge-cases\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"unpublished-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUnpublished Posts\u003c/span\u003e \u003ca href=\"#unpublished-posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePosts with \u003ccode\u003epublished: false\u003c/code\u003e are excluded from the series feed output but still count for ordering purposes. Prev/next links skip unpublished posts.\u003c/p\u003e\n\u003cp\u003ePrivate posts are treated as unpublished for series navigation and output.\u003c/p\u003e\n\u003ch3 id=\"single-post-series\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSingle-Post Series\u003c/span\u003e \u003ca href=\"#single-post-series\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eA series with one post is valid. No prev/next navigation is generated, but the sidebar and index page are still created.\u003c/p\u003e\n\u003ch3 id=\"empty-series\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEmpty Series\u003c/span\u003e \u003ca href=\"#empty-series\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf all posts in a series are unpublished or in draft, no series feed is generated.\u003c/p\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/feeds/\"\u003eFeeds Guide\u003c/a\u003e - The underlying feed system\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/frontmatter/\"\u003eFrontmatter Guide\u003c/a\u003e - All frontmatter fields\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/sidebars/\"\u003eSidebar Guide\u003c/a\u003e - Sidebar configuration\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/keyboard-navigation/\"\u003eKeyboard Navigation\u003c/a\u003e - Navigation shortcuts\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n## Series\n\nSeries are **ordered collections of posts meant to be read sequentially**. They are perfect for multi-part tutorials, article series, and course chapters.\n\nA series automatically generates a feed with an index page, RSS/Atom feeds, sidebar navigation, prev/next links, and keyboard shortcuts -- all from a single frontmatter field.\n\n## Quick Start\n\nAdd `series` to your post's frontmatter:\n\n```yaml\n---\ntitle: \"Building a REST API - Part 1: Setup\"\nseries: \"building-a-rest-api\"\n---\n```\n\nThat's it. All posts with the same `series` value are automatically grouped, ordered by date, and given navigation.\n\n## How It Works\n\n```\n  Frontmatter                 Auto-Generated Feed              Output\n  +--------------+            +------------------+           +------------------+\n  | series:      |            | slug: series/X   |           | /series/X/       |\n  |   \"rest-api\" |---scan---\u003e| type: series     |--render--\u003e|   index.html     |\n  | series_order:|            | sort: order/date |           |   rss.xml        |\n  |   1          |            | sidebar: true    |           |   atom.xml       |\n  +--------------+            +------------------+           |   feed.json      |\n                                                              +------------------+\n```\n\nThe series plugin scans all posts during the build's **Collect** stage, groups them by series name, sorts them, and injects feed configurations. The feeds plugin then generates all the output formats.\n\n## Frontmatter Fields\n\n### `series` (required)\n\nThe series identifier. Becomes the URL slug (prefixed with `series/`).\n\n```yaml\nseries: \"building-a-rest-api\"\n```\n\nThe value is slugified, so `\"Building a REST API\"` and `\"building-a-rest-api\"` are treated as the same series.\n\nA post can belong to **at most one series**.\n\n### `series_order` (optional)\n\nExplicit position in the series (1-indexed).\n\n```yaml\nseries: \"building-a-rest-api\"\nseries_order: 1\n```\n\n## Ordering\n\nPosts within a series are ordered according to these rules:\n\n1. If **any** post has `series_order`, sort by `series_order` ascending\n2. Posts without `series_order` in a mixed series are placed after ordered posts, sorted by date\n3. If **no** post has `series_order`, sort by date ascending (oldest first)\n4. Ties are broken by file path for deterministic ordering\n\nSeries default to ascending order (oldest/lowest first) because they are meant to be read from beginning to end, unlike blog feeds which show newest first.\n\n### Example: Date-based ordering\n\nWhen no `series_order` is specified, posts are ordered by date:\n\n```yaml\n# part-1.md (2024-01-01) -\u003e Position 1\n---\ntitle: \"Setup\"\nseries: \"go-tutorial\"\ndate: 2024-01-01\n---\n\n# part-2.md (2024-01-15) -\u003e Position 2\n---\ntitle: \"Basics\"\nseries: \"go-tutorial\"\ndate: 2024-01-15\n---\n\n# part-3.md (2024-02-01) -\u003e Position 3\n---\ntitle: \"Advanced\"\nseries: \"go-tutorial\"\ndate: 2024-02-01\n---\n```\n\n### Example: Explicit ordering\n\nUse `series_order` when you want control over the sequence regardless of dates:\n\n```yaml\n# intro.md -\u003e Position 1 (despite being written last)\n---\ntitle: \"Introduction\"\nseries: \"go-tutorial\"\nseries_order: 1\ndate: 2024-03-01\n---\n\n# basics.md -\u003e Position 2\n---\ntitle: \"The Basics\"\nseries: \"go-tutorial\"\nseries_order: 2\ndate: 2024-01-01\n---\n```\n\n## Navigation\n\n### Feed Sidebar\n\nWhen a post belongs to a series, a sidebar automatically appears showing all posts as a table of contents. The current post is highlighted.\n\n```\n+---------------------------+\n|  Building a REST API      |\n|  --------------------     |\n|  1. Project Setup      \u003c  |  \u003c- current post\n|  2. Database Models       |\n|  3. Handlers              |\n|  4. Auth \u0026 Middleware     |\n|  5. Testing \u0026 Deploy      |\n|                           |\n|  Part 1 of 5              |\n+---------------------------+\n```\n\nThe series sidebar **takes precedence** over any other feed sidebar. If a post has `series` frontmatter, the series sidebar is shown instead of feed-based sidebars.\n\n### Prev/Next Links\n\nSeries posts get prev/next navigation that follows series order. The first post has no \"previous\" link, and the last post has no \"next\" link.\n\nA \"View All\" link points to the series index page.\n\n### Keyboard Shortcuts\n\n| Key | Action |\n|-----|--------|\n| `[` | Navigate to previous post in series |\n| `]` | Navigate to next post in series |\n\nThese use the existing keyboard navigation infrastructure.\n\n### Position Indicator\n\nPosts show their position in the series. In templates:\n\n```jinja2\nPart {{ post.PrevNextContext.Position }} of {{ post.PrevNextContext.Total }}\n```\n\n## Output\n\nFor a series named `building-a-rest-api`, the following files are generated:\n\n```\noutput/\n  series/\n    building-a-rest-api/\n      index.html       # Series listing page\n      simple/\n        index.html     # Simple list view\n      rss.xml          # RSS feed\n      atom.xml         # Atom feed\n      feed.json        # JSON feed\n      sitemap.xml      # Sitemap\n```\n\nThe index page lists all posts in order with their titles and descriptions.\n\n## Configuration\n\nSeries work with zero configuration -- just add `series` to your frontmatter. For advanced use cases, you can customize behavior in `markata-go.toml`.\n\n### Global Series Defaults\n\n```toml\n[markata-go.series]\nslug_prefix = \"series\"        # URL prefix (default: \"series\")\nauto_sidebar = true            # Auto-enable sidebar (default: true)\n\n[markata-go.series.defaults]\nitems_per_page = 0             # No pagination (default: 0 = show all)\nsidebar = true                 # Show sidebar on series posts (default: true)\n\n[markata-go.series.defaults.formats]\nhtml = true\nsimple_html = true\nrss = true\natom = true\njson = true\nsitemap = true\n```\n\n### Per-Series Overrides\n\nOverride settings for a specific series:\n\n```toml\n[markata-go.series.overrides.\"building-a-rest-api\"]\ntitle = \"Building a REST API with Go\"\ndescription = \"A complete guide from zero to production\"\n\n[markata-go.series.overrides.\"building-a-rest-api\".formats]\nmarkdown = true                # Also generate markdown for this series\n```\n\n### Series vs Feed Defaults\n\nSeries have different defaults than regular feeds:\n\n| Setting | Series Default | Feed Default |\n|---------|---------------|--------------|\n| `items_per_page` | 0 (no pagination) | 10 |\n| `sidebar` | true | false |\n| `type` | `\"series\"` | `\"blog\"` |\n| `reverse` | false (ascending) | true (descending) |\n\n## Template Variables\n\n### Post Templates\n\nWhen a post belongs to a series:\n\n| Variable | Type | Description |\n|----------|------|-------------|\n| `post.Extra.series` | string | Series identifier |\n| `post.Extra.series_order` | int | Explicit position (if set) |\n| `post.Extra.series_slug` | string | Full series feed slug |\n| `post.Extra.series_total` | int | Total posts in series |\n| `post.Prev` | Post | Previous post in series |\n| `post.Next` | Post | Next post in series |\n| `post.PrevNextFeed` | string | Series feed slug |\n| `post.PrevNextContext.FeedSlug` | string | Series feed slug |\n| `post.PrevNextContext.FeedTitle` | string | Series title |\n| `post.PrevNextContext.Position` | int | 1-indexed position |\n| `post.PrevNextContext.Total` | int | Total posts in series |\n\n### Example: Series Banner\n\n```jinja2\n{% if post.Extra.series %}\n\u003cdiv class=\"series-banner\"\u003e\n    \u003ch3\u003e{{ post.PrevNextContext.FeedTitle }}\u003c/h3\u003e\n    \u003cp\u003ePart {{ post.PrevNextContext.Position }} of {{ post.PrevNextContext.Total }}\u003c/p\u003e\n    \u003ca href=\"/{{ post.PrevNextContext.FeedSlug }}/\"\u003eView all parts\u003c/a\u003e\n\u003c/div\u003e\n{% endif %}\n```\n\n## Edge Cases\n\n### Unpublished Posts\n\nPosts with `published: false` are excluded from the series feed output but still count for ordering purposes. Prev/next links skip unpublished posts.\n\nPrivate posts are treated as unpublished for series navigation and output.\n\n### Single-Post Series\n\nA series with one post is valid. No prev/next navigation is generated, but the sidebar and index page are still created.\n\n### Empty Series\n\nIf all posts in a series are unpublished or in draft, no series feed is generated.\n\n## See Also\n\n- [Feeds Guide](/docs/guides/feeds/) - The underlying feed system\n- [Frontmatter Guide](/docs/guides/frontmatter/) - All frontmatter fields\n- [Sidebar Guide](/docs/guides/sidebars/) - Sidebar configuration\n- [Keyboard Navigation](/docs/guides/keyboard-navigation/) - Navigation shortcuts\n",
      "summary": "Create ordered, multi-part post collections for tutorials, courses, and sequential reading",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "series",
        "feeds"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/search/",
      "url": "https://markata.dev/docs/guides/search/",
      "title": "Site Search",
      "content_html": "\u003cp\u003emarkata-go supports two search architectures:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://pagefind.app/\"\u003ePagefind\u003c/a\u003e for static, client-side search built into the generated site\u003c/li\u003e\n\u003cli\u003ebleve for server-backed search APIs that can run locally or on a separate host such as \u003ccode\u003esearch.example.com\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePagefind is the default search implementation. Bleve is the path for remote-hosted search, Kubernetes deployments, and future server-side search features.\u003c/p\u003e\n\u003ch2 id=\"choose-a-search-mode\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChoose a Search Mode\u003c/span\u003e \u003ca href=\"#choose-a-search-mode\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"pagefind\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePagefind\u003c/span\u003e \u003ca href=\"#pagefind\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse Pagefind when you want:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ea fully static site\u003c/li\u003e\n\u003cli\u003eno search server to operate\u003c/li\u003e\n\u003cli\u003esimple hosting on Netlify, Vercel, GitHub Pages, or object storage\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"bleve-search-server\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBleve Search Server\u003c/span\u003e \u003ca href=\"#bleve-search-server\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse bleve when you want:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ea search API hosted separately from the main site\u003c/li\u003e\n\u003cli\u003ea navbar that queries \u003ccode\u003ehttps://search.example.com/api/search\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eserver-side ranking and filtering\u003c/li\u003e\n\u003cli\u003eKubernetes deployments with independently scalable search pods\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe current bleve implementation already works well for local development and simple standalone hosting. The production roadmap adds read-only index mode, content watching, and stronger container ergonomics.\u003c/p\u003e\n\u003ch2 id=\"private-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrivate Posts\u003c/span\u003e \u003ca href=\"#private-posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBleve search treats private posts differently from public posts.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePrivate results may include an explicit frontmatter title.\u003c/li\u003e\n\u003cli\u003ePrivate results may include an explicit frontmatter description.\u003c/li\u003e\n\u003cli\u003ePrivate results keep the link fields needed to open the post.\u003c/li\u003e\n\u003cli\u003ePrivate results do not expose body content.\u003c/li\u003e\n\u003cli\u003ePrivate results do not expose image, cover, video, poster, or thumbnail URLs from frontmatter.\u003c/li\u003e\n\u003cli\u003ePrivate results do not expose tags, word count, or read time.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIf a private post has no explicit \u003ccode\u003etitle\u003c/code\u003e or \u003ccode\u003edescription\u003c/code\u003e in frontmatter, search does not synthesize those fields for the result.\u003c/p\u003e\n\u003ch2 id=\"features\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeatures\u003c/span\u003e \u003ca href=\"#features\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eEnabled by default\u003c/strong\u003e - Search works out of the box with no configuration\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAutomatic installation\u003c/strong\u003e - Pagefind binary is automatically downloaded if not found in PATH\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFast and lightweight\u003c/strong\u003e - Only loads the index chunks needed for each query\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOffline capable\u003c/strong\u003e - Works entirely client-side, no server required\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTheme integrated\u003c/strong\u003e - Automatically matches your site\u0026rsquo;s color palette\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNavbar overlay\u003c/strong\u003e - Results display above page content without being obscured by the current article\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSecure\u003c/strong\u003e - SHA256 checksum verification for all downloaded binaries\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSearch is enabled by default for all markata-go sites. Just build your site and the search will work:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build your site - Pagefind is automatically installed if needed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThat\u0026rsquo;s it! The search box appears in your navigation bar.\u003c/p\u003e\n\u003ch2 id=\"bleve-search-server-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBleve Search Server\u003c/span\u003e \u003ca href=\"#bleve-search-server-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe standalone search API is available through:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search-server\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eExample:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search-server --host 0.0.0.0 --port \u003cspan class=\"m\"\u003e3001\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search-server --mode watch-content\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search-server --mode read-only-index --index-dir /data/search.bleve\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe server exposes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/api/search\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/health\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"separate-search-host\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSeparate Search Host\u003c/span\u003e \u003ca href=\"#separate-search-host\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eYou can host search separately from the main site, for example:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003emain site: \u003ccode\u003ehttps://waylonwalker.com\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003esearch API: \u003ccode\u003ehttps://search.waylonwalker.com/api/search\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTo make that work cleanly, the site navbar needs a config-driven bleve endpoint and the search server must allow CORS from the main site origin.\u003c/p\u003e\n\u003cp\u003eRecommended CORS configuration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebleve\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecors_origins\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://waylonwalker.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe long-term production shape is:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ehost the site separately from the search API\u003c/li\u003e\n\u003cli\u003econfigure the navbar to query the remote bleve endpoint\u003c/li\u003e\n\u003cli\u003ekeep Pagefind as a fallback when no bleve endpoint is configured\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"server-modes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eServer Modes\u003c/span\u003e \u003ca href=\"#server-modes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe standalone bleve server currently supports three modes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eruntime-index\u003c/code\u003e builds or refreshes a local index from mounted content\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ewatch-content\u003c/code\u003e watches content/config roots and refreshes the local index when source files change\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eread-only-index\u003c/code\u003e serves a prebuilt index artifact without loading site content at runtime\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eOperational guidance:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ewatch-content\u003c/code\u003e is the best fit when each pod owns its own writable local index directory\u003c/li\u003e\n\u003cli\u003efor Kubernetes rolling updates, prefer pod-local writable storage for \u003ccode\u003ewatch-content\u003c/code\u003e so old pods can\nkeep serving while new pods pull images, build indexes, and warm search state\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eread-only-index\u003c/code\u003e remains the right fit when a separate builder/indexer publishes a shared artifact\u003c/li\u003e\n\u003cli\u003ereadiness should only succeed after the configured index has been opened or built so the first real\nquery does not pay a one-time cold-start penalty\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eExamples:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build a reusable index artifact\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search build-index --index-dir /data/search.bleve --hash-path /data/search.hash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Load content and keep a local index fresh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search-server --mode watch-content\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Serve only from a prebuilt read-only index\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go search-server --mode read-only-index --index-dir /data/search.bleve\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"automatic-pagefind-installation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAutomatic Pagefind Installation\u003c/span\u003e \u003ca href=\"#automatic-pagefind-installation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAs of markata-go v0.2.x, Pagefind is automatically downloaded and cached when you build your site. This eliminates the need for manual installation.\u003c/p\u003e\n\u003ch3 id=\"how-it-works\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow It Works\u003c/span\u003e \u003ca href=\"#how-it-works\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003emarkata-go checks if \u003ccode\u003epagefind\u003c/code\u003e is in your PATH\u003c/li\u003e\n\u003cli\u003eIf not found, it automatically downloads the appropriate binary for your platform\u003c/li\u003e\n\u003cli\u003eThe binary is verified using SHA256 checksums from official GitHub releases\u003c/li\u003e\n\u003cli\u003eDownloaded binaries are cached in \u003ccode\u003e~/.cache/markata-go/bin/\u003c/code\u003e for future builds\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"supported-platforms\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSupported Platforms\u003c/span\u003e \u003ca href=\"#supported-platforms\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOS\u003c/th\u003e\n\u003cth\u003eArchitecture\u003c/th\u003e\n\u003cth\u003eStatus\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003emacOS\u003c/td\u003e\n\u003ctd\u003ex86_64 (Intel)\u003c/td\u003e\n\u003ctd\u003eSupported\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003emacOS\u003c/td\u003e\n\u003ctd\u003earm64 (Apple Silicon)\u003c/td\u003e\n\u003ctd\u003eSupported\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLinux\u003c/td\u003e\n\u003ctd\u003ex86_64\u003c/td\u003e\n\u003ctd\u003eSupported\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLinux\u003c/td\u003e\n\u003ctd\u003earm64\u003c/td\u003e\n\u003ctd\u003eSupported\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWindows\u003c/td\u003e\n\u003ctd\u003ex86_64\u003c/td\u003e\n\u003ctd\u003eSupported\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFreeBSD\u003c/td\u003e\n\u003ctd\u003ex86_64\u003c/td\u003e\n\u003ctd\u003eSupported\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"configuring-auto-installation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguring Auto-Installation\u003c/span\u003e \u003ca href=\"#configuring-auto-installation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epagefind\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Disable auto-install (requires manual Pagefind installation)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_install\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Pin to a specific version (default: \u0026#34;latest\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eversion\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;v1.4.0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Custom cache directory (default: XDG cache)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;~/.my-cache/pagefind/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"offline-environments\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOffline Environments\u003c/span\u003e \u003ca href=\"#offline-environments\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAfter the first build, Pagefind is cached locally. Subsequent builds work offline. For CI/CD environments, consider:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003ePre-cache in Docker image\u003c/strong\u003e: Include Pagefind in your CI image\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUse \u003ccode\u003eversion\u003c/code\u003e pinning\u003c/strong\u003e: Pin to a specific version for reproducible builds\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDisable auto-install\u003c/strong\u003e: Set \u003ccode\u003eauto_install = false\u003c/code\u003e and install manually\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"manual-installation-optional\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eManual Installation (Optional)\u003c/span\u003e \u003ca href=\"#manual-installation-optional\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf you prefer to install Pagefind manually or need to use a custom build:\u003c/p\u003e\n\u003ch3 id=\"npm-recommended\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003enpm (Recommended)\u003c/span\u003e \u003ca href=\"#npm-recommended\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpm install -g pagefind\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"homebrew-macos\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHomebrew (macOS)\u003c/span\u003e \u003ca href=\"#homebrew-macos\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew install pagefind\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"binary-download\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBinary Download\u003c/span\u003e \u003ca href=\"#binary-download\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDownload from \u003ca href=\"https://github.com/CloudCannon/pagefind/releases\"\u003ePagefind releases\u003c/a\u003e.\u003c/p\u003e\n\u003ch3 id=\"disabling-auto-install\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDisabling Auto-Install\u003c/span\u003e \u003ca href=\"#disabling-auto-install\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTo require manual installation:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epagefind\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_install\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf Pagefind is not installed and auto-install is disabled, markata-go logs a warning but continues building. The search UI will be hidden.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"search-backends\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSearch Backends\u003c/span\u003e \u003ca href=\"#search-backends\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePagefind remains the default backend today. The bleve server uses the same top-level search config plus additional server-side settings.\u003c/p\u003e\n\u003cp\u003ePlanned production-oriented bleve configuration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;navbar\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eplaceholder\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Search...\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebleve\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eendpoint\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://search.example.com/api/search\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efuzzy\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elimit\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_limit\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecors_origins\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen \u003ccode\u003eendpoint\u003c/code\u003e is configured, the navbar should use the bleve client instead of Pagefind. When it is not configured, the site should fall back to Pagefind.\u003c/p\u003e\n\u003ch3 id=\"basic-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Configuration\u003c/span\u003e \u003ca href=\"#basic-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigure search in your \u003ccode\u003emarkata-go.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Default: true\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;navbar\u0026#34;\u003c/span\u003e         \u003cspan class=\"c\"\u003e# Where to show search: navbar, sidebar, footer\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eplaceholder\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Search...\u0026#34;\u003c/span\u003e   \u003cspan class=\"c\"\u003e# Search input placeholder text\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"disable-search\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDisable Search\u003c/span\u003e \u003ca href=\"#disable-search\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTo disable search entirely:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"advanced-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdvanced Configuration\u003c/span\u003e \u003ca href=\"#advanced-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;navbar\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eplaceholder\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Search...\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eshow_images\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Show thumbnails in results (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexcerpt_length\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e200\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Characters for result excerpts (default: 200)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Pagefind CLI options\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epagefind\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebundle_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;_pagefind\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Output directory for index (default: \u0026#34;_pagefind\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eroot_selector\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;main\u0026#34;\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Element containing searchable content\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude_selectors\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e       \u003cspan class=\"c\"\u003e# Elements to exclude from indexing\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;.no-search\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;nav\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;footer\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Auto-installation options\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_install\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e         \u003cspan class=\"c\"\u003e# Automatically download Pagefind (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eversion\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;latest\u0026#34;\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Version to install (default: \u0026#34;latest\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Custom cache directory (default: XDG cache)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"search-positions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSearch Positions\u003c/span\u003e \u003ca href=\"#search-positions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ccode\u003eposition\u003c/code\u003e option controls where the search UI appears:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePosition\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enavbar\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRight side of the navigation bar (default)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esidebar\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eIn the sidebar (if enabled)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efooter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eIn the footer section\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecustom\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHidden; use for custom placement via templates\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"custom-placement\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Placement\u003c/span\u003e \u003ca href=\"#custom-placement\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor full control over search placement, set \u003ccode\u003eposition = \u0026quot;custom\u0026quot;\u003c/code\u003e and include the search component manually in your templates:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% include \u0026#34;components/search.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"what-gets-indexed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat Gets Indexed\u003c/span\u003e \u003ca href=\"#what-gets-indexed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"pagefind-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePagefind\u003c/span\u003e \u003ca href=\"#pagefind-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBy default, Pagefind indexes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ePost content\u003c/strong\u003e - The main article body\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTitle\u003c/strong\u003e - Displayed in search results\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDescription\u003c/strong\u003e - Shown as result excerpt\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTags\u003c/strong\u003e - Available as filters\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFeed membership\u003c/strong\u003e - Available as filters\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"excluding-content-from-search\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExcluding Content from Search\u003c/span\u003e \u003ca href=\"#excluding-content-from-search\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"via-frontmatter\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVia Frontmatter\u003c/span\u003e \u003ca href=\"#via-frontmatter\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eExclude a post from the search index:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Draft Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003esearch_exclude\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"via-css-classes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVia CSS Classes\u003c/span\u003e \u003ca href=\"#via-css-classes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eContent with \u003ccode\u003edata-pagefind-ignore\u003c/code\u003e is excluded:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003edata-pagefind-ignore\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    This content won\u0026#39;t be indexed\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"privacy-rules-for-bleve\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrivacy Rules for Bleve\u003c/span\u003e \u003ca href=\"#privacy-rules-for-bleve\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBleve search follows stricter privacy rules than a generic full-text index.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edraft and skipped posts are excluded entirely\u003c/li\u003e\n\u003cli\u003eprivate posts may be searchable by intentionally public metadata such as title, description, tags, and date\u003c/li\u003e\n\u003cli\u003eprivate post body content is never indexed\u003c/li\u003e\n\u003cli\u003eprivate media URLs are never exposed in bleve search results\u003c/li\u003e\n\u003cli\u003eprivate descriptions shown in search results must be explicit public metadata, not body-derived excerpts\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThis allows users to discover an encrypted post by title or tags while still requiring decryption to read the protected content.\u003c/p\u003e\n\u003ch2 id=\"search-results\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSearch Results\u003c/span\u003e \u003ca href=\"#search-results\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"pagefind-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePagefind\u003c/span\u003e \u003ca href=\"#pagefind-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eResults include:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTitle\u003c/strong\u003e - Clickable link to the post\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eExcerpt\u003c/strong\u003e - Highlighted text showing where the match was found\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eThumbnail\u003c/strong\u003e - Post image (if available and \u003ccode\u003eshow_images\u003c/code\u003e is enabled)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"filtering-results\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFiltering Results\u003c/span\u003e \u003ca href=\"#filtering-results\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePagefind supports filtering by metadata. Users can click on tags or feeds in results to filter.\u003c/p\u003e\n\u003ch3 id=\"bleve\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBleve\u003c/span\u003e \u003ca href=\"#bleve\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBleve result payloads currently include:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003etitle\u003c/li\u003e\n\u003cli\u003ehref\u003c/li\u003e\n\u003cli\u003edescription\u003c/li\u003e\n\u003cli\u003edate\u003c/li\u003e\n\u003cli\u003etags\u003c/li\u003e\n\u003cli\u003eread time\u003c/li\u003e\n\u003cli\u003emedia for non-private posts only\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe bleve navbar UI currently renders a compact card-style dropdown. It does not yet provide the same highlighted excerpt behavior as Pagefind.\u003c/p\u003e\n\u003ch2 id=\"theming\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTheming\u003c/span\u003e \u003ca href=\"#theming\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe search UI automatically inherits your site\u0026rsquo;s theme colors through CSS variables:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003eroot\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003e--pagefind-ui-primary\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eprimary\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003e--pagefind-ui-text\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003e--pagefind-ui-background\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003esurface\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003e--pagefind-ui-border\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eborder\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"custom-styling\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Styling\u003c/span\u003e \u003ca href=\"#custom-styling\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOverride Pagefind styles in your custom CSS:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Larger search input */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003epagefind-ui__search-input\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efont-size\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e1.1\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003epadding\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.75\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Wider results dropdown */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003esearch--navbar\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003epagefind-ui__results\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ewidth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e500\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"keyboard-navigation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKeyboard Navigation\u003c/span\u003e \u003ca href=\"#keyboard-navigation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe current bleve navbar implementation supports:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/\u003c/code\u003e to focus search\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eEscape\u003c/code\u003e to dismiss results\u003c/li\u003e\n\u003cli\u003earrow keys to move through results\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eEnter\u003c/code\u003e to open the active result\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eTab\u003c/code\u003e and \u003ccode\u003eShift+Tab\u003c/code\u003e to move between the input and result links\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePagefind behavior depends on the upstream Pagefind UI implementation plus markata-go shortcut integration.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eKey\u003c/th\u003e\n\u003cth\u003eAction\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFocus search input (when implemented)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eEnter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGo to first result\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e↑\u003c/code\u003e / \u003ccode\u003e↓\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNavigate results\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eEscape\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eClose results dropdown\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"performance\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePerformance\u003c/span\u003e \u003ca href=\"#performance\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePagefind is highly optimized:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eIndex size\u003c/strong\u003e: ~1KB per page indexed\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eInitial load\u003c/strong\u003e: Only loads the search UI (~10KB)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOn search\u003c/strong\u003e: Loads only relevant index chunks\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCaching\u003c/strong\u003e: Results cached for repeated queries\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"large-sites\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLarge Sites\u003c/span\u003e \u003ca href=\"#large-sites\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor sites with thousands of pages, Pagefind handles it efficiently:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIndex is split into chunks\u003c/li\u003e\n\u003cli\u003eOnly relevant chunks are loaded per query\u003c/li\u003e\n\u003cli\u003eTypical search latency: 10-50ms\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"bleve-result-is-missing-from-the-navbar\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBleve result is missing from the navbar\u003c/span\u003e \u003ca href=\"#bleve-result-is-missing-from-the-navbar\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe current bleve navbar UI shows a limited number of results. A result may exist in the API response but rank below the visible dropdown cutoff for broad queries.\u003c/p\u003e\n\u003cp\u003eCheck the API directly:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl \u003cspan class=\"s2\"\u003e\u0026#34;http://localhost:3001/api/search?q=kubernetes\u0026amp;limit=30\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf the result is present in the API but missing from the dropdown, increase the navbar result count or improve ranking for exact title and slug matches.\u003c/p\u003e\n\u003ch3 id=\"private-content-is-leaking-through-search\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrivate content is leaking through search\u003c/span\u003e \u003ca href=\"#private-content-is-leaking-through-search\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBleve should never expose private body content or private media.\u003c/p\u003e\n\u003cp\u003eCheck these first:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eIs the text an explicit frontmatter \u003ccode\u003edescription\u003c/code\u003e? Those are intentionally public metadata.\u003c/li\u003e\n\u003cli\u003eIs the leaked field a media URL, poster URL, or body-derived excerpt? That is a bug and should be fixed in the search API or indexer.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003ePrivate posts should be discoverable by public metadata only.\u003c/p\u003e\n\u003ch3 id=\"search-server-did-not-update-after-content-changed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSearch server did not update after content changed\u003c/span\u003e \u003ca href=\"#search-server-did-not-update-after-content-changed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe current standalone \u003ccode\u003esearch-server\u003c/code\u003e snapshots posts at startup.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003echanging content on disk does not automatically update the running server\u003c/li\u003e\n\u003cli\u003erestart the server after content changes\u003c/li\u003e\n\u003cli\u003efuture \u003ccode\u003ewatch-content\u003c/code\u003e mode is intended to close this gap\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFor production today, prefer a restart-on-deploy model.\u003c/p\u003e\n\u003ch3 id=\"shared-pvc-or-multiple-pods\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eShared PVC or multiple pods\u003c/span\u003e \u003ca href=\"#shared-pvc-or-multiple-pods\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDo not rely on multiple processes mutating the same writable bleve index directory.\u003c/p\u003e\n\u003cp\u003eSafer patterns:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eone search pod with local writable cache\u003c/li\u003e\n\u003cli\u003emany search pods, each with its own writable local cache\u003c/li\u003e\n\u003cli\u003eone builder job producing a read-only index artifact consumed by many search pods\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"search-box-not-appearing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSearch box not appearing\u003c/span\u003e \u003ca href=\"#search-box-not-appearing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck build logs for Pagefind output:\u003c/strong\u003e\nLook for \u003ccode\u003e[pagefind]\u003c/code\u003e messages indicating download or execution.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerify search is enabled:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Should be true (default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck network connectivity:\u003c/strong\u003e\nIf auto-install is enabled and Pagefind isn\u0026rsquo;t cached, internet access is required.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"auto-install-failing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuto-install failing\u003c/span\u003e \u003ca href=\"#auto-install-failing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eNetwork issues:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epagefind install error during download: failed to download asset\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eCheck your internet connection or firewall settings.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUnsupported platform:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epagefind install error during platform_detection: unsupported operating system\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eInstall Pagefind manually for unsupported platforms.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eChecksum verification failure:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epagefind install error during verify: checksum mismatch\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis is a security feature. Try clearing the cache:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erm -rf ~/.cache/markata-go/bin/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eFallback to manual installation:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epagefind\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_install\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen install Pagefind manually via npm, Homebrew, or direct download.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"no-search-results\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNo search results\u003c/span\u003e \u003ca href=\"#no-search-results\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck if content has \u003ccode\u003edata-pagefind-body\u003c/code\u003e:\u003c/strong\u003e\nThe default post template includes this. Custom templates need it too.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerify posts are published:\u003c/strong\u003e\nDraft posts (\u003ccode\u003epublished: false\u003c/code\u003e) may not be indexed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck exclude selectors:\u003c/strong\u003e\nEnsure your content isn\u0026rsquo;t excluded by \u003ccode\u003eexclude_selectors\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"search-results-missing-content\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSearch results missing content\u003c/span\u003e \u003ca href=\"#search-results-missing-content\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck \u003ccode\u003eroot_selector\u003c/code\u003e:\u003c/strong\u003e\nIf set, only content within that selector is indexed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerify template structure:\u003c/strong\u003e\nContent must be within \u003ccode\u003edata-pagefind-body\u003c/code\u003e element.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"feed-specific-search\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed-Specific Search\u003c/span\u003e \u003ca href=\"#feed-specific-search\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor sites with multiple content types, you can configure feed-specific search instances:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;navbar\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Feed-specific search instances\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;guides\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published \u0026amp;\u0026amp; feed:guides\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;sidebar\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eplaceholder\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Search guides...\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published \u0026amp;\u0026amp; feed:blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;navbar\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eplaceholder\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Search blog...\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"ci-cd-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCI/CD Integration\u003c/span\u003e \u003ca href=\"#ci-cd-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThanks to automatic Pagefind installation, CI/CD setup is simpler than ever.\u003c/p\u003e\n\u003ch3 id=\"github-actions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGitHub Actions\u003c/span\u003e \u003ca href=\"#github-actions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Pagefind auto-installs\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr pin to a specific version for reproducible builds:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_SEARCH_PAGEFIND_VERSION\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ev1.4.0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"netlify\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNetlify\u003c/span\u003e \u003ca href=\"#netlify\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd to your \u003ccode\u003enetlify.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003ecommand\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;markata-go build\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"vercel\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVercel\u003c/span\u003e \u003ca href=\"#vercel\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd to your \u003ccode\u003evercel.json\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;buildCommand\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;markata-go build\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"docker\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocker\u003c/span\u003e \u003ca href=\"#docker\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePagefind is automatically cached. For faster builds, you can pre-install:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Option 1: Let auto-install handle it (simple)\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e markata-go build\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Option 2: Pre-install for faster CI\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e npm install -g pagefind\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e markata-go build\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"search-server-containers\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSearch Server Containers\u003c/span\u003e \u003ca href=\"#search-server-containers\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe current \u003ccode\u003esearch-server\u003c/code\u003e works best in a restart-on-deploy model.\u003c/p\u003e\n\u003cp\u003eRecommended today:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003emount content and config into the container\u003c/li\u003e\n\u003cli\u003egive the server a writable local cache directory\u003c/li\u003e\n\u003cli\u003erestart or redeploy search pods when content changes\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eRecommended long-term production architecture:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ebuilder pod or CI job creates the bleve index artifact\u003c/li\u003e\n\u003cli\u003esearch pods mount that artifact read-only\u003c/li\u003e\n\u003cli\u003esearch pods run in \u003ccode\u003eread-only-index\u003c/code\u003e mode\u003c/li\u003e\n\u003cli\u003ethe main site navbar queries the remote API\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThis avoids shared writable index problems and makes horizontal scaling safer.\u003c/p\u003e\n\u003ch2 id=\"how-it-works-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow It Works\u003c/span\u003e \u003ca href=\"#how-it-works-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"pagefind-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePagefind\u003c/span\u003e \u003ca href=\"#pagefind-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eBuild stage\u003c/strong\u003e: markata-go generates HTML files with \u003ccode\u003edata-pagefind-*\u003c/code\u003e attributes\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCleanup stage\u003c/strong\u003e: PagefindPlugin runs \u003ccode\u003epagefind\u003c/code\u003e CLI to index the output directory\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eIndex generation\u003c/strong\u003e: Pagefind creates optimized search index in \u003ccode\u003e_pagefind/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRuntime\u003c/strong\u003e: Pagefind JS loads the index and handles search queries client-side\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"bleve-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBleve\u003c/span\u003e \u003ca href=\"#bleve-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eStartup\u003c/strong\u003e: \u003ccode\u003esearch-server\u003c/code\u003e loads config and content\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eIndexing\u003c/strong\u003e: bleve index is built or opened from cache\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRuntime\u003c/strong\u003e: the navbar search UI queries \u003ccode\u003e/api/search\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eResults\u003c/strong\u003e: the API returns ranked JSON results with privacy filtering applied\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003ePlanned future modes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eruntime-index\u003c/code\u003e for simple deployments\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ewatch-content\u003c/code\u003e for long-running local-writer servers\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eread-only-index\u003c/code\u003e for builder-produced index artifacts and load-balanced search pods\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfiguration Reference\u003c/a\u003e - Full configuration options\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/themes/\"\u003eThemes\u003c/a\u003e - Customize search appearance\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://pagefind.app/docs/\"\u003ePagefind Documentation\u003c/a\u003e - Official Pagefind docs\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eNavbar search reserves its dimensions in the initial stylesheet. Search\ninitialization and SPA navigation do not force a layout read or broadcast a\nresize event. Real viewport changes still resize the navbar normally.\u003c/p\u003e\n",
      "content_text": "\n\nmarkata-go supports two search architectures:\n\n- [Pagefind](https://pagefind.app/) for static, client-side search built into the generated site\n- bleve for server-backed search APIs that can run locally or on a separate host such as `search.example.com`\n\nPagefind is the default search implementation. Bleve is the path for remote-hosted search, Kubernetes deployments, and future server-side search features.\n\n## Choose a Search Mode\n\n### Pagefind\n\nUse Pagefind when you want:\n\n- a fully static site\n- no search server to operate\n- simple hosting on Netlify, Vercel, GitHub Pages, or object storage\n\n### Bleve Search Server\n\nUse bleve when you want:\n\n- a search API hosted separately from the main site\n- a navbar that queries `https://search.example.com/api/search`\n- server-side ranking and filtering\n- Kubernetes deployments with independently scalable search pods\n\nThe current bleve implementation already works well for local development and simple standalone hosting. The production roadmap adds read-only index mode, content watching, and stronger container ergonomics.\n\n## Private Posts\n\nBleve search treats private posts differently from public posts.\n\n- Private results may include an explicit frontmatter title.\n- Private results may include an explicit frontmatter description.\n- Private results keep the link fields needed to open the post.\n- Private results do not expose body content.\n- Private results do not expose image, cover, video, poster, or thumbnail URLs from frontmatter.\n- Private results do not expose tags, word count, or read time.\n\nIf a private post has no explicit `title` or `description` in frontmatter, search does not synthesize those fields for the result.\n\n## Features\n\n- **Enabled by default** - Search works out of the box with no configuration\n- **Automatic installation** - Pagefind binary is automatically downloaded if not found in PATH\n- **Fast and lightweight** - Only loads the index chunks needed for each query\n- **Offline capable** - Works entirely client-side, no server required\n- **Theme integrated** - Automatically matches your site's color palette\n- **Navbar overlay** - Results display above page content without being obscured by the current article\n- **Secure** - SHA256 checksum verification for all downloaded binaries\n\n## Quick Start\n\nSearch is enabled by default for all markata-go sites. Just build your site and the search will work:\n\n```bash\n# Build your site - Pagefind is automatically installed if needed\nmarkata-go build\n```\n\nThat's it! The search box appears in your navigation bar.\n\n## Bleve Search Server\n\nThe standalone search API is available through:\n\n```bash\nmarkata-go search-server\n```\n\nExample:\n\n```bash\nmarkata-go search-server --host 0.0.0.0 --port 3001\nmarkata-go search-server --mode watch-content\nmarkata-go search-server --mode read-only-index --index-dir /data/search.bleve\n```\n\nThe server exposes:\n\n- `/api/search`\n- `/health`\n\n### Separate Search Host\n\nYou can host search separately from the main site, for example:\n\n- main site: `https://waylonwalker.com`\n- search API: `https://search.waylonwalker.com/api/search`\n\nTo make that work cleanly, the site navbar needs a config-driven bleve endpoint and the search server must allow CORS from the main site origin.\n\nRecommended CORS configuration:\n\n```toml\n[search.bleve]\ncors_origins = [\"https://waylonwalker.com\"]\n```\n\nThe long-term production shape is:\n\n1. host the site separately from the search API\n2. configure the navbar to query the remote bleve endpoint\n3. keep Pagefind as a fallback when no bleve endpoint is configured\n\n### Server Modes\n\nThe standalone bleve server currently supports three modes:\n\n- `runtime-index` builds or refreshes a local index from mounted content\n- `watch-content` watches content/config roots and refreshes the local index when source files change\n- `read-only-index` serves a prebuilt index artifact without loading site content at runtime\n\nOperational guidance:\n\n- `watch-content` is the best fit when each pod owns its own writable local index directory\n- for Kubernetes rolling updates, prefer pod-local writable storage for `watch-content` so old pods can\n  keep serving while new pods pull images, build indexes, and warm search state\n- `read-only-index` remains the right fit when a separate builder/indexer publishes a shared artifact\n- readiness should only succeed after the configured index has been opened or built so the first real\n  query does not pay a one-time cold-start penalty\n\nExamples:\n\n```bash\n# Build a reusable index artifact\nmarkata-go search build-index --index-dir /data/search.bleve --hash-path /data/search.hash\n\n# Load content and keep a local index fresh\nmarkata-go search-server --mode watch-content\n\n# Serve only from a prebuilt read-only index\nmarkata-go search-server --mode read-only-index --index-dir /data/search.bleve\n```\n\n## Automatic Pagefind Installation\n\nAs of markata-go v0.2.x, Pagefind is automatically downloaded and cached when you build your site. This eliminates the need for manual installation.\n\n### How It Works\n\n1. markata-go checks if `pagefind` is in your PATH\n2. If not found, it automatically downloads the appropriate binary for your platform\n3. The binary is verified using SHA256 checksums from official GitHub releases\n4. Downloaded binaries are cached in `~/.cache/markata-go/bin/` for future builds\n\n### Supported Platforms\n\n| OS | Architecture | Status |\n|----|--------------|--------|\n| macOS | x86_64 (Intel) | Supported |\n| macOS | arm64 (Apple Silicon) | Supported |\n| Linux | x86_64 | Supported |\n| Linux | arm64 | Supported |\n| Windows | x86_64 | Supported |\n| FreeBSD | x86_64 | Supported |\n\n### Configuring Auto-Installation\n\n```toml\n[search.pagefind]\n# Disable auto-install (requires manual Pagefind installation)\nauto_install = false\n\n# Pin to a specific version (default: \"latest\")\nversion = \"v1.4.0\"\n\n# Custom cache directory (default: XDG cache)\ncache_dir = \"~/.my-cache/pagefind/\"\n```\n\n### Offline Environments\n\nAfter the first build, Pagefind is cached locally. Subsequent builds work offline. For CI/CD environments, consider:\n\n1. **Pre-cache in Docker image**: Include Pagefind in your CI image\n2. **Use `version` pinning**: Pin to a specific version for reproducible builds\n3. **Disable auto-install**: Set `auto_install = false` and install manually\n\n## Manual Installation (Optional)\n\nIf you prefer to install Pagefind manually or need to use a custom build:\n\n### npm (Recommended)\n\n```bash\nnpm install -g pagefind\n```\n\n### Homebrew (macOS)\n\n```bash\nbrew install pagefind\n```\n\n### Binary Download\n\nDownload from [Pagefind releases](https://github.com/CloudCannon/pagefind/releases).\n\n### Disabling Auto-Install\n\nTo require manual installation:\n\n```toml\n[search.pagefind]\nauto_install = false\n```\n\nIf Pagefind is not installed and auto-install is disabled, markata-go logs a warning but continues building. The search UI will be hidden.\n\n## Configuration\n\n### Search Backends\n\nPagefind remains the default backend today. The bleve server uses the same top-level search config plus additional server-side settings.\n\nPlanned production-oriented bleve configuration:\n\n```toml\n[search]\nenabled = true\nposition = \"navbar\"\nplaceholder = \"Search...\"\n\n[search.bleve]\nendpoint = \"https://search.example.com/api/search\"\nfuzzy = false\nlimit = 20\nmax_limit = 100\ncors_origins = [\"https://example.com\"]\n```\n\nWhen `endpoint` is configured, the navbar should use the bleve client instead of Pagefind. When it is not configured, the site should fall back to Pagefind.\n\n### Basic Configuration\n\nConfigure search in your `markata-go.toml`:\n\n```toml\n[search]\nenabled = true              # Default: true\nposition = \"navbar\"         # Where to show search: navbar, sidebar, footer\nplaceholder = \"Search...\"   # Search input placeholder text\n```\n\n### Disable Search\n\nTo disable search entirely:\n\n```toml\n[search]\nenabled = false\n```\n\n### Advanced Configuration\n\n```toml\n[search]\nenabled = true\nposition = \"navbar\"\nplaceholder = \"Search...\"\nshow_images = true          # Show thumbnails in results (default: true)\nexcerpt_length = 200        # Characters for result excerpts (default: 200)\n\n# Pagefind CLI options\n[search.pagefind]\nbundle_dir = \"_pagefind\"    # Output directory for index (default: \"_pagefind\")\nroot_selector = \"main\"      # Element containing searchable content\nexclude_selectors = [       # Elements to exclude from indexing\n    \".no-search\",\n    \"nav\",\n    \"footer\"\n]\n\n# Auto-installation options\nauto_install = true         # Automatically download Pagefind (default: true)\nversion = \"latest\"          # Version to install (default: \"latest\")\ncache_dir = \"\"              # Custom cache directory (default: XDG cache)\n```\n\n## Search Positions\n\nThe `position` option controls where the search UI appears:\n\n| Position | Description |\n|----------|-------------|\n| `navbar` | Right side of the navigation bar (default) |\n| `sidebar` | In the sidebar (if enabled) |\n| `footer` | In the footer section |\n| `custom` | Hidden; use for custom placement via templates |\n\n### Custom Placement\n\nFor full control over search placement, set `position = \"custom\"` and include the search component manually in your templates:\n\n```html\n{% include \"components/search.html\" %}\n```\n\n## What Gets Indexed\n\n### Pagefind\n\nBy default, Pagefind indexes:\n\n- **Post content** - The main article body\n- **Title** - Displayed in search results\n- **Description** - Shown as result excerpt\n- **Tags** - Available as filters\n- **Feed membership** - Available as filters\n\n### Excluding Content from Search\n\n#### Via Frontmatter\n\nExclude a post from the search index:\n\n```yaml\n---\ntitle: \"Draft Post\"\nsearch_exclude: true\n---\n```\n\n#### Via CSS Classes\n\nContent with `data-pagefind-ignore` is excluded:\n\n```html\n\u003cdiv data-pagefind-ignore\u003e\n    This content won't be indexed\n\u003c/div\u003e\n```\n\n## Privacy Rules for Bleve\n\nBleve search follows stricter privacy rules than a generic full-text index.\n\n- draft and skipped posts are excluded entirely\n- private posts may be searchable by intentionally public metadata such as title, description, tags, and date\n- private post body content is never indexed\n- private media URLs are never exposed in bleve search results\n- private descriptions shown in search results must be explicit public metadata, not body-derived excerpts\n\nThis allows users to discover an encrypted post by title or tags while still requiring decryption to read the protected content.\n\n## Search Results\n\n### Pagefind\n\nResults include:\n\n- **Title** - Clickable link to the post\n- **Excerpt** - Highlighted text showing where the match was found\n- **Thumbnail** - Post image (if available and `show_images` is enabled)\n\n### Filtering Results\n\nPagefind supports filtering by metadata. Users can click on tags or feeds in results to filter.\n\n### Bleve\n\nBleve result payloads currently include:\n\n- title\n- href\n- description\n- date\n- tags\n- read time\n- media for non-private posts only\n\nThe bleve navbar UI currently renders a compact card-style dropdown. It does not yet provide the same highlighted excerpt behavior as Pagefind.\n\n## Theming\n\nThe search UI automatically inherits your site's theme colors through CSS variables:\n\n```css\n:root {\n    --pagefind-ui-primary: var(--primary);\n    --pagefind-ui-text: var(--text);\n    --pagefind-ui-background: var(--surface);\n    --pagefind-ui-border: var(--border);\n}\n```\n\n### Custom Styling\n\nOverride Pagefind styles in your custom CSS:\n\n```css\n/* Larger search input */\n.pagefind-ui__search-input {\n    font-size: 1.1rem;\n    padding: 0.75rem 1rem;\n}\n\n/* Wider results dropdown */\n.search--navbar .pagefind-ui__results {\n    width: 500px;\n}\n```\n\n## Keyboard Navigation\n\nThe current bleve navbar implementation supports:\n\n- `/` to focus search\n- `Escape` to dismiss results\n- arrow keys to move through results\n- `Enter` to open the active result\n- `Tab` and `Shift+Tab` to move between the input and result links\n\nPagefind behavior depends on the upstream Pagefind UI implementation plus markata-go shortcut integration.\n\n| Key | Action |\n|-----|--------|\n| `/` | Focus search input (when implemented) |\n| `Enter` | Go to first result |\n| `↑` / `↓` | Navigate results |\n| `Escape` | Close results dropdown |\n\n## Performance\n\nPagefind is highly optimized:\n\n- **Index size**: ~1KB per page indexed\n- **Initial load**: Only loads the search UI (~10KB)\n- **On search**: Loads only relevant index chunks\n- **Caching**: Results cached for repeated queries\n\n### Large Sites\n\nFor sites with thousands of pages, Pagefind handles it efficiently:\n\n- Index is split into chunks\n- Only relevant chunks are loaded per query\n- Typical search latency: 10-50ms\n\n## Troubleshooting\n\n### Bleve result is missing from the navbar\n\nThe current bleve navbar UI shows a limited number of results. A result may exist in the API response but rank below the visible dropdown cutoff for broad queries.\n\nCheck the API directly:\n\n```bash\ncurl \"http://localhost:3001/api/search?q=kubernetes\u0026limit=30\"\n```\n\nIf the result is present in the API but missing from the dropdown, increase the navbar result count or improve ranking for exact title and slug matches.\n\n### Private content is leaking through search\n\nBleve should never expose private body content or private media.\n\nCheck these first:\n\n1. Is the text an explicit frontmatter `description`? Those are intentionally public metadata.\n2. Is the leaked field a media URL, poster URL, or body-derived excerpt? That is a bug and should be fixed in the search API or indexer.\n\nPrivate posts should be discoverable by public metadata only.\n\n### Search server did not update after content changed\n\nThe current standalone `search-server` snapshots posts at startup.\n\n- changing content on disk does not automatically update the running server\n- restart the server after content changes\n- future `watch-content` mode is intended to close this gap\n\nFor production today, prefer a restart-on-deploy model.\n\n### Shared PVC or multiple pods\n\nDo not rely on multiple processes mutating the same writable bleve index directory.\n\nSafer patterns:\n\n1. one search pod with local writable cache\n2. many search pods, each with its own writable local cache\n3. one builder job producing a read-only index artifact consumed by many search pods\n\n### Search box not appearing\n\n1. **Check build logs for Pagefind output:**\n   Look for `[pagefind]` messages indicating download or execution.\n\n2. **Verify search is enabled:**\n   ```toml\n   [search]\n   enabled = true  # Should be true (default)\n   ```\n\n3. **Check network connectivity:**\n   If auto-install is enabled and Pagefind isn't cached, internet access is required.\n\n### Auto-install failing\n\n1. **Network issues:**\n   ```\n   pagefind install error during download: failed to download asset\n   ```\n   Check your internet connection or firewall settings.\n\n2. **Unsupported platform:**\n   ```\n   pagefind install error during platform_detection: unsupported operating system\n   ```\n   Install Pagefind manually for unsupported platforms.\n\n3. **Checksum verification failure:**\n   ```\n   pagefind install error during verify: checksum mismatch\n   ```\n   This is a security feature. Try clearing the cache:\n   ```bash\n   rm -rf ~/.cache/markata-go/bin/\n   ```\n\n4. **Fallback to manual installation:**\n   ```toml\n   [search.pagefind]\n   auto_install = false\n   ```\n   Then install Pagefind manually via npm, Homebrew, or direct download.\n\n### No search results\n\n1. **Check if content has `data-pagefind-body`:**\n   The default post template includes this. Custom templates need it too.\n\n2. **Verify posts are published:**\n   Draft posts (`published: false`) may not be indexed.\n\n3. **Check exclude selectors:**\n   Ensure your content isn't excluded by `exclude_selectors`.\n\n### Search results missing content\n\n1. **Check `root_selector`:**\n   If set, only content within that selector is indexed.\n\n2. **Verify template structure:**\n   Content must be within `data-pagefind-body` element.\n\n## Feed-Specific Search\n\nFor sites with multiple content types, you can configure feed-specific search instances:\n\n```toml\n[search]\nenabled = true\nposition = \"navbar\"\n\n# Feed-specific search instances\n[[search.feeds]]\nname = \"guides\"\nfilter = \"published \u0026\u0026 feed:guides\"\nposition = \"sidebar\"\nplaceholder = \"Search guides...\"\n\n[[search.feeds]]\nname = \"blog\"\nfilter = \"published \u0026\u0026 feed:blog\"\nposition = \"navbar\"\nplaceholder = \"Search blog...\"\n```\n\n## CI/CD Integration\n\nThanks to automatic Pagefind installation, CI/CD setup is simpler than ever.\n\n### GitHub Actions\n\n```yaml\n- name: Build site\n  run: markata-go build  # Pagefind auto-installs\n```\n\nOr pin to a specific version for reproducible builds:\n\n```yaml\n- name: Build site\n  run: markata-go build\n  env:\n    MARKATA_GO_SEARCH_PAGEFIND_VERSION: v1.4.0\n```\n\n### Netlify\n\nAdd to your `netlify.toml`:\n\n```toml\n[build]\n  command = \"markata-go build\"\n```\n\n### Vercel\n\nAdd to your `vercel.json`:\n\n```json\n{\n  \"buildCommand\": \"markata-go build\"\n}\n```\n\n### Docker\n\nPagefind is automatically cached. For faster builds, you can pre-install:\n\n```dockerfile\n# Option 1: Let auto-install handle it (simple)\nRUN markata-go build\n\n# Option 2: Pre-install for faster CI\nRUN npm install -g pagefind\nRUN markata-go build\n```\n\n### Search Server Containers\n\nThe current `search-server` works best in a restart-on-deploy model.\n\nRecommended today:\n\n1. mount content and config into the container\n2. give the server a writable local cache directory\n3. restart or redeploy search pods when content changes\n\nRecommended long-term production architecture:\n\n1. builder pod or CI job creates the bleve index artifact\n2. search pods mount that artifact read-only\n3. search pods run in `read-only-index` mode\n4. the main site navbar queries the remote API\n\nThis avoids shared writable index problems and makes horizontal scaling safer.\n\n## How It Works\n\n### Pagefind\n\n1. **Build stage**: markata-go generates HTML files with `data-pagefind-*` attributes\n2. **Cleanup stage**: PagefindPlugin runs `pagefind` CLI to index the output directory\n3. **Index generation**: Pagefind creates optimized search index in `_pagefind/`\n4. **Runtime**: Pagefind JS loads the index and handles search queries client-side\n\n### Bleve\n\n1. **Startup**: `search-server` loads config and content\n2. **Indexing**: bleve index is built or opened from cache\n3. **Runtime**: the navbar search UI queries `/api/search`\n4. **Results**: the API returns ranked JSON results with privacy filtering applied\n\nPlanned future modes:\n\n- `runtime-index` for simple deployments\n- `watch-content` for long-running local-writer servers\n- `read-only-index` for builder-produced index artifacts and load-balanced search pods\n\n## See Also\n\n- [Configuration Reference](/docs/guides/configuration/) - Full configuration options\n- [Themes](/docs/guides/themes/) - Customize search appearance\n- [Pagefind Documentation](https://pagefind.app/docs/) - Official Pagefind docs\n\nNavbar search reserves its dimensions in the initial stylesheet. Search\ninitialization and SPA navigation do not force a layout read or broadcast a\nresize event. Real viewport changes still resize the navbar normally.\n",
      "summary": "Add full-text search to your markata-go site using Pagefind or a bleve search server",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "search",
        "pagefind",
        "bleve"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/plugin-development/",
      "url": "https://markata.dev/docs/guides/plugin-development/",
      "title": "Plugin Development",
      "content_html": "\u003ch2 id=\"plugin-development-guide\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlugin Development Guide\u003c/span\u003e \u003ca href=\"#plugin-development-guide\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis guide explains how to create plugins for markata-go, a comprehensive, extendable static site generator written in Go.\u003c/p\u003e\n\u003ch2 id=\"philosophy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePhilosophy\u003c/span\u003e \u003ca href=\"#philosophy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePlugins are the primary extension mechanism in markata-go. A plugin can:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHook into any of the 9 lifecycle stages\u003c/li\u003e\n\u003cli\u003eExtend configuration with new fields\u003c/li\u003e\n\u003cli\u003eAdd computed fields to posts\u003c/li\u003e\n\u003cli\u003eControl execution order via priorities\u003c/li\u003e\n\u003cli\u003eProcess content concurrently for performance\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"plugin-architecture-overview\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlugin Architecture Overview\u003c/span\u003e \u003ca href=\"#plugin-architecture-overview\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go uses a \u003cstrong\u003eStandard 9-stage lifecycle\u003c/strong\u003e that provides a good balance between flexibility and simplicity. Each stage is a hook point where plugins can participate by implementing the corresponding interface.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e┌─────────────────────────────────────────────────────────────────────┐\n│                        CONFIGURATION PHASE                          │\n├─────────────────────────────────────────────────────────────────────┤\n│  configure → validate                                               │\n│       │           │                                                 │\n│       ▼           ▼                                                 │\n│  [load config, [validate                                            │\n│   init plugins] config]                                             │\n├─────────────────────────────────────────────────────────────────────┤\n│                         CONTENT PHASE                               │\n├─────────────────────────────────────────────────────────────────────┤\n│  glob → load → transform → render → collect                         │\n│    │      │        │          │         │                           │\n│    ▼      ▼        ▼          ▼         ▼                           │\n│  [find  [parse  [pre-proc  [markdown [feeds,                        │\n│   files] posts]  content]   → HTML]   nav]                          │\n├─────────────────────────────────────────────────────────────────────┤\n│                         OUTPUT PHASE                                │\n├─────────────────────────────────────────────────────────────────────┤\n│  write → cleanup                                                    │\n│    │        │                                                       │\n│    ▼        ▼                                                       │\n│  [output  [close                                                    │\n│   files]   resources]                                               │\n└─────────────────────────────────────────────────────────────────────┘\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"the-9-stage-lifecycle\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe 9-Stage Lifecycle\u003c/span\u003e \u003ca href=\"#the-9-stage-lifecycle\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"stage-1-configure\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStage 1: Configure\u003c/span\u003e \u003ca href=\"#stage-1-configure\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003ePurpose:\u003c/strong\u003e Load configuration and initialize plugin state.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhen:\u003c/strong\u003e First stage, runs before any content processing.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat plugins do:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRead configuration options from \u003ccode\u003em.Config()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eInitialize internal state (parsers, clients, caches)\u003c/li\u003e\n\u003cli\u003eSet up external connections\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"stage-2-validate\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStage 2: Validate\u003c/span\u003e \u003ca href=\"#stage-2-validate\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003ePurpose:\u003c/strong\u003e Validate configuration after all plugins have configured.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhen:\u003c/strong\u003e After all plugins have initialized.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat plugins do:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eValidate plugin-specific configuration\u003c/li\u003e\n\u003cli\u003eCheck for required fields\u003c/li\u003e\n\u003cli\u003eReturn errors for invalid configurations\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"stage-3-glob\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStage 3: Glob\u003c/span\u003e \u003ca href=\"#stage-3-glob\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003ePurpose:\u003c/strong\u003e Discover content files.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhen:\u003c/strong\u003e First content phase stage.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat plugins do:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFind files matching patterns\u003c/li\u003e\n\u003cli\u003eFilter based on gitignore\u003c/li\u003e\n\u003cli\u003eAdd files to the manager via \u003ccode\u003em.SetFiles()\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"stage-4-load\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStage 4: Load\u003c/span\u003e \u003ca href=\"#stage-4-load\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003ePurpose:\u003c/strong\u003e Parse files into post objects.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhen:\u003c/strong\u003e After files are discovered.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat plugins do:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRead file contents\u003c/li\u003e\n\u003cli\u003eParse frontmatter\u003c/li\u003e\n\u003cli\u003eCreate \u003ccode\u003e*models.Post\u003c/code\u003e objects\u003c/li\u003e\n\u003cli\u003eAdd posts via \u003ccode\u003em.AddPost()\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"stage-5-transform\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStage 5: Transform\u003c/span\u003e \u003ca href=\"#stage-5-transform\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003ePurpose:\u003c/strong\u003e Pre-render content processing.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhen:\u003c/strong\u003e After content is loaded, before rendering.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat plugins do:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eExpand template expressions in content\u003c/li\u003e\n\u003cli\u003eCalculate derived fields (reading time, descriptions)\u003c/li\u003e\n\u003cli\u003eProcess wikilinks, shortcodes\u003c/li\u003e\n\u003cli\u003eSet up prev/next links\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"stage-6-render\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStage 6: Render\u003c/span\u003e \u003ca href=\"#stage-6-render\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003ePurpose:\u003c/strong\u003e Convert markdown to HTML.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhen:\u003c/strong\u003e After transform processing.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat plugins do:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eConvert markdown to HTML\u003c/li\u003e\n\u003cli\u003eApply syntax highlighting\u003c/li\u003e\n\u003cli\u003eProcess admonitions\u003c/li\u003e\n\u003cli\u003eApply templates\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"stage-7-collect\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStage 7: Collect\u003c/span\u003e \u003ca href=\"#stage-7-collect\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003ePurpose:\u003c/strong\u003e Build aggregated content.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhen:\u003c/strong\u003e After rendering is complete.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat plugins do:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBuild RSS/Atom/JSON feeds\u003c/li\u003e\n\u003cli\u003eGenerate sitemaps\u003c/li\u003e\n\u003cli\u003eCreate tag/category pages\u003c/li\u003e\n\u003cli\u003eBuild navigation structures\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"stage-8-write\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStage 8: Write\u003c/span\u003e \u003ca href=\"#stage-8-write\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003ePurpose:\u003c/strong\u003e Write output files to disk.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhen:\u003c/strong\u003e After all content is processed.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat plugins do:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWrite HTML files\u003c/li\u003e\n\u003cli\u003eWrite feed files\u003c/li\u003e\n\u003cli\u003eCopy static assets\u003c/li\u003e\n\u003cli\u003eGenerate any final output\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"stage-9-cleanup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStage 9: Cleanup\u003c/span\u003e \u003ca href=\"#stage-9-cleanup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003ePurpose:\u003c/strong\u003e Release resources.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhen:\u003c/strong\u003e Final stage.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat plugins do:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eClose database connections\u003c/li\u003e\n\u003cli\u003eFlush caches\u003c/li\u003e\n\u003cli\u003eClean up temporary files\u003c/li\u003e\n\u003cli\u003eLog final statistics\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"plugin-interfaces\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlugin Interfaces\u003c/span\u003e \u003ca href=\"#plugin-interfaces\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEvery plugin must implement the base \u003ccode\u003ePlugin\u003c/code\u003e interface. Additional interfaces determine which stages the plugin participates in.\u003c/p\u003e\n\u003ch3 id=\"base-interface-required\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBase Interface (Required)\u003c/span\u003e \u003ca href=\"#base-interface-required\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Plugin is the base interface that all plugins must implement.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Name returns the unique name of the plugin.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"stage-interfaces\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStage Interfaces\u003c/span\u003e \u003ca href=\"#stage-interfaces\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eImplement these interfaces to participate in specific stages:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// ConfigurePlugin participates in the configure stage.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eConfigurePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eConfigure\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// ValidatePlugin participates in the validate stage.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eValidatePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eValidate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// GlobPlugin participates in the glob stage.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eGlobPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eGlob\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// LoadPlugin participates in the load stage.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eLoadPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eLoad\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// TransformPlugin participates in the transform stage.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eTransformPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eTransform\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// RenderPlugin participates in the render stage.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eRenderPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eRender\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// CollectPlugin participates in the collect stage.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eCollectPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eCollect\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// WritePlugin participates in the write stage.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eWritePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eWrite\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// CleanupPlugin participates in the cleanup stage.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eCleanupPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eCleanup\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"creating-a-basic-plugin\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCreating a Basic Plugin\u003c/span\u003e \u003ca href=\"#creating-a-basic-plugin\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere\u0026rsquo;s a minimal plugin that adds a custom field to each post:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003epackage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;github.com/example/markata-go/pkg/lifecycle\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;github.com/example/markata-go/pkg/models\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// HelloPlugin is a minimal example plugin.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eHelloPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"p\"\u003e{}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// NewHelloPlugin creates a new HelloPlugin.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewHelloPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eHelloPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003eHelloPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e{}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Name returns the unique plugin identifier.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eHelloPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hello\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Transform adds a greeting to each post.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eHelloPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eTransform\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePosts\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSkip\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;greeting\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Hello from markata-go!\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Ensure HelloPlugin implements the required interfaces.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eHelloPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)(\u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTransformPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eHelloPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)(\u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"plugin-priority-and-ordering\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlugin Priority and Ordering\u003c/span\u003e \u003ca href=\"#plugin-priority-and-ordering\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eControl when your plugin runs relative to other plugins within the same stage using the \u003ccode\u003ePriorityPlugin\u003c/code\u003e interface.\u003c/p\u003e\n\u003ch3 id=\"priority-constants\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePriority Constants\u003c/span\u003e \u003ca href=\"#priority-constants\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003econst\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// PriorityFirst ensures a plugin runs before most others.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePriorityFirst\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1000\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// PriorityEarly ensures a plugin runs early in the stage.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePriorityEarly\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// PriorityDefault is the default priority.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePriorityDefault\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// PriorityLate ensures a plugin runs late in the stage.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePriorityLate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// PriorityLast ensures a plugin runs after most others.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePriorityLast\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e1000\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"implementing-priority\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eImplementing Priority\u003c/span\u003e \u003ca href=\"#implementing-priority\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// PriorityPlugin can be implemented to control execution order.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ePriorityPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Priority returns the plugin\u0026#39;s priority for a given stage.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Lower values run first.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003ePriority\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eStage\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eExample implementation:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Priority returns the priority for the given stage.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Description should run early in transform to make descriptions\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// available for other plugins.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eDescriptionPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003ePriority\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStage\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStageTransform\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePriorityEarly\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePriorityDefault\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePlugins without the \u003ccode\u003ePriorityPlugin\u003c/code\u003e interface use \u003ccode\u003ePriorityDefault\u003c/code\u003e (0). Within the same priority level, plugins run in registration order.\u003c/p\u003e\n\u003ch2 id=\"accessing-the-manager\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAccessing the Manager\u003c/span\u003e \u003ca href=\"#accessing-the-manager\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ccode\u003e*lifecycle.Manager\u003c/code\u003e is passed to all hook methods and provides access to:\u003c/p\u003e\n\u003ch3 id=\"posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePosts\u003c/span\u003e \u003ca href=\"#posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Get all posts\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposts\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePosts\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Add a new post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddPost\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Replace all posts\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSetPosts\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eposts\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"post-lookups\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePost lookups\u003c/span\u003e \u003ca href=\"#post-lookups\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse the manager\u0026rsquo;s shared index instead of building a slug, href, or path map\ninside a plugin:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eindex\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePostIndex\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eLookupBySlug\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;other-post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epostByHref\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eByHref\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/other-post/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epostByPath\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eByPath\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;posts/other-post.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003eLookupBySlug\u003c/code\u003e accepts case-insensitive slugs, slugified slugs, and aliases.\nHref and path keys use exact strings. \u003ccode\u003eSetPosts\u003c/code\u003e, \u003ccode\u003eAddPost\u003c/code\u003e, and \u003ccode\u003eReset\u003c/code\u003e\ninvalidate the cached index automatically. If a plugin changes \u003ccode\u003eSlug\u003c/code\u003e, \u003ccode\u003eHref\u003c/code\u003e,\n\u003ccode\u003ePath\u003c/code\u003e, or aliases on an existing post, call \u003ccode\u003eindex.Refresh(m)\u003c/code\u003e before the\nlookup. Keep a separate map when the plugin needs a filtered subset, cache\nsnapshot, validation of duplicate keys, or different lookup semantics.\u003c/p\u003e\n\u003ch3 id=\"files\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFiles\u003c/span\u003e \u003ca href=\"#files\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Get discovered file paths\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efiles\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFiles\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Set file paths (typically done by glob plugins)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSetFiles\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Add a single file\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddFile\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;path/to/file.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Get the configuration\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Access standard config fields\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtentDir\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContentDir\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Source directory\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutputDir\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eOutputDir\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Output directory\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eGlobPatterns\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Glob patterns for file discovery\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Access custom config via Extra map\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eval\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExtra\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;my_setting\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e].(\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Use val\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeeds\u003c/span\u003e \u003ca href=\"#feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Get all feeds\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Add a feed\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddFeed\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eFeed\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;main\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;My Blog\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePosts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"nx\"\u003eposts\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eContent\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efeedXML\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;feed.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"cache\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCache\u003c/span\u003e \u003ca href=\"#cache\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Get the cache\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCache\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Store a value\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;key\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Retrieve a value\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eval\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eGet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;key\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Use val\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Delete a value\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eDelete\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;key\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Clear all cached data\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eClear\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"filtering-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFiltering Posts\u003c/span\u003e \u003ca href=\"#filtering-posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Filter posts using expressions\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFilter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;published==true\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edrafts\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFilter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;draft==true\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etagged\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFilter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;tags contains golang\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Complex filters with AND/OR\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erecent\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFilter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;published==true and draft!=true\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"concurrent-processing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConcurrent Processing\u003c/span\u003e \u003ca href=\"#concurrent-processing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor performance, use the built-in concurrent processor:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eMyPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eTransform\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eProcessPostsConcurrently\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003emodels\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePost\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSkip\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Process the post (runs in parallel)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;computed_field\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003ecomputeValue\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"extending-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExtending Configuration\u003c/span\u003e \u003ca href=\"#extending-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRead custom configuration from the \u003ccode\u003eExtra\u003c/code\u003e map:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eMyPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eConfigure\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Read configuration with defaults\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExtra\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExtra\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;my_plugin_enabled\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e].(\u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ethreshold\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExtra\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;my_plugin_threshold\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e].(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ethreshold\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ethreshold\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ethreshold\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUsers configure in their \u003ccode\u003emarkata.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emy_plugin_enabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emy_plugin_threshold\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"working-with-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWorking with Posts\u003c/span\u003e \u003ca href=\"#working-with-posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"post-structure\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePost Structure\u003c/span\u003e \u003ca href=\"#post-structure\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ePost\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePath\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e                 \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Source file path\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eContent\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e                 \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Raw markdown content\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eSlug\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e                 \u003c/span\u003e\u003cspan class=\"c1\"\u003e// URL-safe identifier\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eHref\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e                 \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Relative URL path (e.g., /my-post/)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTitle\u003c/span\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Optional title\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eDate\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTime\u003c/span\u003e\u003cspan class=\"w\"\u003e             \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Optional publication date\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ePublished\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"w\"\u003e                   \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Is the post published?\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eDraft\u003c/span\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"w\"\u003e                   \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Is it a draft?\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eSkip\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"w\"\u003e                   \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Should it be skipped?\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTags\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e               \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Associated tags\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eDescription\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Meta description\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eTemplate\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e                 \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Template file (default: \u0026#34;post.html\u0026#34;)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eHTML\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e                 \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Final rendered HTML\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eArticleHTML\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e                 \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Content HTML without template\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eExtra\u003c/span\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"kd\"\u003emap\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"p\"\u003e{}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Dynamic/custom fields\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"getting-and-setting-custom-fields\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGetting and Setting Custom Fields\u003c/span\u003e \u003ca href=\"#getting-and-setting-custom-fields\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Get a custom field (returns nil if not found)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003evalue\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eGet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;custom_field\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Set a custom field\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reading_time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;word_count\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e1200\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Check if a field exists\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eHas\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;custom_field\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// ...\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"respecting-skip-flag\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRespecting Skip Flag\u003c/span\u003e \u003ca href=\"#respecting-skip-flag\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAlways check the \u003ccode\u003eSkip\u003c/code\u003e flag before processing:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePosts\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSkip\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Process the post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"complete-example-plugin\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComplete Example Plugin\u003c/span\u003e \u003ca href=\"#complete-example-plugin\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere\u0026rsquo;s a complete plugin that calculates reading time for posts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003epackage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;math\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;regexp\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;strings\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;unicode\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;github.com/example/markata-go/pkg/lifecycle\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;github.com/example/markata-go/pkg/models\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// ReadingTimePlugin calculates word count and estimated reading time\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// for each post during the transform stage.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eReadingTimePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// wordsPerMinute is the average reading speed (default: 200)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ewordsPerMinute\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// NewReadingTimePlugin creates a new ReadingTimePlugin with default settings.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewReadingTimePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eReadingTimePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003eReadingTimePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003ewordsPerMinute\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e200\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Name returns the unique name of the plugin.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eReadingTimePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reading_time\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Configure reads configuration options for the plugin.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eReadingTimePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eConfigure\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExtra\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ewpm\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExtra\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;words_per_minute\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e].(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ewpm\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewordsPerMinute\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ewpm\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Transform calculates word count and reading time for each post.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eReadingTimePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eTransform\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eProcessPostsConcurrently\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003emodels\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePost\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSkip\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContent\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Count words\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003ewordCount\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ecountWords\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContent\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;word_count\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ewordCount\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Calculate reading time in minutes\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003ereadingTime\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ecalculateReadingTime\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ewordCount\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reading_time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ereadingTime\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Also store a formatted string\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reading_time_text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eformatReadingTime\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ereadingTime\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Regex pattern to match code blocks\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecodeBlockPattern\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eregexp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eMustCompile\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;(?s)```.*?```|~~~.*?~~~|`[^`]+`\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// countWords counts the number of words in markdown content.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eReadingTimePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003ecountWords\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Remove code blocks\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecodeBlockPattern\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eReplaceAllString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34; \u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Count words\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ewords\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003einWord\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003er\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eunicode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eIsLetter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eunicode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eIsDigit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003einWord\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"nx\"\u003ewords\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"nx\"\u003einWord\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003einWord\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ewords\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// calculateReadingTime estimates reading time in minutes.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eReadingTimePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003ecalculateReadingTime\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ewordCount\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ewordCount\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eminutes\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003efloat64\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ewordCount\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003efloat64\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewordsPerMinute\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003emath\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCeil\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eminutes\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// formatReadingTime creates a human-readable reading time string.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eReadingTimePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eformatReadingTime\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eminutes\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eminutes\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026lt; 1 min read\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eminutes\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;1 min read\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;%d min read\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eminutes\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Ensure ReadingTimePlugin implements the required interfaces.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eReadingTimePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)(\u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfigurePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eReadingTimePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)(\u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTransformPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eReadingTimePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)(\u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"testing-plugins\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTesting Plugins\u003c/span\u003e \u003ca href=\"#testing-plugins\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"unit-test-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUnit Test Example\u003c/span\u003e \u003ca href=\"#unit-test-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003epackage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;testing\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;github.com/example/markata-go/pkg/lifecycle\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;github.com/example/markata-go/pkg/models\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eTestReadingTimePlugin_Transform\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003et\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003etesting\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eT\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003etests\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"w\"\u003e         \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003ewordsPerMinute\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003ewantWordCount\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003ewantReadingTime\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;short post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e         \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Hello world this is a test.\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003ewordsPerMinute\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"mi\"\u003e200\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003ewantWordCount\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003ewantReadingTime\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Minimum 1 minute\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;longer post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e         \u003c/span\u003e\u003cspan class=\"nx\"\u003estrings\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRepeat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;word \u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e400\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003ewordsPerMinute\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"mi\"\u003e200\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003ewantReadingTime\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;custom WPM\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e         \u003c/span\u003e\u003cspan class=\"nx\"\u003estrings\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRepeat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;word \u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003ewordsPerMinute\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003ewantReadingTime\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ett\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etests\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRun\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ett\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003et\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003etesting\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eT\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Create plugin with custom WPM\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewReadingTimePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewordsPerMinute\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ett\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewordsPerMinute\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Create manager with a test post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewManager\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003emodels\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewPost\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;test.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContent\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ett\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddPost\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Run transform\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eTransform\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"nx\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFatalf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Transform() error = %v\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Check results\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003eposts\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePosts\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eposts\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"nx\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFatalf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Expected 1 post, got %d\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eposts\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003ereadingTime\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eposts\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nf\"\u003eGet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reading_time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e).(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"nx\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFatal\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reading_time not set\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ereadingTime\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ett\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewantReadingTime\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"nx\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eErrorf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reading_time = %d, want %d\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ereadingTime\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ett\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewantReadingTime\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eTestReadingTimePlugin_SkipsSkippedPosts\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003et\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003etesting\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eT\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewReadingTimePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewManager\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003emodels\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewPost\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;test.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContent\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Some content here\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSkip\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddPost\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eTransform\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFatalf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Transform() error = %v\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Verify reading_time was NOT set\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePosts\u003c/span\u003e\u003cspan class=\"p\"\u003e()[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nf\"\u003eHas\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reading_time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reading_time should not be set for skipped posts\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"integration-test-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIntegration Test Example\u003c/span\u003e \u003ca href=\"#integration-test-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eTestReadingTimePlugin_Integration\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003et\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003etesting\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eT\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Create a temporary directory with test files\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003etmpDir\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eTempDir\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Write a test markdown file\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e`---\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003etitle: Test Post\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003epublished: true\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003eThis is test content with enough words to calculate reading time.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e`\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estrings\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRepeat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;word \u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e200\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWriteFile\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003efilepath\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eJoin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etmpDir\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;test.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"nb\"\u003ebyte\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mo\"\u003e0644\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFatal\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Setup manager\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewManager\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ecfg\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ecfg\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContentDir\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etmpDir\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ecfg\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eOutputDir\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efilepath\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eJoin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etmpDir\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;output\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Register plugins\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegisterPlugins\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewGlobPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewLoadPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewReadingTimePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Run through transform stage\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRunTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStageTransform\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFatalf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;RunTo() error = %v\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Verify reading time was calculated\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eposts\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePosts\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eposts\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFatalf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Expected 1 post, got %d\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eposts\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ereadingTime\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eposts\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nf\"\u003eGet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reading_time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e).(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFatal\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reading_time not set\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ereadingTime\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eErrorf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reading_time = %d, expected \u0026gt;= 1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ereadingTime\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"registering-plugins\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRegistering Plugins\u003c/span\u003e \u003ca href=\"#registering-plugins\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"built-in-registry\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuilt-in Registry\u003c/span\u003e \u003ca href=\"#built-in-registry\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go includes a plugin registry for managing plugins by name:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Register a plugin constructor\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegisterPluginConstructor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;my_plugin\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewMyPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Get a plugin by name\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePluginByName\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;my_plugin\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFatal\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Plugin not found\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// List all registered plugins\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003enames\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegisteredPlugins\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"using-default-plugins\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing Default Plugins\u003c/span\u003e \u003ca href=\"#using-default-plugins\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Get all default plugins\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewManager\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegisterPlugins\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eDefaultPlugins\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Or use minimal set\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegisterPlugins\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eMinimalPlugins\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"manual-registration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eManual Registration\u003c/span\u003e \u003ca href=\"#manual-registration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewManager\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Register individual plugins\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegisterPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewGlobPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegisterPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewLoadPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegisterPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewMyCustomPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Or register multiple at once\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegisterPlugins\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewGlobPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewLoadPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewRenderMarkdownPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewMyCustomPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"plugin-loading-from-config\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlugin Loading from Config\u003c/span\u003e \u003ca href=\"#plugin-loading-from-config\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Load plugins by name from configuration\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epluginNames\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;glob\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;load\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;render_markdown\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;templates\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eloadedPlugins\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ewarnings\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePluginsByNames\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epluginNames\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ewarnings\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Warning: %s\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ew\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegisterPlugins\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eloadedPlugins\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"error-handling\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eError Handling\u003c/span\u003e \u003ca href=\"#error-handling\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"returning-errors\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReturning Errors\u003c/span\u003e \u003ca href=\"#returning-errors\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eReturn errors from hook methods to signal failure:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eMyPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eTransform\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePosts\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eprocessPost\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eErrorf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;processing %s: %w\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePath\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"critical-vs-non-critical-stages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCritical vs Non-Critical Stages\u003c/span\u003e \u003ca href=\"#critical-vs-non-critical-stages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSome stages are critical and halt execution on error:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eCritical:\u003c/strong\u003e Configure, Validate, Glob, Load\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNon-Critical:\u003c/strong\u003e Transform, Render, Collect, Write, Cleanup\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFor non-critical stages, individual post errors can be logged while allowing the build to continue.\u003c/p\u003e\n\u003ch3 id=\"accessing-warnings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAccessing Warnings\u003c/span\u003e \u003ca href=\"#accessing-warnings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// After running stages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRun\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Check warnings even if no error\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ewarning\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWarnings\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Warning: %s\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ewarning\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"best-practices\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBest Practices\u003c/span\u003e \u003ca href=\"#best-practices\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"1-always-check-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e1. Always Check Configuration\u003c/span\u003e \u003ca href=\"#1-always-check-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eMyPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eConfigure\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Provide sensible defaults\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ethreshold\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Override with config values if present\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExtra\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExtra\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;my_plugin_enabled\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e].(\u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"2-respect-the-skip-flag\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e2. Respect the Skip Flag\u003c/span\u003e \u003ca href=\"#2-respect-the-skip-flag\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePosts\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSkip\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Always skip posts marked for skipping\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Process the post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"3-use-concurrent-processing-for-performance\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e3. Use Concurrent Processing for Performance\u003c/span\u003e \u003ca href=\"#3-use-concurrent-processing-for-performance\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eMyPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eTransform\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eProcessPostsConcurrently\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003emodels\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePost\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// This runs in parallel across posts\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eprocessPost\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"4-implement-interface-verification\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e4. Implement Interface Verification\u003c/span\u003e \u003ca href=\"#4-implement-interface-verification\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAt the end of your plugin file, verify interface implementation:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Ensure MyPlugin implements the required interfaces at compile time.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eMyPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)(\u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfigurePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eMyPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)(\u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTransformPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eMyPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)(\u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"5-handle-missing-fields-gracefully\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e5. Handle Missing Fields Gracefully\u003c/span\u003e \u003ca href=\"#5-handle-missing-fields-gracefully\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Check for nil pointers\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTitle\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTitle\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSlug\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Use Get() with type assertion\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eval\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eGet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;custom_field\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e).(\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Use val\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"6-document-your-plugin\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e6. Document Your Plugin\u003c/span\u003e \u003ca href=\"#6-document-your-plugin\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eInclude clear documentation at the top of your plugin file:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Package plugins provides lifecycle plugins for markata-go.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// MyPlugin does X, Y, and Z.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Configuration:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//     [markata]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//     my_plugin_enabled = true\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//     my_plugin_threshold = 100\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Post fields set:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//     - my_computed_field: Description of the field\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Usage in templates:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//     {{ post.my_computed_field }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003epackage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"../../spec/spec/LIFECYCLE.md\"\u003eLifecycle Stages Specification\u003c/a\u003e - Detailed stage documentation\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"../../spec/spec/PLUGINS.md\"\u003ePlugin Specification\u003c/a\u003e - Full plugin development specification\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"../plugins/\"\u003eBuilt-in Plugins\u003c/a\u003e - Documentation for built-in plugins\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n## Plugin Development Guide\n\nThis guide explains how to create plugins for markata-go, a comprehensive, extendable static site generator written in Go.\n\n## Philosophy\n\nPlugins are the primary extension mechanism in markata-go. A plugin can:\n\n- Hook into any of the 9 lifecycle stages\n- Extend configuration with new fields\n- Add computed fields to posts\n- Control execution order via priorities\n- Process content concurrently for performance\n\n## Plugin Architecture Overview\n\nmarkata-go uses a **Standard 9-stage lifecycle** that provides a good balance between flexibility and simplicity. Each stage is a hook point where plugins can participate by implementing the corresponding interface.\n\n```\n┌─────────────────────────────────────────────────────────────────────┐\n│                        CONFIGURATION PHASE                          │\n├─────────────────────────────────────────────────────────────────────┤\n│  configure → validate                                               │\n│       │           │                                                 │\n│       ▼           ▼                                                 │\n│  [load config, [validate                                            │\n│   init plugins] config]                                             │\n├─────────────────────────────────────────────────────────────────────┤\n│                         CONTENT PHASE                               │\n├─────────────────────────────────────────────────────────────────────┤\n│  glob → load → transform → render → collect                         │\n│    │      │        │          │         │                           │\n│    ▼      ▼        ▼          ▼         ▼                           │\n│  [find  [parse  [pre-proc  [markdown [feeds,                        │\n│   files] posts]  content]   → HTML]   nav]                          │\n├─────────────────────────────────────────────────────────────────────┤\n│                         OUTPUT PHASE                                │\n├─────────────────────────────────────────────────────────────────────┤\n│  write → cleanup                                                    │\n│    │        │                                                       │\n│    ▼        ▼                                                       │\n│  [output  [close                                                    │\n│   files]   resources]                                               │\n└─────────────────────────────────────────────────────────────────────┘\n```\n\n## The 9-Stage Lifecycle\n\n### Stage 1: Configure\n\n**Purpose:** Load configuration and initialize plugin state.\n\n**When:** First stage, runs before any content processing.\n\n**What plugins do:**\n- Read configuration options from `m.Config()`\n- Initialize internal state (parsers, clients, caches)\n- Set up external connections\n\n### Stage 2: Validate\n\n**Purpose:** Validate configuration after all plugins have configured.\n\n**When:** After all plugins have initialized.\n\n**What plugins do:**\n- Validate plugin-specific configuration\n- Check for required fields\n- Return errors for invalid configurations\n\n### Stage 3: Glob\n\n**Purpose:** Discover content files.\n\n**When:** First content phase stage.\n\n**What plugins do:**\n- Find files matching patterns\n- Filter based on gitignore\n- Add files to the manager via `m.SetFiles()`\n\n### Stage 4: Load\n\n**Purpose:** Parse files into post objects.\n\n**When:** After files are discovered.\n\n**What plugins do:**\n- Read file contents\n- Parse frontmatter\n- Create `*models.Post` objects\n- Add posts via `m.AddPost()`\n\n### Stage 5: Transform\n\n**Purpose:** Pre-render content processing.\n\n**When:** After content is loaded, before rendering.\n\n**What plugins do:**\n- Expand template expressions in content\n- Calculate derived fields (reading time, descriptions)\n- Process wikilinks, shortcodes\n- Set up prev/next links\n\n### Stage 6: Render\n\n**Purpose:** Convert markdown to HTML.\n\n**When:** After transform processing.\n\n**What plugins do:**\n- Convert markdown to HTML\n- Apply syntax highlighting\n- Process admonitions\n- Apply templates\n\n### Stage 7: Collect\n\n**Purpose:** Build aggregated content.\n\n**When:** After rendering is complete.\n\n**What plugins do:**\n- Build RSS/Atom/JSON feeds\n- Generate sitemaps\n- Create tag/category pages\n- Build navigation structures\n\n### Stage 8: Write\n\n**Purpose:** Write output files to disk.\n\n**When:** After all content is processed.\n\n**What plugins do:**\n- Write HTML files\n- Write feed files\n- Copy static assets\n- Generate any final output\n\n### Stage 9: Cleanup\n\n**Purpose:** Release resources.\n\n**When:** Final stage.\n\n**What plugins do:**\n- Close database connections\n- Flush caches\n- Clean up temporary files\n- Log final statistics\n\n## Plugin Interfaces\n\nEvery plugin must implement the base `Plugin` interface. Additional interfaces determine which stages the plugin participates in.\n\n### Base Interface (Required)\n\n```go\n// Plugin is the base interface that all plugins must implement.\ntype Plugin interface {\n    // Name returns the unique name of the plugin.\n    Name() string\n}\n```\n\n### Stage Interfaces\n\nImplement these interfaces to participate in specific stages:\n\n```go\n// ConfigurePlugin participates in the configure stage.\ntype ConfigurePlugin interface {\n    Plugin\n    Configure(m *Manager) error\n}\n\n// ValidatePlugin participates in the validate stage.\ntype ValidatePlugin interface {\n    Plugin\n    Validate(m *Manager) error\n}\n\n// GlobPlugin participates in the glob stage.\ntype GlobPlugin interface {\n    Plugin\n    Glob(m *Manager) error\n}\n\n// LoadPlugin participates in the load stage.\ntype LoadPlugin interface {\n    Plugin\n    Load(m *Manager) error\n}\n\n// TransformPlugin participates in the transform stage.\ntype TransformPlugin interface {\n    Plugin\n    Transform(m *Manager) error\n}\n\n// RenderPlugin participates in the render stage.\ntype RenderPlugin interface {\n    Plugin\n    Render(m *Manager) error\n}\n\n// CollectPlugin participates in the collect stage.\ntype CollectPlugin interface {\n    Plugin\n    Collect(m *Manager) error\n}\n\n// WritePlugin participates in the write stage.\ntype WritePlugin interface {\n    Plugin\n    Write(m *Manager) error\n}\n\n// CleanupPlugin participates in the cleanup stage.\ntype CleanupPlugin interface {\n    Plugin\n    Cleanup(m *Manager) error\n}\n```\n\n## Creating a Basic Plugin\n\nHere's a minimal plugin that adds a custom field to each post:\n\n```go\npackage plugins\n\nimport (\n    \"github.com/example/markata-go/pkg/lifecycle\"\n    \"github.com/example/markata-go/pkg/models\"\n)\n\n// HelloPlugin is a minimal example plugin.\ntype HelloPlugin struct{}\n\n// NewHelloPlugin creates a new HelloPlugin.\nfunc NewHelloPlugin() *HelloPlugin {\n    return \u0026HelloPlugin{}\n}\n\n// Name returns the unique plugin identifier.\nfunc (p *HelloPlugin) Name() string {\n    return \"hello\"\n}\n\n// Transform adds a greeting to each post.\nfunc (p *HelloPlugin) Transform(m *lifecycle.Manager) error {\n    for _, post := range m.Posts() {\n        if post.Skip {\n            continue\n        }\n        post.Set(\"greeting\", \"Hello from markata-go!\")\n    }\n    return nil\n}\n\n// Ensure HelloPlugin implements the required interfaces.\nvar (\n    _ lifecycle.Plugin          = (*HelloPlugin)(nil)\n    _ lifecycle.TransformPlugin = (*HelloPlugin)(nil)\n)\n```\n\n## Plugin Priority and Ordering\n\nControl when your plugin runs relative to other plugins within the same stage using the `PriorityPlugin` interface.\n\n### Priority Constants\n\n```go\nconst (\n    // PriorityFirst ensures a plugin runs before most others.\n    PriorityFirst = -1000\n\n    // PriorityEarly ensures a plugin runs early in the stage.\n    PriorityEarly = -100\n\n    // PriorityDefault is the default priority.\n    PriorityDefault = 0\n\n    // PriorityLate ensures a plugin runs late in the stage.\n    PriorityLate = 100\n\n    // PriorityLast ensures a plugin runs after most others.\n    PriorityLast = 1000\n)\n```\n\n### Implementing Priority\n\n```go\n// PriorityPlugin can be implemented to control execution order.\ntype PriorityPlugin interface {\n    Plugin\n    // Priority returns the plugin's priority for a given stage.\n    // Lower values run first.\n    Priority(stage Stage) int\n}\n```\n\nExample implementation:\n\n```go\n// Priority returns the priority for the given stage.\n// Description should run early in transform to make descriptions\n// available for other plugins.\nfunc (p *DescriptionPlugin) Priority(stage lifecycle.Stage) int {\n    if stage == lifecycle.StageTransform {\n        return lifecycle.PriorityEarly\n    }\n    return lifecycle.PriorityDefault\n}\n```\n\nPlugins without the `PriorityPlugin` interface use `PriorityDefault` (0). Within the same priority level, plugins run in registration order.\n\n## Accessing the Manager\n\nThe `*lifecycle.Manager` is passed to all hook methods and provides access to:\n\n### Posts\n\n```go\n// Get all posts\nposts := m.Posts()\n\n// Add a new post\nm.AddPost(post)\n\n// Replace all posts\nm.SetPosts(posts)\n```\n\n### Post lookups\n\nUse the manager's shared index instead of building a slug, href, or path map\ninside a plugin:\n\n```go\nindex := m.PostIndex()\npost := index.LookupBySlug(\"other-post\")\npostByHref := index.ByHref[\"/other-post/\"]\npostByPath := index.ByPath[\"posts/other-post.md\"]\n```\n\n`LookupBySlug` accepts case-insensitive slugs, slugified slugs, and aliases.\nHref and path keys use exact strings. `SetPosts`, `AddPost`, and `Reset`\ninvalidate the cached index automatically. If a plugin changes `Slug`, `Href`,\n`Path`, or aliases on an existing post, call `index.Refresh(m)` before the\nlookup. Keep a separate map when the plugin needs a filtered subset, cache\nsnapshot, validation of duplicate keys, or different lookup semantics.\n\n### Files\n\n```go\n// Get discovered file paths\nfiles := m.Files()\n\n// Set file paths (typically done by glob plugins)\nm.SetFiles(files)\n\n// Add a single file\nm.AddFile(\"path/to/file.md\")\n```\n\n### Configuration\n\n```go\n// Get the configuration\nconfig := m.Config()\n\n// Access standard config fields\ncontentDir := config.ContentDir  // Source directory\noutputDir := config.OutputDir    // Output directory\npatterns := config.GlobPatterns  // Glob patterns for file discovery\n\n// Access custom config via Extra map\nif val, ok := config.Extra[\"my_setting\"].(string); ok {\n    // Use val\n}\n```\n\n### Feeds\n\n```go\n// Get all feeds\nfeeds := m.Feeds()\n\n// Add a feed\nm.AddFeed(\u0026lifecycle.Feed{\n    Name:    \"main\",\n    Title:   \"My Blog\",\n    Posts:   posts,\n    Content: feedXML,\n    Path:    \"feed.xml\",\n})\n```\n\n### Cache\n\n```go\n// Get the cache\ncache := m.Cache()\n\n// Store a value\ncache.Set(\"key\", value)\n\n// Retrieve a value\nif val, ok := cache.Get(\"key\"); ok {\n    // Use val\n}\n\n// Delete a value\ncache.Delete(\"key\")\n\n// Clear all cached data\ncache.Clear()\n```\n\n### Filtering Posts\n\n```go\n// Filter posts using expressions\npublished, err := m.Filter(\"published==true\")\ndrafts, err := m.Filter(\"draft==true\")\ntagged, err := m.Filter(\"tags contains golang\")\n\n// Complex filters with AND/OR\nrecent, err := m.Filter(\"published==true and draft!=true\")\n```\n\n### Concurrent Processing\n\nFor performance, use the built-in concurrent processor:\n\n```go\nfunc (p *MyPlugin) Transform(m *lifecycle.Manager) error {\n    return m.ProcessPostsConcurrently(func(post *models.Post) error {\n        if post.Skip {\n            return nil\n        }\n        // Process the post (runs in parallel)\n        post.Set(\"computed_field\", computeValue(post))\n        return nil\n    })\n}\n```\n\n## Extending Configuration\n\nRead custom configuration from the `Extra` map:\n\n```go\nfunc (p *MyPlugin) Configure(m *lifecycle.Manager) error {\n    config := m.Config()\n\n    // Read configuration with defaults\n    if config.Extra != nil {\n        if enabled, ok := config.Extra[\"my_plugin_enabled\"].(bool); ok {\n            p.enabled = enabled\n        }\n        if threshold, ok := config.Extra[\"my_plugin_threshold\"].(int); ok \u0026\u0026 threshold \u003e 0 {\n            p.threshold = threshold\n        }\n    }\n\n    return nil\n}\n```\n\nUsers configure in their `markata.toml`:\n\n```toml\n[markata]\nmy_plugin_enabled = true\nmy_plugin_threshold = 100\n```\n\n## Working with Posts\n\n### Post Structure\n\n```go\ntype Post struct {\n    Path        string                 // Source file path\n    Content     string                 // Raw markdown content\n    Slug        string                 // URL-safe identifier\n    Href        string                 // Relative URL path (e.g., /my-post/)\n    Title       *string                // Optional title\n    Date        *time.Time             // Optional publication date\n    Published   bool                   // Is the post published?\n    Draft       bool                   // Is it a draft?\n    Skip        bool                   // Should it be skipped?\n    Tags        []string               // Associated tags\n    Description *string                // Meta description\n    Template    string                 // Template file (default: \"post.html\")\n    HTML        string                 // Final rendered HTML\n    ArticleHTML string                 // Content HTML without template\n    Extra       map[string]interface{} // Dynamic/custom fields\n}\n```\n\n### Getting and Setting Custom Fields\n\n```go\n// Get a custom field (returns nil if not found)\nvalue := post.Get(\"custom_field\")\n\n// Set a custom field\npost.Set(\"reading_time\", 5)\npost.Set(\"word_count\", 1200)\n\n// Check if a field exists\nif post.Has(\"custom_field\") {\n    // ...\n}\n```\n\n### Respecting Skip Flag\n\nAlways check the `Skip` flag before processing:\n\n```go\nfor _, post := range m.Posts() {\n    if post.Skip {\n        continue\n    }\n    // Process the post\n}\n```\n\n## Complete Example Plugin\n\nHere's a complete plugin that calculates reading time for posts:\n\n```go\npackage plugins\n\nimport (\n    \"fmt\"\n    \"math\"\n    \"regexp\"\n    \"strings\"\n    \"unicode\"\n\n    \"github.com/example/markata-go/pkg/lifecycle\"\n    \"github.com/example/markata-go/pkg/models\"\n)\n\n// ReadingTimePlugin calculates word count and estimated reading time\n// for each post during the transform stage.\ntype ReadingTimePlugin struct {\n    // wordsPerMinute is the average reading speed (default: 200)\n    wordsPerMinute int\n}\n\n// NewReadingTimePlugin creates a new ReadingTimePlugin with default settings.\nfunc NewReadingTimePlugin() *ReadingTimePlugin {\n    return \u0026ReadingTimePlugin{\n        wordsPerMinute: 200,\n    }\n}\n\n// Name returns the unique name of the plugin.\nfunc (p *ReadingTimePlugin) Name() string {\n    return \"reading_time\"\n}\n\n// Configure reads configuration options for the plugin.\nfunc (p *ReadingTimePlugin) Configure(m *lifecycle.Manager) error {\n    config := m.Config()\n    if config.Extra != nil {\n        if wpm, ok := config.Extra[\"words_per_minute\"].(int); ok \u0026\u0026 wpm \u003e 0 {\n            p.wordsPerMinute = wpm\n        }\n    }\n    return nil\n}\n\n// Transform calculates word count and reading time for each post.\nfunc (p *ReadingTimePlugin) Transform(m *lifecycle.Manager) error {\n    return m.ProcessPostsConcurrently(func(post *models.Post) error {\n        if post.Skip || post.Content == \"\" {\n            return nil\n        }\n\n        // Count words\n        wordCount := p.countWords(post.Content)\n        post.Set(\"word_count\", wordCount)\n\n        // Calculate reading time in minutes\n        readingTime := p.calculateReadingTime(wordCount)\n        post.Set(\"reading_time\", readingTime)\n\n        // Also store a formatted string\n        post.Set(\"reading_time_text\", p.formatReadingTime(readingTime))\n\n        return nil\n    })\n}\n\n// Regex pattern to match code blocks\nvar codeBlockPattern = regexp.MustCompile(\"(?s)```.*?```|~~~.*?~~~|`[^`]+`\")\n\n// countWords counts the number of words in markdown content.\nfunc (p *ReadingTimePlugin) countWords(content string) int {\n    // Remove code blocks\n    text := codeBlockPattern.ReplaceAllString(content, \" \")\n\n    // Count words\n    words := 0\n    inWord := false\n\n    for _, r := range text {\n        if unicode.IsLetter(r) || unicode.IsDigit(r) {\n            if !inWord {\n                words++\n                inWord = true\n            }\n        } else {\n            inWord = false\n        }\n    }\n\n    return words\n}\n\n// calculateReadingTime estimates reading time in minutes.\nfunc (p *ReadingTimePlugin) calculateReadingTime(wordCount int) int {\n    if wordCount == 0 {\n        return 0\n    }\n\n    minutes := float64(wordCount) / float64(p.wordsPerMinute)\n    return int(math.Ceil(minutes))\n}\n\n// formatReadingTime creates a human-readable reading time string.\nfunc (p *ReadingTimePlugin) formatReadingTime(minutes int) string {\n    if minutes == 0 {\n        return \"\u003c 1 min read\"\n    }\n    if minutes == 1 {\n        return \"1 min read\"\n    }\n    return fmt.Sprintf(\"%d min read\", minutes)\n}\n\n// Ensure ReadingTimePlugin implements the required interfaces.\nvar (\n    _ lifecycle.Plugin          = (*ReadingTimePlugin)(nil)\n    _ lifecycle.ConfigurePlugin = (*ReadingTimePlugin)(nil)\n    _ lifecycle.TransformPlugin = (*ReadingTimePlugin)(nil)\n)\n```\n\n## Testing Plugins\n\n### Unit Test Example\n\n```go\npackage plugins\n\nimport (\n    \"testing\"\n\n    \"github.com/example/markata-go/pkg/lifecycle\"\n    \"github.com/example/markata-go/pkg/models\"\n)\n\nfunc TestReadingTimePlugin_Transform(t *testing.T) {\n    tests := []struct {\n        name            string\n        content         string\n        wordsPerMinute  int\n        wantWordCount   int\n        wantReadingTime int\n    }{\n        {\n            name:            \"short post\",\n            content:         \"Hello world this is a test.\",\n            wordsPerMinute:  200,\n            wantWordCount:   6,\n            wantReadingTime: 1, // Minimum 1 minute\n        },\n        {\n            name:            \"longer post\",\n            content:         strings.Repeat(\"word \", 400),\n            wordsPerMinute:  200,\n            wantReadingTime: 2,\n        },\n        {\n            name:            \"custom WPM\",\n            content:         strings.Repeat(\"word \", 100),\n            wordsPerMinute:  100,\n            wantReadingTime: 1,\n        },\n    }\n\n    for _, tt := range tests {\n        t.Run(tt.name, func(t *testing.T) {\n            // Create plugin with custom WPM\n            plugin := NewReadingTimePlugin()\n            plugin.wordsPerMinute = tt.wordsPerMinute\n\n            // Create manager with a test post\n            m := lifecycle.NewManager()\n            post := models.NewPost(\"test.md\")\n            post.Content = tt.content\n            m.AddPost(post)\n\n            // Run transform\n            err := plugin.Transform(m)\n            if err != nil {\n                t.Fatalf(\"Transform() error = %v\", err)\n            }\n\n            // Check results\n            posts := m.Posts()\n            if len(posts) != 1 {\n                t.Fatalf(\"Expected 1 post, got %d\", len(posts))\n            }\n\n            readingTime, ok := posts[0].Get(\"reading_time\").(int)\n            if !ok {\n                t.Fatal(\"reading_time not set\")\n            }\n            if readingTime != tt.wantReadingTime {\n                t.Errorf(\"reading_time = %d, want %d\", readingTime, tt.wantReadingTime)\n            }\n        })\n    }\n}\n\nfunc TestReadingTimePlugin_SkipsSkippedPosts(t *testing.T) {\n    plugin := NewReadingTimePlugin()\n\n    m := lifecycle.NewManager()\n    post := models.NewPost(\"test.md\")\n    post.Content = \"Some content here\"\n    post.Skip = true\n    m.AddPost(post)\n\n    err := plugin.Transform(m)\n    if err != nil {\n        t.Fatalf(\"Transform() error = %v\", err)\n    }\n\n    // Verify reading_time was NOT set\n    if m.Posts()[0].Has(\"reading_time\") {\n        t.Error(\"reading_time should not be set for skipped posts\")\n    }\n}\n```\n\n### Integration Test Example\n\n```go\nfunc TestReadingTimePlugin_Integration(t *testing.T) {\n    // Create a temporary directory with test files\n    tmpDir := t.TempDir()\n\n    // Write a test markdown file\n    content := `---\ntitle: Test Post\npublished: true\n---\n\nThis is test content with enough words to calculate reading time.\n` + strings.Repeat(\"word \", 200)\n\n    err := os.WriteFile(filepath.Join(tmpDir, \"test.md\"), []byte(content), 0644)\n    if err != nil {\n        t.Fatal(err)\n    }\n\n    // Setup manager\n    m := lifecycle.NewManager()\n    cfg := m.Config()\n    cfg.ContentDir = tmpDir\n    cfg.OutputDir = filepath.Join(tmpDir, \"output\")\n\n    // Register plugins\n    m.RegisterPlugins(\n        NewGlobPlugin(),\n        NewLoadPlugin(),\n        NewReadingTimePlugin(),\n    )\n\n    // Run through transform stage\n    err = m.RunTo(lifecycle.StageTransform)\n    if err != nil {\n        t.Fatalf(\"RunTo() error = %v\", err)\n    }\n\n    // Verify reading time was calculated\n    posts := m.Posts()\n    if len(posts) != 1 {\n        t.Fatalf(\"Expected 1 post, got %d\", len(posts))\n    }\n\n    readingTime, ok := posts[0].Get(\"reading_time\").(int)\n    if !ok {\n        t.Fatal(\"reading_time not set\")\n    }\n    if readingTime \u003c 1 {\n        t.Errorf(\"reading_time = %d, expected \u003e= 1\", readingTime)\n    }\n}\n```\n\n## Registering Plugins\n\n### Built-in Registry\n\nmarkata-go includes a plugin registry for managing plugins by name:\n\n```go\n// Register a plugin constructor\nplugins.RegisterPluginConstructor(\"my_plugin\", func() lifecycle.Plugin {\n    return NewMyPlugin()\n})\n\n// Get a plugin by name\nplugin, ok := plugins.PluginByName(\"my_plugin\")\nif !ok {\n    log.Fatal(\"Plugin not found\")\n}\n\n// List all registered plugins\nnames := plugins.RegisteredPlugins()\n```\n\n### Using Default Plugins\n\n```go\n// Get all default plugins\nm := lifecycle.NewManager()\nm.RegisterPlugins(plugins.DefaultPlugins()...)\n\n// Or use minimal set\nm.RegisterPlugins(plugins.MinimalPlugins()...)\n```\n\n### Manual Registration\n\n```go\nm := lifecycle.NewManager()\n\n// Register individual plugins\nm.RegisterPlugin(plugins.NewGlobPlugin())\nm.RegisterPlugin(plugins.NewLoadPlugin())\nm.RegisterPlugin(NewMyCustomPlugin())\n\n// Or register multiple at once\nm.RegisterPlugins(\n    plugins.NewGlobPlugin(),\n    plugins.NewLoadPlugin(),\n    plugins.NewRenderMarkdownPlugin(),\n    NewMyCustomPlugin(),\n)\n```\n\n### Plugin Loading from Config\n\n```go\n// Load plugins by name from configuration\npluginNames := []string{\"glob\", \"load\", \"render_markdown\", \"templates\"}\nloadedPlugins, warnings := plugins.PluginsByNames(pluginNames)\n\nfor _, w := range warnings {\n    log.Printf(\"Warning: %s\", w)\n}\n\nm.RegisterPlugins(loadedPlugins...)\n```\n\n## Error Handling\n\n### Returning Errors\n\nReturn errors from hook methods to signal failure:\n\n```go\nfunc (p *MyPlugin) Transform(m *lifecycle.Manager) error {\n    for _, post := range m.Posts() {\n        if err := p.processPost(post); err != nil {\n            return fmt.Errorf(\"processing %s: %w\", post.Path, err)\n        }\n    }\n    return nil\n}\n```\n\n### Critical vs Non-Critical Stages\n\nSome stages are critical and halt execution on error:\n- **Critical:** Configure, Validate, Glob, Load\n- **Non-Critical:** Transform, Render, Collect, Write, Cleanup\n\nFor non-critical stages, individual post errors can be logged while allowing the build to continue.\n\n### Accessing Warnings\n\n```go\n// After running stages\nerr := m.Run()\n\n// Check warnings even if no error\nfor _, warning := range m.Warnings() {\n    log.Printf(\"Warning: %s\", warning)\n}\n```\n\n## Best Practices\n\n### 1. Always Check Configuration\n\n```go\nfunc (p *MyPlugin) Configure(m *lifecycle.Manager) error {\n    config := m.Config()\n\n    // Provide sensible defaults\n    p.enabled = true\n    p.threshold = 100\n\n    // Override with config values if present\n    if config.Extra != nil {\n        if enabled, ok := config.Extra[\"my_plugin_enabled\"].(bool); ok {\n            p.enabled = enabled\n        }\n    }\n\n    return nil\n}\n```\n\n### 2. Respect the Skip Flag\n\n```go\nfor _, post := range m.Posts() {\n    if post.Skip {\n        continue  // Always skip posts marked for skipping\n    }\n    // Process the post\n}\n```\n\n### 3. Use Concurrent Processing for Performance\n\n```go\nfunc (p *MyPlugin) Transform(m *lifecycle.Manager) error {\n    return m.ProcessPostsConcurrently(func(post *models.Post) error {\n        // This runs in parallel across posts\n        return p.processPost(post)\n    })\n}\n```\n\n### 4. Implement Interface Verification\n\nAt the end of your plugin file, verify interface implementation:\n\n```go\n// Ensure MyPlugin implements the required interfaces at compile time.\nvar (\n    _ lifecycle.Plugin          = (*MyPlugin)(nil)\n    _ lifecycle.ConfigurePlugin = (*MyPlugin)(nil)\n    _ lifecycle.TransformPlugin = (*MyPlugin)(nil)\n)\n```\n\n### 5. Handle Missing Fields Gracefully\n\n```go\n// Check for nil pointers\nif post.Title != nil {\n    title = *post.Title\n} else {\n    title = post.Slug\n}\n\n// Use Get() with type assertion\nif val, ok := post.Get(\"custom_field\").(string); ok {\n    // Use val\n}\n```\n\n### 6. Document Your Plugin\n\nInclude clear documentation at the top of your plugin file:\n\n```go\n// Package plugins provides lifecycle plugins for markata-go.\n//\n// MyPlugin does X, Y, and Z.\n//\n// Configuration:\n//     [markata]\n//     my_plugin_enabled = true\n//     my_plugin_threshold = 100\n//\n// Post fields set:\n//     - my_computed_field: Description of the field\n//\n// Usage in templates:\n//     {{ post.my_computed_field }}\npackage plugins\n```\n\n## See Also\n\n- [Lifecycle Stages Specification](../../spec/spec/LIFECYCLE.md) - Detailed stage documentation\n- [Plugin Specification](../../spec/spec/PLUGINS.md) - Full plugin development specification\n- [Built-in Plugins](../plugins/) - Documentation for built-in plugins\n",
      "summary": "Guide to creating custom plugins for markata-go using the 9-stage lifecycle",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "plugins",
        "development"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/performance/",
      "url": "https://markata.dev/docs/guides/performance/",
      "title": "Performance Benchmarking",
      "content_html": "\u003cp\u003emarkata-go includes a comprehensive benchmarking suite for measuring and optimizing build performance. This guide covers how to run benchmarks locally, interpret results, and use profiling tools to identify bottlenecks.\u003c/p\u003e\n\u003ch3 id=\"explain-template-work-before-optimizing-it\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExplain template work before optimizing it\u003c/span\u003e \u003ca href=\"#explain-template-work-before-optimizing-it\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eInspect \u003ccode\u003ejq '.content.template_cache' benchmark.json\u003c/code\u003e, or\n\u003ccode\u003ejq '.template_cache' public/.markata/diagnostics.json\u003c/code\u003e after a successful build.\nThe optional, additive version-1 field counts classification, full-page\nrestoration, render success/failure, and incremental serve deferral. Its bounded\nhistogram records the first failing cache gate only; earlier gates mask later\nones. \u003ccode\u003enav_preview_reset\u003c/code\u003e is context, not proof of why individual pages missed.\nNo paths, template names, hashes, or per-page telemetry are recorded.\u003c/p\u003e\n\u003cp\u003eCompare equivalent warm builds without clearing their caches, and alternate\nsamples to account for shared-host noise. A persistent miss count is not\nautomatically a bug or evidence of corruption. Reconcile \u003ccode\u003eclassified = restored + render_required\u003c/code\u003e and \u003ccode\u003erender_required = render_succeeded + render_failed + serve_deferred\u003c/code\u003e before attributing time to cache selection.\nSee \u003ca href=\"content-diagnostics.md#template-cache-decisions\"\u003eContent Diagnostics\u003c/a\u003e for\nthe complete precedence and reconciliation rules. This phase measures template\ncache decisions only, not publish I/O, and does not change rendered HTML.\u003c/p\u003e\n\u003cp\u003eUse \u003ccode\u003e--benchmark-summary-json=/tmp/benchmark.json\u003c/code\u003e for timing comparisons. The\nsummary retains hotspots and aggregate cache statistics without the much larger\nper-source feed matrix. Keep benchmark artifacts outside the site source tree;\nContent Index fingerprints untracked source-tree files at both build boundaries.\nRun a clean build, one cache-priming warm build, and then repeated steady-state\nwarm builds before comparing executors or code changes.\u003c/p\u003e\n\u003cp\u003eWarm template builds still restore every usable full page into public\n\u003ccode\u003ePost.HTML\u003c/code\u003e before rendering any misses, so custom templates can inspect\ncache-hit peers and a deleted output tree can be repaired. Restoration uses\nup to four workers, never exceeding the configured build concurrency, without\nchanging rendering concurrency or introducing another configuration flag.\nThe template phase logs separate \u003ccode\u003ePhase 1a classify\u003c/code\u003e, \u003ccode\u003ePhase 1b batch restore\u003c/code\u003e,\nand \u003ccode\u003ePhase 2 render\u003c/code\u003e; restore time belongs to Phase 1b even when no pages need\nfresh rendering. Compare both restore latency and total template time.\nThis is a latency optimization, not removal of the live full-page memory floor:\nhooks, Fontpack, Tailwind, and publication still receive complete pages.\u003c/p\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRun the end-to-end build benchmark:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejust perf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis runs the benchmark 5 times and outputs results to \u003ccode\u003ebench.txt\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"persistent-css-and-javascript-minification\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePersistent CSS and JavaScript Minification\u003c/span\u003e \u003ca href=\"#persistent-css-and-javascript-minification\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNormal builds reuse minified results for exact current inputs and matching\noptions, including static assets copied into output again as raw bytes.\nNo extra setting is required:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe per-plugin log separates work into \u003ccode\u003etransformed\u003c/code\u003e (engine calls), \u003ccode\u003erestored\u003c/code\u003e\n(verified exact-input result reuse), \u003ccode\u003eexcluded\u003c/code\u003e, and \u003ccode\u003efailed\u003c/code\u003e. Restored assets\nreceive verified result bytes without invoking the minifier, but still publish\nby atomic replacement with mode \u003ccode\u003e0644\u003c/code\u003e, just like fresh transformations. This\nalso applies when result bytes already match, without changing hardlinked\nreleases. Empty JavaScript retains its existing no-write exception.\nContents, not file size or mtime, determine reuse. There is no general\nprocessed-output shortcut: CSS important comments matching preservation\npatterns can make repeated minification non-idempotent, so retained output may\nneed another engine call. Static-asset hashed aliases still\nreceive the final canonical\nminified bytes during Cleanup.\u003c/p\u003e\n\u003cp\u003ePrivate result blobs and per-asset exact-input records live under\n\u003ccode\u003e\u0026lt;content_dir\u0026gt;/.markata/asset-minify/v1/\u003c/code\u003e, independently of the build-cache enabled\nsetting. A nonempty \u003ccode\u003e[markata-go] cache_dir\u003c/code\u003e override is used as supplied (a\nrelative path is relative to the build\u0026rsquo;s working directory), like the build\ncache. Sites and output roots are isolated even when they share cache storage.\nKeep this directory outside published output; unsafe locations, including\nsymlink relationships, produce a warning and disable reuse. Do not deploy the\nprivate cache: historical snapshots from earlier implementations may contain\ncomments removed from public assets. New transforms do not write source snapshots.\nThe derived storage paths and private parent directories must not overlap\npublished output either; unsafe configuration is rejected before directory\ncreation or permission changes, then minification proceeds uncached.\u003c/p\u003e\n\u003cp\u003eChanging CSS \u003ccode\u003epreserve_comments\u003c/code\u003e, the minifier/parser versions, or the maintained\ntransform revision invalidates affected recipes. Changed recipes always minify\nthe current stage-input bytes, even when they equal an earlier minified result.\nOnly exact input plus the same recipe can restore a verified result; matching a\nhistorical output or retry digest never authorizes reuse. The recorded source\nhash means exact transform input, not original author source. Historical\nsnapshots are never read or substituted for current input.\nTo preserve a previously stripped comment, regenerate the asset from\nauthoritative source before building; changing options alone cannot recover it\nfrom retained minified output. Missing or corrupt cached results needed for\nexact-input reuse are warned about and repaired from current bytes.\nMinification errors remain warnings rather than failing the whole build. Cache\nwrite errors also warn; if obsolete provenance cannot safely be invalidated,\nthat target is left unchanged rather than risking restoration of an older input.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e--fast\u003c/code\u003e, disabled plugins, exclusions, \u003ccode\u003e.min.js\u003c/code\u003e, and \u003ccode\u003e_pagefind\u003c/code\u003e retain their\nexisting selection behavior. They do not change transform recipes. Legacy\n\u003ccode\u003e.markata-{js,css}_minify-cache\u003c/code\u003e sidecars are ignored and left untouched, not\npromoted into trusted provenance. After upgrading, perform one rebuild that\nregenerates raw source assets, especially assets not normally recopied. Clearing\nonly the new cache cannot recover original source from an already-minified file.\u003c/p\u003e\n\u003cp\u003eFor measurements, keep caches intact, prime the new records, then compare\nequivalent alternating warm builds. Repeated raw copies should avoid engine\nwork after priming, but do not expect zero transformations for retained\nnon-idempotent output, or no target writes on hits. Restored counts measure\navoided engine work, not by themselves an end-to-end speedup.\u003c/p\u003e\n\u003ch2 id=\"running-benchmarks-locally\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRunning Benchmarks Locally\u003c/span\u003e \u003ca href=\"#running-benchmarks-locally\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"prerequisites\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrerequisites\u003c/span\u003e \u003ca href=\"#prerequisites\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eInstall \u003ccode\u003ebenchstat\u003c/code\u003e for analyzing benchmark results:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego install golang.org/x/perf/cmd/benchstat@latest\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"available-commands\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAvailable Commands\u003c/span\u003e \u003ca href=\"#available-commands\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCommand\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ejust perf\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRun end-to-end benchmarks (5 iterations)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ejust perf-profile\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate CPU and memory profiles\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ejust perf-stages\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBenchmark individual lifecycle stages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ejust perf-concurrency\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTest performance at different concurrency levels\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ejust perf-compare old.txt new.txt\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCompare two benchmark runs\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ejust perf-generate\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRegenerate the benchmark fixture\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"running-specific-benchmarks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRunning Specific Benchmarks\u003c/span\u003e \u003ca href=\"#running-specific-benchmarks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# All benchmarks\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego \u003cspan class=\"nb\"\u003etest\u003c/span\u003e -bench\u003cspan class=\"o\"\u003e=\u003c/span\u003e. -run\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;^$\u0026#39;\u003c/span\u003e -benchmem ./benchmarks/...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Only end-to-end\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego \u003cspan class=\"nb\"\u003etest\u003c/span\u003e -bench\u003cspan class=\"o\"\u003e=\u003c/span\u003eBenchmarkBuild_EndToEnd -run\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;^$\u0026#39;\u003c/span\u003e -benchmem ./benchmarks/...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Only stage-specific\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego \u003cspan class=\"nb\"\u003etest\u003c/span\u003e -bench\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;BenchmarkStage\u0026#39;\u003c/span\u003e -run\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;^$\u0026#39;\u003c/span\u003e -benchmem ./benchmarks/...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# With more iterations for stability\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego \u003cspan class=\"nb\"\u003etest\u003c/span\u003e -bench\u003cspan class=\"o\"\u003e=\u003c/span\u003eBenchmarkBuild -run\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;^$\u0026#39;\u003c/span\u003e -benchmem -count\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e10\u003c/span\u003e ./benchmarks/...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"understanding-benchmark-output\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUnderstanding Benchmark Output\u003c/span\u003e \u003ca href=\"#understanding-benchmark-output\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"build-summary-hotspots\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Summary Hotspots\u003c/span\u003e \u003ca href=\"#build-summary-hotspots\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe default \u003ccode\u003emarkata-go build\u003c/code\u003e summary now includes two fast feedback signals:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eResource profile\u003c/strong\u003e - estimated wall-time spent on CPU work, network wait, disk read wait, disk write wait, and idle time\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHotspots\u003c/strong\u003e - the slowest lifecycle plugin hooks from that build\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSlowest requests\u003c/strong\u003e - the longest outbound HTTP requests with plugin attribution\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eExample:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBuild completed successfully!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  Resource profile (estimated wall time):\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    CPU             18.2s (20.1%)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Network wait    42.7s (47.1%)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Disk read       10.1s (11.1%)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Disk write      14.3s (15.8%)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Idle             5.4s ( 5.9%)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  Hotspots:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    collect/blogroll 31.77s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    cleanup/pagefind 26.32s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    write/publish_feeds 8.54s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  Slowest requests:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    collect/blogroll GET https://example.com/feed.xml 12.40s (HTTP 200)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    transform/mentions GET https://slow.example.com/ 6.80s (context deadline exceeded)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse this summary to decide what tool to reach for next:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003emostly \u003ccode\u003eCPU\u003c/code\u003e -\u0026gt; capture a CPU profile with \u003ccode\u003ejust perf-profile\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003emostly \u003ccode\u003eNetwork wait\u003c/code\u003e -\u0026gt; inspect \u003ccode\u003eSlowest requests\u003c/code\u003e first, then the owning plugins that fetch remote content or external metadata\u003c/li\u003e\n\u003cli\u003emostly \u003ccode\u003eDisk read\u003c/code\u003e -\u0026gt; inspect globbing, cache loads, index reads, and wide content scans\u003c/li\u003e\n\u003cli\u003emostly \u003ccode\u003eDisk write\u003c/code\u003e -\u0026gt; inspect publishing, cache saves, index generation, and emitted static output\u003c/li\u003e\n\u003cli\u003eif \u003ccode\u003econfigure/build_cache\u003c/code\u003e is hot on warm builds, check whether the template or config tree actually changed; unchanged template trees now reuse a cheap fingerprint before falling back to a full content hash\u003c/li\u003e\n\u003cli\u003eif \u003ccode\u003e/tags\u003c/code\u003e or \u003ccode\u003e/garden\u003c/code\u003e hashing is hot, prefer cached per-post semantic hashes over re-deriving the same per-post summaries inside the listing hashers\u003c/li\u003e\n\u003cli\u003emostly \u003ccode\u003eIdle\u003c/code\u003e -\u0026gt; look for subprocess waits, scheduler gaps, or work that is happening outside the Go process\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"concrete-flow-for-real-site-builds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConcrete Flow For Real Site Builds\u003c/span\u003e \u003ca href=\"#concrete-flow-for-real-site-builds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse this flow when you want to answer \u0026ldquo;what feature is slowing this build down?\u0026rdquo;\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eRun a build that matches the feature set you care about.\n\u003cul\u003e\n\u003cli\u003efor the everyday dev loop, use \u003ccode\u003emarkata-go build --fast\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003efor production-style live iteration, use \u003ccode\u003emarkata-go serve --incremental\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003efor real feature attribution, run the full build without \u003ccode\u003e--fast\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eRead the footer in this order:\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eResource profile\u003c/code\u003e tells you whether the build is mostly CPU, network, disk read, or disk write bound\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eHotspots\u003c/code\u003e tells you which plugin hooks are slow overall\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eSlowest requests\u003c/code\u003e tells you which exact network calls dominated wall time\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eIf \u003ccode\u003eSlowest requests\u003c/code\u003e points to one plugin repeatedly, fix that plugin first.\n\u003cul\u003e\n\u003cli\u003eadd or verify cache reuse\u003c/li\u003e\n\u003cli\u003ereduce duplicate fetches\u003c/li\u003e\n\u003cli\u003ebatch requests or lower request count\u003c/li\u003e\n\u003cli\u003emake timeouts and concurrency explicit\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eExport structured data when you need a diffable artifact:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --benchmark-json benchmark.json\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003col start=\"5\"\u003e\n\u003cli\u003eIf the build is still mostly CPU after network fixes, capture \u003ccode\u003e--cpuprofile\u003c/code\u003e and inspect the hottest functions with \u003ccode\u003ego tool pprof\u003c/code\u003e.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"automatic-feed-collection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAutomatic-Feed Collection\u003c/span\u003e \u003ca href=\"#automatic-feed-collection\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAutomatic-feed collection emits one bounded \u003ccode\u003eauto_feeds\u003c/code\u003e / \u003ccode\u003ecollect\u003c/code\u003e debug\nrecord. \u003ccode\u003egeneration_ns\u003c/code\u003e, \u003ccode\u003efiltering_sorting_ns\u003c/code\u003e, \u003ccode\u003eselection_recording_ns\u003c/code\u003e, and\n\u003ccode\u003epagination_preparation_ns\u003c/code\u003e are exclusive elapsed phase sums in nanoseconds.\n\u003ccode\u003efeeds\u003c/code\u003e, \u003ccode\u003ematched\u003c/code\u003e, \u003ccode\u003eselected\u003c/code\u003e, and \u003ccode\u003eobservations\u003c/code\u003e are numeric counts (post\ncounts include occurrences across feeds). There are no per-feed names, filters,\nor paths in this record, and these timings are not diagnostics v1 fields.\nUse the selection phase when profiling complete diagnostics recording: every\nconsidered occurrence is recorded, including exclusions. Configured and automatic\nfeeds reuse transient source flags, observation rows, membership maps, and a\nreason arena only within one synchronous Collect invocation, and write one\natomic ledger batch per feed. This does not cache selection across builds, change\nfilters or publication, reduce artifact completeness, or establish an RSS win.\u003c/p\u003e\n\u003cp\u003eFor new batch relationships, ledger-owned object and initial-reason slabs hold\nat most 10 dispositions or 32 string slots each, with smaller observation-bounded\ntails. Raw reason lists over 32 strings use ordinary standalone append/deduplication\nwithout a counting pass or allocation by raw length; duplicate/empty-heavy input\nretains storage only for unique nonempty values.\nAllocation is lazy; existing relationships allocate no slabs, and single-record\nproducers keep their individual allocation path. Published object addresses stay\nstable, and copied, ordered-deduplicated reason segments are capacity-clamped so\nlater appends cannot touch neighbors. This reduces per-relation heap allocations\nwithout changing sparse maps or introducing a registry or cross-build pool.\nAllocation results alone do not demonstrate faster full builds.\u003c/p\u003e\n\u003ch3 id=\"diagnostics-publication\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDiagnostics Publication\u003c/span\u003e \u003ca href=\"#diagnostics-publication\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFull-build diagnostics publication has a separate bounded \u003ccode\u003ediagnostics_artifact\u003c/code\u003e\ncleanup debug record: snapshot, optional source metadata, serialization/buffering,\nactual file-write time/bytes/calls, flush, sync, close and replacement. Use\n\u003ccode\u003eserialization_buffering_exclusive\u003c/code\u003e and \u003ccode\u003eflush_exclusive\u003c/code\u003e with \u003ccode\u003efile_write\u003c/code\u003e\nto avoid counting file I/O twice; the corresponding \u003ccode\u003e*_inclusive\u003c/code\u003e wall totals\noverlap it. Directory/temp setup and removal are not included. No publication\ntimings are inserted into the diagnostics v1 document.\u003c/p\u003e\n\u003cp\u003eThe diagnostics artifact writer reuses owned per-entry scratch and already\nencoded/indented feed fragments within a single call (at most 1024 retained\nfragments and 1 MiB including keys). Values outside these caps bypass retention,\nnot output. This reduces repeated sanitation allocations and JSON indentation\nwhen posts share feed dispositions; it does not remove observations, persist a\ncache, or alter output bytes. Snapshot and artifact size still scale with the\ncomplete ledger. Compare equivalent warm builds and fixed-metadata serializer\nbenchmarks rather than disabling diagnostics to improve a timing.\nPublication uses a fixed 64 KiB buffer. Large entry writes can bypass it, so use\nthe measured raw-write counts rather than estimating calls from artifact size.\nReduced serializer allocation does not establish a whole-build RSS reduction;\nlive templates and rendered HTML may still dominate memory.\nSnapshot copying also replaces per-feed reason allocations with one owned arena\nper entry. Feed slices remain isolated and capacity-clamped after deduplication,\nand feed sorting uses a typed comparator. This lowers allocation count and\nsnapshot work without reusing snapshots or changing ownership, counts or output.\u003c/p\u003e\n\u003ch3 id=\"json-benchmarks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJSON Benchmarks\u003c/span\u003e \u003ca href=\"#json-benchmarks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse machine-readable output when you want to compare builds over time or ingest\nresults into another tool:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --benchmark-json benchmark.json\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --benchmark-json - \u0026gt; benchmark.json\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe JSON output includes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ewhole-build resource totals\u003c/li\u003e\n\u003cli\u003eper-stage timings and per-stage estimated resources\u003c/li\u003e\n\u003cli\u003eplugin timing entries used for hotspot ranking\u003c/li\u003e\n\u003cli\u003erequest timing entries used for the slowest-request list\u003c/li\u003e\n\u003cli\u003ebuild counts and warnings\u003c/li\u003e\n\u003cli\u003ethe complete content summary and per-source entries, including every feed\ndisposition and selection reason\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eReports stream content entries with reusable per-entry buffers and buffered\nwrites, reducing serialization memory on large sites without omitting details.\nThe two-space-indented JSON format and trailing newline are unchanged. The\nreport itself can still be large: its size grows with content and feed\nobservations, while temporary content-encoding buffers grow with the largest\nsingle entry rather than the complete report. Non-content timing metadata is\nstill encoded together. File and stdout modes retain the same complete payload;\nwrite, flush, and file-close failures are reported as errors.\u003c/p\u003e\n\u003ch3 id=\"per-stage-detail\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePer-Stage Detail\u003c/span\u003e \u003ca href=\"#per-stage-detail\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eKeep the default footer small for everyday use, and opt into stage detail when\ndebugging:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build -v --benchmark-detailed\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis adds a per-stage estimated wall-time breakdown so you can see whether a\nslow build is CPU-heavy in \u003ccode\u003erender\u003c/code\u003e, read-heavy in \u003ccode\u003eglob\u003c/code\u003e, write-heavy in \u003ccode\u003ewrite\u003c/code\u003e, or mostly idle in a\nsubprocess-oriented cleanup stage.\u003c/p\u003e\n\u003ch3 id=\"raw-output\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRaw Output\u003c/span\u003e \u003ca href=\"#raw-output\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003eBenchmarkBuild_EndToEnd-8    \t       5\t 234567890 ns/op\t123456789 B/op\t 1234567 allocs/op\n\u003c/code\u003e\u003c/pre\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eMeaning\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eBenchmarkBuild_EndToEnd-8\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTest name with GOMAXPROCS\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e5\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNumber of iterations\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e234567890 ns/op\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNanoseconds per operation\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e123456789 B/op\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBytes allocated per operation\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e1234567 allocs/op\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNumber of allocations per operation\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"using-benchstat\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing benchstat\u003c/span\u003e \u003ca href=\"#using-benchstat\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ebenchstat\u003c/code\u003e provides statistical analysis of benchmark results:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Single run analysis\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebenchstat bench.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Compare two runs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebenchstat old.txt new.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eExample output:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ename                 time/op\nBuild_EndToEnd-8     235ms ± 2%\n\nname                 alloc/op\nBuild_EndToEnd-8     124MB ± 0%\n\nname                 allocs/op\nBuild_EndToEnd-8     1.23M ± 0%\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe \u003ccode\u003e±\u003c/code\u003e value shows the variation between runs. Lower is better for reproducibility.\u003c/p\u003e\n\u003ch3 id=\"comparing-runs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComparing Runs\u003c/span\u003e \u003ca href=\"#comparing-runs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen comparing two benchmark files:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ename              old time/op    new time/op    delta\nBuild_EndToEnd-8    250ms ± 3%     235ms ± 2%   -6.00%  (p=0.008 n=5+5)\n\u003c/code\u003e\u003c/pre\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eColumn\u003c/th\u003e\n\u003cth\u003eMeaning\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eold time/op\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTime from first file\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enew time/op\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTime from second file\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edelta\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePercentage change (negative = faster)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ep=0.008\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eStatistical significance (p \u0026lt; 0.05 is significant)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003en=5+5\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNumber of samples in each file\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"profiling\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProfiling\u003c/span\u003e \u003ca href=\"#profiling\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"generating-profiles\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGenerating Profiles\u003c/span\u003e \u003ca href=\"#generating-profiles\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejust perf-profile\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis creates:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecpu.prof\u003c/code\u003e - CPU profile\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emem.prof\u003c/code\u003e - Memory allocation profile\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"analyzing-cpu-profiles\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAnalyzing CPU Profiles\u003c/span\u003e \u003ca href=\"#analyzing-cpu-profiles\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"interactive-cli\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInteractive CLI\u003c/span\u003e \u003ca href=\"#interactive-cli\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego tool pprof cpu.prof\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCommon commands:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003etop\u003c/code\u003e - Show top functions by CPU time\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etop -cum\u003c/code\u003e - Show by cumulative time\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elist FunctionName\u003c/code\u003e - Show annotated source\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eweb\u003c/code\u003e - Open in browser (requires graphviz)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"web-interface\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWeb Interface\u003c/span\u003e \u003ca href=\"#web-interface\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego tool pprof -http\u003cspan class=\"o\"\u003e=\u003c/span\u003e:8080 cpu.prof\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis opens an interactive web UI with:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFlame graphs\u003c/li\u003e\n\u003cli\u003eCall graphs\u003c/li\u003e\n\u003cli\u003eSource code annotation\u003c/li\u003e\n\u003cli\u003eTop functions\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"analyzing-memory-profiles\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAnalyzing Memory Profiles\u003c/span\u003e \u003ca href=\"#analyzing-memory-profiles\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego tool pprof mem.prof\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUseful options:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ego tool pprof -alloc_space mem.prof\u003c/code\u003e - Total allocations\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ego tool pprof -alloc_objects mem.prof\u003c/code\u003e - Number of allocations\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ego tool pprof -inuse_space mem.prof\u003c/code\u003e - Live memory\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"profile-types\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProfile Types\u003c/span\u003e \u003ca href=\"#profile-types\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eProfile\u003c/th\u003e\n\u003cth\u003eWhat it Measures\u003c/th\u003e\n\u003cth\u003eWhen to Use\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eCPU\u003c/td\u003e\n\u003ctd\u003eTime spent in functions\u003c/td\u003e\n\u003ctd\u003eSlow builds\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMemory\u003c/td\u003e\n\u003ctd\u003eAllocations\u003c/td\u003e\n\u003ctd\u003eHigh memory usage\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBlock\u003c/td\u003e\n\u003ctd\u003eBlocking on sync primitives\u003c/td\u003e\n\u003ctd\u003eDeadlocks/contention\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMutex\u003c/td\u003e\n\u003ctd\u003eMutex contention\u003c/td\u003e\n\u003ctd\u003eLock performance\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"benchmark-fixture\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBenchmark Fixture\u003c/span\u003e \u003ca href=\"#benchmark-fixture\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe benchmark suite uses a deterministic fixture at \u003ccode\u003ebenchmarks/site/\u003c/code\u003e:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ebenchmarks/\n├── site/\n│   ├── markata-go.toml      # Benchmark config\n│   └── posts/\n│       ├── blog/2024/01/    # 60 blog posts\n│       └── docs/guides/     # 40 documentation guides\n└── benchmark_test.go        # Benchmark tests\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"fixture-characteristics\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFixture Characteristics\u003c/span\u003e \u003ca href=\"#fixture-characteristics\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e100 posts total\u003c/strong\u003e - Representative of a medium-sized site\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCode-heavy content\u003c/strong\u003e - Syntax highlighting stress test\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNested paths\u003c/strong\u003e - Tests path handling\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMultiple languages\u003c/strong\u003e - Go, Python, JavaScript, Rust, SQL\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDeterministic\u003c/strong\u003e - Same content every generation for reproducible results\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"regenerating-the-fixture\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRegenerating the Fixture\u003c/span\u003e \u003ca href=\"#regenerating-the-fixture\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejust perf-generate\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr directly:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego run benchmarks/generate_posts.go\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"ci-performance-tracking\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCI Performance Tracking\u003c/span\u003e \u003ca href=\"#ci-performance-tracking\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePerformance benchmarks run automatically:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eWeekly\u003c/strong\u003e - Sunday at 2 AM UTC\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eManual\u003c/strong\u003e - Via workflow dispatch\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"viewing-results\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eViewing Results\u003c/span\u003e \u003ca href=\"#viewing-results\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eGo to Actions tab in GitHub\u003c/li\u003e\n\u003cli\u003eSelect \u0026ldquo;Performance Benchmarks\u0026rdquo; workflow\u003c/li\u003e\n\u003cli\u003eView the job summary for benchstat output\u003c/li\u003e\n\u003cli\u003eDownload artifacts for profiles\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"comparing-branches\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComparing Branches\u003c/span\u003e \u003ca href=\"#comparing-branches\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTrigger a manual workflow with a comparison branch:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eGo to Actions \u0026gt; Performance Benchmarks\u003c/li\u003e\n\u003cli\u003eClick \u0026ldquo;Run workflow\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eEnter the branch name to compare against\u003c/li\u003e\n\u003cli\u003eView the comparison in the job summary\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"optimization-tips\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOptimization Tips\u003c/span\u003e \u003ca href=\"#optimization-tips\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"common-bottlenecks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Bottlenecks\u003c/span\u003e \u003ca href=\"#common-bottlenecks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eMarkdown rendering\u003c/strong\u003e - goldmark processing\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTemplate execution\u003c/strong\u003e - Pongo2 templates\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFile I/O\u003c/strong\u003e - Reading/writing files\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSyntax highlighting\u003c/strong\u003e - Chroma processing\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMemory allocations\u003c/strong\u003e - String operations\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"improving-performance\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eImproving Performance\u003c/span\u003e \u003ca href=\"#improving-performance\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"concurrency\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConcurrency\u003c/span\u003e \u003ca href=\"#concurrency\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eAdjust the concurrency level in \u003ccode\u003emarkata-go.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econcurrency\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e  \u003cspan class=\"c\"\u003e# 0 = auto (NumCPU)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"profile-guided-optimization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProfile-Guided Optimization\u003c/span\u003e \u003ca href=\"#profile-guided-optimization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003eRun profiling: \u003ccode\u003ejust perf-profile\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAnalyze: \u003ccode\u003ego tool pprof -http=:8080 cpu.prof\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eIdentify hot paths\u003c/li\u003e\n\u003cli\u003eOptimize targeted functions\u003c/li\u003e\n\u003cli\u003eRe-benchmark to verify improvement\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"memory-optimization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMemory Optimization\u003c/span\u003e \u003ca href=\"#memory-optimization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eIf memory is the bottleneck:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego tool pprof -alloc_space mem.prof\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eLook for:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLarge allocations (\u003ccode\u003ealloc_space\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eMany small allocations (\u003ccode\u003ealloc_objects\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eFunctions with high cumulative allocations\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"writing-efficient-plugins\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWriting Efficient Plugins\u003c/span\u003e \u003ca href=\"#writing-efficient-plugins\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eReuse allocations\u003c/strong\u003e - Use \u003ccode\u003esync.Pool\u003c/code\u003e for buffers\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMinimize copies\u003c/strong\u003e - Use pointers where appropriate\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBatch operations\u003c/strong\u003e - Group file writes\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCache results\u003c/strong\u003e - Use the lifecycle cache\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"benchmarks-skip\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBenchmarks Skip\u003c/span\u003e \u003ca href=\"#benchmarks-skip\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003e--- SKIP: BenchmarkBuild_EndToEnd\n    benchmark_test.go:35: Benchmark fixture not found\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eFix: Run \u003ccode\u003ejust perf-generate\u003c/code\u003e to create the fixture.\u003c/p\u003e\n\u003ch3 id=\"high-variance\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHigh Variance\u003c/span\u003e \u003ca href=\"#high-variance\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf \u003ccode\u003e±\u003c/code\u003e values are high (\u0026gt;10%), try:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMore iterations: \u003ccode\u003e-count=10\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eClose other applications\u003c/li\u003e\n\u003cli\u003eUse a consistent environment\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"profile-is-empty\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProfile is Empty\u003c/span\u003e \u003ca href=\"#profile-is-empty\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnsure the benchmark runs long enough:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego \u003cspan class=\"nb\"\u003etest\u003c/span\u003e -bench\u003cspan class=\"o\"\u003e=\u003c/span\u003eBenchmarkBuild_EndToEnd -run\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;^$\u0026#39;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -benchtime\u003cspan class=\"o\"\u003e=\u003c/span\u003e30s \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -cpuprofile\u003cspan class=\"o\"\u003e=\u003c/span\u003ecpu.prof \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ./benchmarks/...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"source-encrypted-warm-builds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSource-encrypted warm builds\u003c/span\u003e \u003ca href=\"#source-encrypted-warm-builds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSource-encrypted Markdown deliberately bypasses parsed-post and plaintext\narticle caches. Reparsing alone should not force fresh page templates: the\ncanonical title/feed/tag/garden hashes are compared against the previous build\nthrough a build-local, hash-only handoff. No decrypted snapshot is retained by\nthat handoff, and no cache schema migration is required.\u003c/p\u003e\n\u003cp\u003eFor already processed posts, incomplete semantic hashes (for example after a\ncold navigation reset) mean the previous canonical baseline is unavailable.\nThe build retains the original comparison for that pass and repairs the hashes,\nrather than marking every reparsed page changed. New entries still compare\nagainst an explicitly empty/partial baseline. Cold-to-edit cache scope does not\nrequire warm priming.\u003c/p\u003e\n\u003cp\u003eEncrypted wrappers are reused only when article HTML, key name, resolved\npassword, hint, source path, and wrapper/browser-crypto revision all match.\nReal wrapper regeneration invalidates the page and dependent closure before\ntemplates and publication; subsequent equivalent warm builds stabilize.\nIt also clears the old full-page reference before cache writes. After a failed\nfresh full-page cache write, a persisted reload reports \u003ccode\u003efull_html_unavailable\u003c/code\u003e\nand re-renders with the current wrapper rather than restoring old ciphertext.\nRandomized source ciphertext for the same plaintext/key contract is not itself\na wrapper miss. Older wrapper identities miss once. Conservative Load dirty\nsignals for feeds, tags, and garden output remain unchanged.\u003c/p\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfiguration Guide\u003c/a\u003e - Concurrency settings\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/plugin-development/\"\u003ePlugin Development\u003c/a\u003e - Writing efficient plugins\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://go.dev/blog/pprof\"\u003eGo Profiling\u003c/a\u003e - Official pprof documentation\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"nested-operation-spans\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNested operation spans\u003c/span\u003e \u003ca href=\"#nested-operation-spans\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSave build measurements with \u003ccode\u003emarkata-go build --benchmark-json=benchmark.json\u003c/code\u003e,\nthen inspect completed spans with \u003ccode\u003ejq '.benchmark.Spans' benchmark.json\u003c/code\u003e.\nDurations and start offsets use nanoseconds; a zero duration is valid on clocks\nwith coarse resolution. IDs and parent IDs describe nesting, and stage/plugin\nfields identify the active build work when the span started.\u003c/p\u003e\n\u003cp\u003ePlugin authors can instrument an operation using \u003ccode\u003ebuildstats.StartSpan(ctx, \u0026quot;template.execute\u0026quot;)\u003c/code\u003e and finish the returned handle with \u003ccode\u003eEnd()\u003c/code\u003e or\n\u003ccode\u003eEndError(err)\u003c/code\u003e before the build profile stops. Pass the returned context to\nchild operations to preserve nesting. With no active profile, these calls are\nsafe no-ops. This release provides the recording API; builds without explicit\nspan instrumentation may report an empty span list.\u003c/p\u003e\n\u003cp\u003eUse fixed operation names and safe attributes. Credential-bearing attribute\nkeys are dropped, and error text is discarded, but values under other keys are\nnot automatically redacted. Avoid query strings, sensitive paths, and secrets.\nSee the \u003ca href=\"../../spec/spec/LIFECYCLE.md\"\u003elifecycle specification\u003c/a\u003e for the API\ncontract and limits.\u003c/p\u003e\n\u003ch2 id=\"otlp-configuration-foundation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOTLP configuration foundation\u003c/span\u003e \u003ca href=\"#otlp-configuration-foundation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe Go API \u003ccode\u003ebuildstats.ResolveOTLPConfig(os.Getenv)\u003c/code\u003e resolves optional trace\nsettings. For example, a generic endpoint \u003ccode\u003ehttp://collector:4318\u003c/code\u003e resolves to\n\u003ccode\u003ehttp://collector:4318/v1/traces\u003c/code\u003e with the default \u003ccode\u003ehttp/protobuf\u003c/code\u003e protocol.\nThe resolver alone does not send traces, and setting these variables does not\nyet enable export from \u003ccode\u003emarkata-go build\u003c/code\u003e.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eMeaning\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eOTEL_EXPORTER_OTLP_TRACES_ENDPOINT\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eComplete trace URL; takes precedence over the generic endpoint\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eOTEL_EXPORTER_OTLP_ENDPOINT\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGeneric URL; HTTP protocols append \u003ccode\u003e/v1/traces\u003c/code\u003e, while gRPC preserves the URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eOTEL_EXPORTER_OTLP_TRACES_PROTOCOL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTrace protocol; takes precedence over the generic protocol\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eOTEL_EXPORTER_OTLP_PROTOCOL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGeneric protocol; defaults to \u003ccode\u003ehttp/protobuf\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eSupported protocols are \u003ccode\u003egrpc\u003c/code\u003e, \u003ccode\u003ehttp/protobuf\u003c/code\u003e, and \u003ccode\u003ehttp/json\u003c/code\u003e. Endpoints must\nuse HTTP or HTTPS and include a host. With no endpoint, the returned config is\ndisabled. This foundation follows \u003ca href=\"https://opentelemetry.io/docs/specs/otel/protocol/exporter/\"\u003eOpenTelemetry endpoint conventions\u003c/a\u003e;\nexporter integration, headers, sampling, and collector deployment remain\nfollow-up work.\u003c/p\u003e\n",
      "content_text": "\n\nmarkata-go includes a comprehensive benchmarking suite for measuring and optimizing build performance. This guide covers how to run benchmarks locally, interpret results, and use profiling tools to identify bottlenecks.\n\n### Explain template work before optimizing it\n\nInspect `jq '.content.template_cache' benchmark.json`, or\n`jq '.template_cache' public/.markata/diagnostics.json` after a successful build.\nThe optional, additive version-1 field counts classification, full-page\nrestoration, render success/failure, and incremental serve deferral. Its bounded\nhistogram records the first failing cache gate only; earlier gates mask later\nones. `nav_preview_reset` is context, not proof of why individual pages missed.\nNo paths, template names, hashes, or per-page telemetry are recorded.\n\nCompare equivalent warm builds without clearing their caches, and alternate\nsamples to account for shared-host noise. A persistent miss count is not\nautomatically a bug or evidence of corruption. Reconcile `classified =\nrestored + render_required` and `render_required = render_succeeded +\nrender_failed + serve_deferred` before attributing time to cache selection.\nSee [Content Diagnostics](content-diagnostics.md#template-cache-decisions) for\nthe complete precedence and reconciliation rules. This phase measures template\ncache decisions only, not publish I/O, and does not change rendered HTML.\n\nUse `--benchmark-summary-json=/tmp/benchmark.json` for timing comparisons. The\nsummary retains hotspots and aggregate cache statistics without the much larger\nper-source feed matrix. Keep benchmark artifacts outside the site source tree;\nContent Index fingerprints untracked source-tree files at both build boundaries.\nRun a clean build, one cache-priming warm build, and then repeated steady-state\nwarm builds before comparing executors or code changes.\n\nWarm template builds still restore every usable full page into public\n`Post.HTML` before rendering any misses, so custom templates can inspect\ncache-hit peers and a deleted output tree can be repaired. Restoration uses\nup to four workers, never exceeding the configured build concurrency, without\nchanging rendering concurrency or introducing another configuration flag.\nThe template phase logs separate `Phase 1a classify`, `Phase 1b batch restore`,\nand `Phase 2 render`; restore time belongs to Phase 1b even when no pages need\nfresh rendering. Compare both restore latency and total template time.\nThis is a latency optimization, not removal of the live full-page memory floor:\nhooks, Fontpack, Tailwind, and publication still receive complete pages.\n\n## Quick Start\n\nRun the end-to-end build benchmark:\n\n```bash\njust perf\n```\n\nThis runs the benchmark 5 times and outputs results to `bench.txt`.\n\n## Persistent CSS and JavaScript Minification\n\nNormal builds reuse minified results for exact current inputs and matching\noptions, including static assets copied into output again as raw bytes.\nNo extra setting is required:\n\n```bash\nmarkata-go build\nmarkata-go build\n```\n\nThe per-plugin log separates work into `transformed` (engine calls), `restored`\n(verified exact-input result reuse), `excluded`, and `failed`. Restored assets\nreceive verified result bytes without invoking the minifier, but still publish\nby atomic replacement with mode `0644`, just like fresh transformations. This\nalso applies when result bytes already match, without changing hardlinked\nreleases. Empty JavaScript retains its existing no-write exception.\nContents, not file size or mtime, determine reuse. There is no general\nprocessed-output shortcut: CSS important comments matching preservation\npatterns can make repeated minification non-idempotent, so retained output may\nneed another engine call. Static-asset hashed aliases still\nreceive the final canonical\nminified bytes during Cleanup.\n\nPrivate result blobs and per-asset exact-input records live under\n`\u003ccontent_dir\u003e/.markata/asset-minify/v1/`, independently of the build-cache enabled\nsetting. A nonempty `[markata-go] cache_dir` override is used as supplied (a\nrelative path is relative to the build's working directory), like the build\ncache. Sites and output roots are isolated even when they share cache storage.\nKeep this directory outside published output; unsafe locations, including\nsymlink relationships, produce a warning and disable reuse. Do not deploy the\nprivate cache: historical snapshots from earlier implementations may contain\ncomments removed from public assets. New transforms do not write source snapshots.\nThe derived storage paths and private parent directories must not overlap\npublished output either; unsafe configuration is rejected before directory\ncreation or permission changes, then minification proceeds uncached.\n\nChanging CSS `preserve_comments`, the minifier/parser versions, or the maintained\ntransform revision invalidates affected recipes. Changed recipes always minify\nthe current stage-input bytes, even when they equal an earlier minified result.\nOnly exact input plus the same recipe can restore a verified result; matching a\nhistorical output or retry digest never authorizes reuse. The recorded source\nhash means exact transform input, not original author source. Historical\nsnapshots are never read or substituted for current input.\nTo preserve a previously stripped comment, regenerate the asset from\nauthoritative source before building; changing options alone cannot recover it\nfrom retained minified output. Missing or corrupt cached results needed for\nexact-input reuse are warned about and repaired from current bytes.\nMinification errors remain warnings rather than failing the whole build. Cache\nwrite errors also warn; if obsolete provenance cannot safely be invalidated,\nthat target is left unchanged rather than risking restoration of an older input.\n\n`--fast`, disabled plugins, exclusions, `.min.js`, and `_pagefind` retain their\nexisting selection behavior. They do not change transform recipes. Legacy\n`.markata-{js,css}_minify-cache` sidecars are ignored and left untouched, not\npromoted into trusted provenance. After upgrading, perform one rebuild that\nregenerates raw source assets, especially assets not normally recopied. Clearing\nonly the new cache cannot recover original source from an already-minified file.\n\nFor measurements, keep caches intact, prime the new records, then compare\nequivalent alternating warm builds. Repeated raw copies should avoid engine\nwork after priming, but do not expect zero transformations for retained\nnon-idempotent output, or no target writes on hits. Restored counts measure\navoided engine work, not by themselves an end-to-end speedup.\n\n## Running Benchmarks Locally\n\n### Prerequisites\n\nInstall `benchstat` for analyzing benchmark results:\n\n```bash\ngo install golang.org/x/perf/cmd/benchstat@latest\n```\n\n### Available Commands\n\n| Command | Description |\n|---------|-------------|\n| `just perf` | Run end-to-end benchmarks (5 iterations) |\n| `just perf-profile` | Generate CPU and memory profiles |\n| `just perf-stages` | Benchmark individual lifecycle stages |\n| `just perf-concurrency` | Test performance at different concurrency levels |\n| `just perf-compare old.txt new.txt` | Compare two benchmark runs |\n| `just perf-generate` | Regenerate the benchmark fixture |\n\n### Running Specific Benchmarks\n\n```bash\n# All benchmarks\ngo test -bench=. -run='^$' -benchmem ./benchmarks/...\n\n# Only end-to-end\ngo test -bench=BenchmarkBuild_EndToEnd -run='^$' -benchmem ./benchmarks/...\n\n# Only stage-specific\ngo test -bench='BenchmarkStage' -run='^$' -benchmem ./benchmarks/...\n\n# With more iterations for stability\ngo test -bench=BenchmarkBuild -run='^$' -benchmem -count=10 ./benchmarks/...\n```\n\n## Understanding Benchmark Output\n\n### Build Summary Hotspots\n\nThe default `markata-go build` summary now includes two fast feedback signals:\n\n- **Resource profile** - estimated wall-time spent on CPU work, network wait, disk read wait, disk write wait, and idle time\n- **Hotspots** - the slowest lifecycle plugin hooks from that build\n- **Slowest requests** - the longest outbound HTTP requests with plugin attribution\n\nExample:\n\n```text\nBuild completed successfully!\n  Resource profile (estimated wall time):\n    CPU             18.2s (20.1%)\n    Network wait    42.7s (47.1%)\n    Disk read       10.1s (11.1%)\n    Disk write      14.3s (15.8%)\n    Idle             5.4s ( 5.9%)\n  Hotspots:\n    collect/blogroll 31.77s\n    cleanup/pagefind 26.32s\n    write/publish_feeds 8.54s\n  Slowest requests:\n    collect/blogroll GET https://example.com/feed.xml 12.40s (HTTP 200)\n    transform/mentions GET https://slow.example.com/ 6.80s (context deadline exceeded)\n```\n\nUse this summary to decide what tool to reach for next:\n\n- mostly `CPU` -\u003e capture a CPU profile with `just perf-profile`\n- mostly `Network wait` -\u003e inspect `Slowest requests` first, then the owning plugins that fetch remote content or external metadata\n- mostly `Disk read` -\u003e inspect globbing, cache loads, index reads, and wide content scans\n- mostly `Disk write` -\u003e inspect publishing, cache saves, index generation, and emitted static output\n- if `configure/build_cache` is hot on warm builds, check whether the template or config tree actually changed; unchanged template trees now reuse a cheap fingerprint before falling back to a full content hash\n- if `/tags` or `/garden` hashing is hot, prefer cached per-post semantic hashes over re-deriving the same per-post summaries inside the listing hashers\n- mostly `Idle` -\u003e look for subprocess waits, scheduler gaps, or work that is happening outside the Go process\n\n### Concrete Flow For Real Site Builds\n\nUse this flow when you want to answer \"what feature is slowing this build down?\"\n\n1. Run a build that matches the feature set you care about.\n   - for the everyday dev loop, use `markata-go build --fast`\n   - for production-style live iteration, use `markata-go serve --incremental`\n   - for real feature attribution, run the full build without `--fast`\n2. Read the footer in this order:\n   - `Resource profile` tells you whether the build is mostly CPU, network, disk read, or disk write bound\n   - `Hotspots` tells you which plugin hooks are slow overall\n   - `Slowest requests` tells you which exact network calls dominated wall time\n3. If `Slowest requests` points to one plugin repeatedly, fix that plugin first.\n   - add or verify cache reuse\n   - reduce duplicate fetches\n   - batch requests or lower request count\n   - make timeouts and concurrency explicit\n4. Export structured data when you need a diffable artifact:\n\n```bash\nmarkata-go build --benchmark-json benchmark.json\n```\n\n5. If the build is still mostly CPU after network fixes, capture `--cpuprofile` and inspect the hottest functions with `go tool pprof`.\n\n### Automatic-Feed Collection\n\nAutomatic-feed collection emits one bounded `auto_feeds` / `collect` debug\nrecord. `generation_ns`, `filtering_sorting_ns`, `selection_recording_ns`, and\n`pagination_preparation_ns` are exclusive elapsed phase sums in nanoseconds.\n`feeds`, `matched`, `selected`, and `observations` are numeric counts (post\ncounts include occurrences across feeds). There are no per-feed names, filters,\nor paths in this record, and these timings are not diagnostics v1 fields.\nUse the selection phase when profiling complete diagnostics recording: every\nconsidered occurrence is recorded, including exclusions. Configured and automatic\nfeeds reuse transient source flags, observation rows, membership maps, and a\nreason arena only within one synchronous Collect invocation, and write one\natomic ledger batch per feed. This does not cache selection across builds, change\nfilters or publication, reduce artifact completeness, or establish an RSS win.\n\nFor new batch relationships, ledger-owned object and initial-reason slabs hold\nat most 10 dispositions or 32 string slots each, with smaller observation-bounded\ntails. Raw reason lists over 32 strings use ordinary standalone append/deduplication\nwithout a counting pass or allocation by raw length; duplicate/empty-heavy input\nretains storage only for unique nonempty values.\nAllocation is lazy; existing relationships allocate no slabs, and single-record\nproducers keep their individual allocation path. Published object addresses stay\nstable, and copied, ordered-deduplicated reason segments are capacity-clamped so\nlater appends cannot touch neighbors. This reduces per-relation heap allocations\nwithout changing sparse maps or introducing a registry or cross-build pool.\nAllocation results alone do not demonstrate faster full builds.\n\n### Diagnostics Publication\n\nFull-build diagnostics publication has a separate bounded `diagnostics_artifact`\ncleanup debug record: snapshot, optional source metadata, serialization/buffering,\nactual file-write time/bytes/calls, flush, sync, close and replacement. Use\n`serialization_buffering_exclusive` and `flush_exclusive` with `file_write`\nto avoid counting file I/O twice; the corresponding `*_inclusive` wall totals\noverlap it. Directory/temp setup and removal are not included. No publication\ntimings are inserted into the diagnostics v1 document.\n\nThe diagnostics artifact writer reuses owned per-entry scratch and already\nencoded/indented feed fragments within a single call (at most 1024 retained\nfragments and 1 MiB including keys). Values outside these caps bypass retention,\nnot output. This reduces repeated sanitation allocations and JSON indentation\nwhen posts share feed dispositions; it does not remove observations, persist a\ncache, or alter output bytes. Snapshot and artifact size still scale with the\ncomplete ledger. Compare equivalent warm builds and fixed-metadata serializer\nbenchmarks rather than disabling diagnostics to improve a timing.\nPublication uses a fixed 64 KiB buffer. Large entry writes can bypass it, so use\nthe measured raw-write counts rather than estimating calls from artifact size.\nReduced serializer allocation does not establish a whole-build RSS reduction;\nlive templates and rendered HTML may still dominate memory.\nSnapshot copying also replaces per-feed reason allocations with one owned arena\nper entry. Feed slices remain isolated and capacity-clamped after deduplication,\nand feed sorting uses a typed comparator. This lowers allocation count and\nsnapshot work without reusing snapshots or changing ownership, counts or output.\n\n### JSON Benchmarks\n\nUse machine-readable output when you want to compare builds over time or ingest\nresults into another tool:\n\n```bash\nmarkata-go build --benchmark-json benchmark.json\nmarkata-go build --benchmark-json - \u003e benchmark.json\n```\n\nThe JSON output includes:\n\n- whole-build resource totals\n- per-stage timings and per-stage estimated resources\n- plugin timing entries used for hotspot ranking\n- request timing entries used for the slowest-request list\n- build counts and warnings\n- the complete content summary and per-source entries, including every feed\n  disposition and selection reason\n\nReports stream content entries with reusable per-entry buffers and buffered\nwrites, reducing serialization memory on large sites without omitting details.\nThe two-space-indented JSON format and trailing newline are unchanged. The\nreport itself can still be large: its size grows with content and feed\nobservations, while temporary content-encoding buffers grow with the largest\nsingle entry rather than the complete report. Non-content timing metadata is\nstill encoded together. File and stdout modes retain the same complete payload;\nwrite, flush, and file-close failures are reported as errors.\n\n### Per-Stage Detail\n\nKeep the default footer small for everyday use, and opt into stage detail when\ndebugging:\n\n```bash\nmarkata-go build -v --benchmark-detailed\n```\n\nThis adds a per-stage estimated wall-time breakdown so you can see whether a\nslow build is CPU-heavy in `render`, read-heavy in `glob`, write-heavy in `write`, or mostly idle in a\nsubprocess-oriented cleanup stage.\n\n### Raw Output\n\n```\nBenchmarkBuild_EndToEnd-8    \t       5\t 234567890 ns/op\t123456789 B/op\t 1234567 allocs/op\n```\n\n| Field | Meaning |\n|-------|---------|\n| `BenchmarkBuild_EndToEnd-8` | Test name with GOMAXPROCS |\n| `5` | Number of iterations |\n| `234567890 ns/op` | Nanoseconds per operation |\n| `123456789 B/op` | Bytes allocated per operation |\n| `1234567 allocs/op` | Number of allocations per operation |\n\n### Using benchstat\n\n`benchstat` provides statistical analysis of benchmark results:\n\n```bash\n# Single run analysis\nbenchstat bench.txt\n\n# Compare two runs\nbenchstat old.txt new.txt\n```\n\nExample output:\n\n```\nname                 time/op\nBuild_EndToEnd-8     235ms ± 2%\n\nname                 alloc/op\nBuild_EndToEnd-8     124MB ± 0%\n\nname                 allocs/op\nBuild_EndToEnd-8     1.23M ± 0%\n```\n\nThe `±` value shows the variation between runs. Lower is better for reproducibility.\n\n### Comparing Runs\n\nWhen comparing two benchmark files:\n\n```\nname              old time/op    new time/op    delta\nBuild_EndToEnd-8    250ms ± 3%     235ms ± 2%   -6.00%  (p=0.008 n=5+5)\n```\n\n| Column | Meaning |\n|--------|---------|\n| `old time/op` | Time from first file |\n| `new time/op` | Time from second file |\n| `delta` | Percentage change (negative = faster) |\n| `p=0.008` | Statistical significance (p \u003c 0.05 is significant) |\n| `n=5+5` | Number of samples in each file |\n\n## Profiling\n\n### Generating Profiles\n\n```bash\njust perf-profile\n```\n\nThis creates:\n- `cpu.prof` - CPU profile\n- `mem.prof` - Memory allocation profile\n\n### Analyzing CPU Profiles\n\n#### Interactive CLI\n\n```bash\ngo tool pprof cpu.prof\n```\n\nCommon commands:\n- `top` - Show top functions by CPU time\n- `top -cum` - Show by cumulative time\n- `list FunctionName` - Show annotated source\n- `web` - Open in browser (requires graphviz)\n\n#### Web Interface\n\n```bash\ngo tool pprof -http=:8080 cpu.prof\n```\n\nThis opens an interactive web UI with:\n- Flame graphs\n- Call graphs\n- Source code annotation\n- Top functions\n\n### Analyzing Memory Profiles\n\n```bash\ngo tool pprof mem.prof\n```\n\nUseful options:\n- `go tool pprof -alloc_space mem.prof` - Total allocations\n- `go tool pprof -alloc_objects mem.prof` - Number of allocations\n- `go tool pprof -inuse_space mem.prof` - Live memory\n\n### Profile Types\n\n| Profile | What it Measures | When to Use |\n|---------|-----------------|-------------|\n| CPU | Time spent in functions | Slow builds |\n| Memory | Allocations | High memory usage |\n| Block | Blocking on sync primitives | Deadlocks/contention |\n| Mutex | Mutex contention | Lock performance |\n\n## Benchmark Fixture\n\nThe benchmark suite uses a deterministic fixture at `benchmarks/site/`:\n\n```\nbenchmarks/\n├── site/\n│   ├── markata-go.toml      # Benchmark config\n│   └── posts/\n│       ├── blog/2024/01/    # 60 blog posts\n│       └── docs/guides/     # 40 documentation guides\n└── benchmark_test.go        # Benchmark tests\n```\n\n### Fixture Characteristics\n\n- **100 posts total** - Representative of a medium-sized site\n- **Code-heavy content** - Syntax highlighting stress test\n- **Nested paths** - Tests path handling\n- **Multiple languages** - Go, Python, JavaScript, Rust, SQL\n- **Deterministic** - Same content every generation for reproducible results\n\n### Regenerating the Fixture\n\n```bash\njust perf-generate\n```\n\nOr directly:\n\n```bash\ngo run benchmarks/generate_posts.go\n```\n\n## CI Performance Tracking\n\nPerformance benchmarks run automatically:\n- **Weekly** - Sunday at 2 AM UTC\n- **Manual** - Via workflow dispatch\n\n### Viewing Results\n\n1. Go to Actions tab in GitHub\n2. Select \"Performance Benchmarks\" workflow\n3. View the job summary for benchstat output\n4. Download artifacts for profiles\n\n### Comparing Branches\n\nTrigger a manual workflow with a comparison branch:\n\n1. Go to Actions \u003e Performance Benchmarks\n2. Click \"Run workflow\"\n3. Enter the branch name to compare against\n4. View the comparison in the job summary\n\n## Optimization Tips\n\n### Common Bottlenecks\n\n1. **Markdown rendering** - goldmark processing\n2. **Template execution** - Pongo2 templates\n3. **File I/O** - Reading/writing files\n4. **Syntax highlighting** - Chroma processing\n5. **Memory allocations** - String operations\n\n### Improving Performance\n\n#### Concurrency\n\nAdjust the concurrency level in `markata-go.toml`:\n\n```toml\n[markata-go]\nconcurrency = 8  # 0 = auto (NumCPU)\n```\n\n#### Profile-Guided Optimization\n\n1. Run profiling: `just perf-profile`\n2. Analyze: `go tool pprof -http=:8080 cpu.prof`\n3. Identify hot paths\n4. Optimize targeted functions\n5. Re-benchmark to verify improvement\n\n#### Memory Optimization\n\nIf memory is the bottleneck:\n\n```bash\ngo tool pprof -alloc_space mem.prof\n```\n\nLook for:\n- Large allocations (`alloc_space`)\n- Many small allocations (`alloc_objects`)\n- Functions with high cumulative allocations\n\n### Writing Efficient Plugins\n\n1. **Reuse allocations** - Use `sync.Pool` for buffers\n2. **Minimize copies** - Use pointers where appropriate\n3. **Batch operations** - Group file writes\n4. **Cache results** - Use the lifecycle cache\n\n## Troubleshooting\n\n### Benchmarks Skip\n\n```\n--- SKIP: BenchmarkBuild_EndToEnd\n    benchmark_test.go:35: Benchmark fixture not found\n```\n\nFix: Run `just perf-generate` to create the fixture.\n\n### High Variance\n\nIf `±` values are high (\u003e10%), try:\n- More iterations: `-count=10`\n- Close other applications\n- Use a consistent environment\n\n### Profile is Empty\n\nEnsure the benchmark runs long enough:\n\n```bash\ngo test -bench=BenchmarkBuild_EndToEnd -run='^$' \\\n  -benchtime=30s \\\n  -cpuprofile=cpu.prof \\\n  ./benchmarks/...\n```\n\n### Source-encrypted warm builds\n\nSource-encrypted Markdown deliberately bypasses parsed-post and plaintext\narticle caches. Reparsing alone should not force fresh page templates: the\ncanonical title/feed/tag/garden hashes are compared against the previous build\nthrough a build-local, hash-only handoff. No decrypted snapshot is retained by\nthat handoff, and no cache schema migration is required.\n\nFor already processed posts, incomplete semantic hashes (for example after a\ncold navigation reset) mean the previous canonical baseline is unavailable.\nThe build retains the original comparison for that pass and repairs the hashes,\nrather than marking every reparsed page changed. New entries still compare\nagainst an explicitly empty/partial baseline. Cold-to-edit cache scope does not\nrequire warm priming.\n\nEncrypted wrappers are reused only when article HTML, key name, resolved\npassword, hint, source path, and wrapper/browser-crypto revision all match.\nReal wrapper regeneration invalidates the page and dependent closure before\ntemplates and publication; subsequent equivalent warm builds stabilize.\nIt also clears the old full-page reference before cache writes. After a failed\nfresh full-page cache write, a persisted reload reports `full_html_unavailable`\nand re-renders with the current wrapper rather than restoring old ciphertext.\nRandomized source ciphertext for the same plaintext/key contract is not itself\na wrapper miss. Older wrapper identities miss once. Conservative Load dirty\nsignals for feeds, tags, and garden output remain unchanged.\n\n## See Also\n\n- [Configuration Guide](/docs/guides/configuration/) - Concurrency settings\n- [Plugin Development](/docs/guides/plugin-development/) - Writing efficient plugins\n- [Go Profiling](https://go.dev/blog/pprof) - Official pprof documentation\n\n## Nested operation spans\n\nSave build measurements with `markata-go build --benchmark-json=benchmark.json`,\nthen inspect completed spans with `jq '.benchmark.Spans' benchmark.json`.\nDurations and start offsets use nanoseconds; a zero duration is valid on clocks\nwith coarse resolution. IDs and parent IDs describe nesting, and stage/plugin\nfields identify the active build work when the span started.\n\nPlugin authors can instrument an operation using `buildstats.StartSpan(ctx,\n\"template.execute\")` and finish the returned handle with `End()` or\n`EndError(err)` before the build profile stops. Pass the returned context to\nchild operations to preserve nesting. With no active profile, these calls are\nsafe no-ops. This release provides the recording API; builds without explicit\nspan instrumentation may report an empty span list.\n\nUse fixed operation names and safe attributes. Credential-bearing attribute\nkeys are dropped, and error text is discarded, but values under other keys are\nnot automatically redacted. Avoid query strings, sensitive paths, and secrets.\nSee the [lifecycle specification](../../spec/spec/LIFECYCLE.md) for the API\ncontract and limits.\n\n## OTLP configuration foundation\n\nThe Go API `buildstats.ResolveOTLPConfig(os.Getenv)` resolves optional trace\nsettings. For example, a generic endpoint `http://collector:4318` resolves to\n`http://collector:4318/v1/traces` with the default `http/protobuf` protocol.\nThe resolver alone does not send traces, and setting these variables does not\nyet enable export from `markata-go build`.\n\n| Variable | Meaning |\n| --- | --- |\n| `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` | Complete trace URL; takes precedence over the generic endpoint |\n| `OTEL_EXPORTER_OTLP_ENDPOINT` | Generic URL; HTTP protocols append `/v1/traces`, while gRPC preserves the URL |\n| `OTEL_EXPORTER_OTLP_TRACES_PROTOCOL` | Trace protocol; takes precedence over the generic protocol |\n| `OTEL_EXPORTER_OTLP_PROTOCOL` | Generic protocol; defaults to `http/protobuf` |\n\nSupported protocols are `grpc`, `http/protobuf`, and `http/json`. Endpoints must\nuse HTTP or HTTPS and include a host. With no endpoint, the returned config is\ndisabled. This foundation follows [OpenTelemetry endpoint conventions](https://opentelemetry.io/docs/specs/otel/protocol/exporter/);\nexporter integration, headers, sampling, and collector deployment remain\nfollow-up work.\n",
      "summary": "How to run, interpret, and optimize markata-go build performance",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "performance",
        "benchmarking",
        "profiling",
        "optimization"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/migration/",
      "url": "https://markata.dev/docs/guides/migration/",
      "title": "Migrating from Python markata",
      "content_html": "\u003cp\u003eThis guide helps you migrate your existing Python markata site to markata-go. The migration tool automates most of the process while highlighting areas that need manual attention.\u003c/p\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRun the migration tool to analyze your current configuration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis will show a detailed report of:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eConfiguration changes needed\u003c/li\u003e\n\u003cli\u003eFilter expression migrations\u003c/li\u003e\n\u003cli\u003eTemplate compatibility issues\u003c/li\u003e\n\u003cli\u003eWarnings for unsupported features\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"migration-commands\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMigration Commands\u003c/span\u003e \u003ca href=\"#migration-commands\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"full-migration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFull Migration\u003c/span\u003e \u003ca href=\"#full-migration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Analyze and show migration report\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Analyze without writing (dry run)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate --dry-run\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Write migrated config to file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate -o markata-go.toml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"config-migration-only\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfig Migration Only\u003c/span\u003e \u003ca href=\"#config-migration-only\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Migrate config from markata.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate config\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Migrate from pyproject.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate config -i pyproject.toml -o markata-go.toml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"filter-expression-check\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFilter Expression Check\u003c/span\u003e \u003ca href=\"#filter-expression-check\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check a specific filter expression\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate filter \u003cspan class=\"s2\"\u003e\u0026#34;published == \u0026#39;True\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check all filters in your config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate filter\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"template-compatibility-check\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Compatibility Check\u003c/span\u003e \u003ca href=\"#template-compatibility-check\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check templates directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate templates\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check specific directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate templates ./my-templates\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"configuration-changes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration Changes\u003c/span\u003e \u003ca href=\"#configuration-changes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"namespace\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNamespace\u003c/span\u003e \u003ca href=\"#namespace\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe configuration namespace changes from \u003ccode\u003e[markata]\u003c/code\u003e to \u003ccode\u003e[markata-go]\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Before (Python markata)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# After (markata-go)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoutput_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"key-renames\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKey Renames\u003c/span\u003e \u003ca href=\"#key-renames\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSeveral configuration keys have been renamed:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePython markata\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eNotes\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eoutput\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eoutput_dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOutput directory\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eglob_patterns\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epatterns\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUnder \u003ccode\u003e[markata-go.glob]\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eauthor_name\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eauthor\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite author\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esite_name\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esite_description\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edescription\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite description\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"navigation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNavigation\u003c/span\u003e \u003ca href=\"#navigation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePython markata uses a map for navigation:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Python markata\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehome\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eblog\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eabout\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/about\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003emarkata-go uses an array with explicit labels:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# markata-go\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elabel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Home\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elabel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elabel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;About\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/about\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"filter-expression-changes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFilter Expression Changes\u003c/span\u003e \u003ca href=\"#filter-expression-changes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"boolean-literals\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBoolean Literals\u003c/span\u003e \u003ca href=\"#boolean-literals\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePython markata often uses quoted boolean strings. markata-go uses unquoted booleans:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Python markata\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003efilter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == \u0026#39;True\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# markata-go\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003efilter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"in-operator\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003ein\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e Operator\u003c/span\u003e \u003ca href=\"#in-operator\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe \u003ccode\u003ein\u003c/code\u003e operator with lists must be converted to \u003ccode\u003eor\u003c/code\u003e expressions:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Python markata\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003efilter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;templateKey in [\u0026#39;blog-post\u0026#39;, \u0026#39;til\u0026#39;]\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# markata-go\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003efilter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;templateKey == \u0026#39;blog-post\u0026#39; or templateKey == \u0026#39;til\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"operator-spacing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOperator Spacing\u003c/span\u003e \u003ca href=\"#operator-spacing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnsure operators have surrounding whitespace:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Python markata (may work)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003efilter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026lt;=today\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# markata-go (required)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003efilter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date \u0026lt;= today\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"none-comparisons\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNone Comparisons\u003c/span\u003e \u003ca href=\"#none-comparisons\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePython-style \u003ccode\u003eis None\u003c/code\u003e must use \u003ccode\u003e==\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Python markata\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003efilter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;image is None\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003efilter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;image is not None\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# markata-go\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003efilter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;image == None\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003efilter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;image != None\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"template-changes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Changes\u003c/span\u003e \u003ca href=\"#template-changes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go uses pongo2, which is Jinja2-compatible with some differences.\u003c/p\u003e\n\u003ch3 id=\"variable-changes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVariable Changes\u003c/span\u003e \u003ca href=\"#variable-changes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePython markata\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eNotes\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.markata.config\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003econfig\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDirect access\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.markata.feeds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efeeds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDirect access\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.article_html\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epost.content\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRenamed\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"unsupported-features\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUnsupported Features\u003c/span\u003e \u003ca href=\"#unsupported-features\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe following Jinja2 features are not supported in pongo2:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFeature\u003c/th\u003e\n\u003cth\u003eAlternative\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e{% macro %}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUse \u003ccode\u003e{% include %}\u003c/code\u003e with variables\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e{% do %}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUse \u003ccode\u003e{% set %}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e{% call %}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRestructure to use includes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e{% import %}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUse \u003ccode\u003e{% include %}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eList comprehensions\u003c/td\u003e\n\u003ctd\u003ePre-compute in Go\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"filter-syntax\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFilter Syntax\u003c/span\u003e \u003ca href=\"#filter-syntax\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePython string methods should be converted to pongo2 filters:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003e{# Python markata #}\n{{ title.lower() }}\n{{ text.strip() }}\n\n{# markata-go #}\n{{ title|lower }}\n{{ text|trim }}\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"step-by-step-migration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStep-by-Step Migration\u003c/span\u003e \u003ca href=\"#step-by-step-migration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"1-analyze-your-site\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e1. Analyze Your Site\u003c/span\u003e \u003ca href=\"#1-analyze-your-site\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate --dry-run\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eReview the migration report carefully.\u003c/p\u003e\n\u003ch3 id=\"2-migrate-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e2. Migrate Configuration\u003c/span\u003e \u003ca href=\"#2-migrate-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate -o markata-go.toml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"3-update-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e3. Update Templates\u003c/span\u003e \u003ca href=\"#3-update-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCheck templates for compatibility:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate templates\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUpdate any flagged issues manually.\u003c/p\u003e\n\u003ch3 id=\"4-test-the-build\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e4. Test the Build\u003c/span\u003e \u003ca href=\"#4-test-the-build\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --dry-run\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"5-full-build\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e5. Full Build\u003c/span\u003e \u003ca href=\"#5-full-build\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"6-verify-output\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e6. Verify Output\u003c/span\u003e \u003ca href=\"#6-verify-output\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCompare the output with your Python markata build to ensure everything looks correct.\u003c/p\u003e\n\u003ch2 id=\"common-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Issues\u003c/span\u003e \u003ca href=\"#common-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"no-markata-config-found\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e“No markata config found”\u003c/span\u003e \u003ca href=\"#no-markata-config-found\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe migration tool looks for:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003emarkata.toml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epyproject.toml\u003c/code\u003e (with \u003ccode\u003e[tool.markata]\u003c/code\u003e section)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emarkata.yaml\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSpecify your config file explicitly:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate -i my-config.toml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"filter-validation-errors\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFilter Validation Errors\u003c/span\u003e \u003ca href=\"#filter-validation-errors\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf a migrated filter fails validation, you may need to simplify it. Complex Python expressions are not supported:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Not supported\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003efilter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;len(tags) \u0026gt; 0 and published\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Supported alternative\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003efilter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;has_tags == True and published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAdd a \u003ccode\u003ehas_tags\u003c/code\u003e field in your frontmatter or preprocessing.\u003c/p\u003e\n\u003ch3 id=\"template-macros\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Macros\u003c/span\u003e \u003ca href=\"#template-macros\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConvert macros to include files:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003e{# Before: macro in template #}\n{% macro render_card(post) %}\n  \u0026lt;div class=\u0026quot;card\u0026quot;\u0026gt;{{ post.title }}\u0026lt;/div\u0026gt;\n{% endmacro %}\n\n{{ render_card(post) }}\n\n{# After: separate include file #}\n{# _card.html #}\n\u0026lt;div class=\u0026quot;card\u0026quot;\u0026gt;{{ post.title }}\u0026lt;/div\u0026gt;\n\n{# main template #}\n{% include \u0026quot;_card.html\u0026quot; %}\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"getting-help\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGetting Help\u003c/span\u003e \u003ca href=\"#getting-help\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eCheck the \u003ca href=\"/docs/troubleshooting\"\u003etroubleshooting guide\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eOpen an issue on \u003ca href=\"https://github.com/WaylonWalker/markata-go/issues\"\u003eGitHub\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eJoin the discussion on the repository\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/configuration\"\u003eConfiguration Guide\u003c/a\u003e - Full configuration reference\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/templates\"\u003eTemplates Guide\u003c/a\u003e - Template system documentation\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/feeds\"\u003eFeeds Guide\u003c/a\u003e - Feed configuration\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nThis guide helps you migrate your existing Python markata site to markata-go. The migration tool automates most of the process while highlighting areas that need manual attention.\n\n## Quick Start\n\nRun the migration tool to analyze your current configuration:\n\n```bash\nmarkata-go migrate\n```\n\nThis will show a detailed report of:\n- Configuration changes needed\n- Filter expression migrations\n- Template compatibility issues\n- Warnings for unsupported features\n\n## Migration Commands\n\n### Full Migration\n\n```bash\n# Analyze and show migration report\nmarkata-go migrate\n\n# Analyze without writing (dry run)\nmarkata-go migrate --dry-run\n\n# Write migrated config to file\nmarkata-go migrate -o markata-go.toml\n```\n\n### Config Migration Only\n\n```bash\n# Migrate config from markata.toml\nmarkata-go migrate config\n\n# Migrate from pyproject.toml\nmarkata-go migrate config -i pyproject.toml -o markata-go.toml\n```\n\n### Filter Expression Check\n\n```bash\n# Check a specific filter expression\nmarkata-go migrate filter \"published == 'True'\"\n\n# Check all filters in your config\nmarkata-go migrate filter\n```\n\n### Template Compatibility Check\n\n```bash\n# Check templates directory\nmarkata-go migrate templates\n\n# Check specific directory\nmarkata-go migrate templates ./my-templates\n```\n\n## Configuration Changes\n\n### Namespace\n\nThe configuration namespace changes from `[markata]` to `[markata-go]`:\n\n```toml\n# Before (Python markata)\n[markata]\noutput = \"public\"\n\n# After (markata-go)\n[markata-go]\noutput_dir = \"public\"\n```\n\n### Key Renames\n\nSeveral configuration keys have been renamed:\n\n| Python markata | markata-go | Notes |\n|----------------|------------|-------|\n| `output` | `output_dir` | Output directory |\n| `glob_patterns` | `patterns` | Under `[markata-go.glob]` |\n| `author_name` | `author` | Site author |\n| `site_name` | `title` | Site title |\n| `site_description` | `description` | Site description |\n\n### Navigation\n\nPython markata uses a map for navigation:\n\n```toml\n# Python markata\n[markata.nav]\nhome = \"/\"\nblog = \"/blog\"\nabout = \"/about\"\n```\n\nmarkata-go uses an array with explicit labels:\n\n```toml\n# markata-go\n[[markata-go.nav]]\nlabel = \"Home\"\nurl = \"/\"\n\n[[markata-go.nav]]\nlabel = \"Blog\"\nurl = \"/blog\"\n\n[[markata-go.nav]]\nlabel = \"About\"\nurl = \"/about\"\n```\n\n## Filter Expression Changes\n\n### Boolean Literals\n\nPython markata often uses quoted boolean strings. markata-go uses unquoted booleans:\n\n```python\n# Python markata\nfilter = \"published == 'True'\"\n\n# markata-go\nfilter = \"published == True\"\n```\n\n### `in` Operator\n\nThe `in` operator with lists must be converted to `or` expressions:\n\n```python\n# Python markata\nfilter = \"templateKey in ['blog-post', 'til']\"\n\n# markata-go\nfilter = \"templateKey == 'blog-post' or templateKey == 'til'\"\n```\n\n### Operator Spacing\n\nEnsure operators have surrounding whitespace:\n\n```python\n# Python markata (may work)\nfilter = \"date\u003c=today\"\n\n# markata-go (required)\nfilter = \"date \u003c= today\"\n```\n\n### None Comparisons\n\nPython-style `is None` must use `==`:\n\n```python\n# Python markata\nfilter = \"image is None\"\nfilter = \"image is not None\"\n\n# markata-go\nfilter = \"image == None\"\nfilter = \"image != None\"\n```\n\n## Template Changes\n\nmarkata-go uses pongo2, which is Jinja2-compatible with some differences.\n\n### Variable Changes\n\n| Python markata | markata-go | Notes |\n|----------------|------------|-------|\n| `post.markata.config` | `config` | Direct access |\n| `post.markata.feeds` | `feeds` | Direct access |\n| `post.article_html` | `post.content` | Renamed |\n\n### Unsupported Features\n\nThe following Jinja2 features are not supported in pongo2:\n\n| Feature | Alternative |\n|---------|-------------|\n| `{% macro %}` | Use `{% include %}` with variables |\n| `{% do %}` | Use `{% set %}` |\n| `{% call %}` | Restructure to use includes |\n| `{% import %}` | Use `{% include %}` |\n| List comprehensions | Pre-compute in Go |\n\n### Filter Syntax\n\nPython string methods should be converted to pongo2 filters:\n\n```jinja2\n{# Python markata #}\n{{ title.lower() }}\n{{ text.strip() }}\n\n{# markata-go #}\n{{ title|lower }}\n{{ text|trim }}\n```\n\n## Step-by-Step Migration\n\n### 1. Analyze Your Site\n\n```bash\nmarkata-go migrate --dry-run\n```\n\nReview the migration report carefully.\n\n### 2. Migrate Configuration\n\n```bash\nmarkata-go migrate -o markata-go.toml\n```\n\n### 3. Update Templates\n\nCheck templates for compatibility:\n\n```bash\nmarkata-go migrate templates\n```\n\nUpdate any flagged issues manually.\n\n### 4. Test the Build\n\n```bash\nmarkata-go build --dry-run\n```\n\n### 5. Full Build\n\n```bash\nmarkata-go build\n```\n\n### 6. Verify Output\n\nCompare the output with your Python markata build to ensure everything looks correct.\n\n## Common Issues\n\n### \"No markata config found\"\n\nThe migration tool looks for:\n- `markata.toml`\n- `pyproject.toml` (with `[tool.markata]` section)\n- `markata.yaml`\n\nSpecify your config file explicitly:\n\n```bash\nmarkata-go migrate -i my-config.toml\n```\n\n### Filter Validation Errors\n\nIf a migrated filter fails validation, you may need to simplify it. Complex Python expressions are not supported:\n\n```python\n# Not supported\nfilter = \"len(tags) \u003e 0 and published\"\n\n# Supported alternative\nfilter = \"has_tags == True and published == True\"\n```\n\nAdd a `has_tags` field in your frontmatter or preprocessing.\n\n### Template Macros\n\nConvert macros to include files:\n\n```jinja2\n{# Before: macro in template #}\n{% macro render_card(post) %}\n  \u003cdiv class=\"card\"\u003e{{ post.title }}\u003c/div\u003e\n{% endmacro %}\n\n{{ render_card(post) }}\n\n{# After: separate include file #}\n{# _card.html #}\n\u003cdiv class=\"card\"\u003e{{ post.title }}\u003c/div\u003e\n\n{# main template #}\n{% include \"_card.html\" %}\n```\n\n## Getting Help\n\n- Check the [troubleshooting guide](/docs/troubleshooting)\n- Open an issue on [GitHub](https://github.com/WaylonWalker/markata-go/issues)\n- Join the discussion on the repository\n\n## See Also\n\n- [Configuration Guide](/docs/guides/configuration) - Full configuration reference\n- [Templates Guide](/docs/guides/templates) - Template system documentation\n- [Feeds Guide](/docs/guides/feeds) - Feed configuration\n",
      "summary": "Guide to migrating your site from Python markata to markata-go",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "migration",
        "getting-started"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/markdown/",
      "url": "https://markata.dev/docs/guides/markdown/",
      "title": "Markdown Features",
      "content_html": "\u003cp\u003emarkata-go supports standard Markdown (CommonMark), GitHub Flavored Markdown (GFM) extensions, and several powerful additions like admonitions, wikilinks, and automatic table of contents generation. This guide covers everything you need to know about writing content in markata-go.\u003c/p\u003e\n\u003ch2 id=\"table-of-contents\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTable of Contents\u003c/span\u003e \u003ca href=\"#table-of-contents\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#basic-markdown\"\u003eBasic Markdown\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#extended-markdown-gfm\"\u003eExtended Markdown (GFM)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#code-blocks\"\u003eCode Blocks\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#attribute-syntax\"\u003eAttribute Syntax\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#admonitions\"\u003eAdmonitions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#wikilinks\"\u003eWikilinks\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#hover-cards\"\u003eHover Cards\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#table-of-contents\"\u003eTable of Contents\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#heading-anchors\"\u003eHeading Anchors\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#footnotes\"\u003eFootnotes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/icons/\"\u003eLucide icons\u003c/a\u003e - inline SVG icons, centered icon cards, and feature rows\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/markdown-containers/#native-tabs-no-web-awesome-required\"\u003eNative Markdown tabs\u003c/a\u003e - tabbed code and install instructions\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/markdown-containers/\"\u003eRich Markdown layouts\u003c/a\u003e - responsive cards, grids, and diagrams\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/roads/\"\u003eRoads\u003c/a\u003e - scroll-drawn timelines and roadmaps (separate guide)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003evideo\u003c/p\u003e\n\u003cfigure\u003e\n\u003cvideo loop muted playsinline controls preload=\"none\" class=\"md-video\" poster=\"https://dropper.waylonwalker.com/file/6f042a91-1e90-445d-b91d-8d4ee187af2c.webp?h=675\u0026w=1200\" style=\"margin-inline:auto;aspect-ratio:16/9\"\u003e\u003csource src=\"https://dropper.waylonwalker.com/file/6f042a91-1e90-445d-b91d-8d4ee187af2c.mp4\" type=\"video/mp4\"\u003ekickflip down the 3 stair - fingerboarding\u003c/video\u003e\n\u003c/figure\u003e\n\u003cp\u003eimage\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://dropper.waylonwalker.com/file/1b7f257c-5193-4b74-b768-2fa4a7ccdec8.webp\" alt=\"\"\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"basic-markdown\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Markdown\u003c/span\u003e \u003ca href=\"#basic-markdown\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go supports all standard Markdown syntax as defined by CommonMark.\u003c/p\u003e\n\u003ch3 id=\"headings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHeadings\u003c/span\u003e \u003ca href=\"#headings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse \u003ccode\u003e#\u003c/code\u003e characters to create headings (levels 1-6):\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Heading 1\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Heading 2\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Heading 3\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e#### Heading 4\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e##### Heading 5\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e###### Heading 6\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eHeading 1\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eHeading 2\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eHeading 3\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh4\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eHeading 4\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh4\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh5\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eHeading 5\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh5\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh6\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eHeading 6\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh6\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eAvoid H1 in Content\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDon\u0026rsquo;t use H1 (\u003ccode\u003e#\u003c/code\u003e) headings in your markdown content.\u003c/strong\u003e Templates automatically generate an H1 from your frontmatter \u003ccode\u003etitle\u003c/code\u003e, so using H1 in content creates duplicate H1 tags.\u003c/p\u003e\n\u003cp\u003eThis harms:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eSEO\u003c/strong\u003e - Search engines expect one H1 per page\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAccessibility\u003c/strong\u003e - Screen readers use H1 for page identification\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eStart your content with H2 (\u003ccode\u003e##\u003c/code\u003e) or deeper:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eMy Page Title \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# This becomes the H1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## First Section       # Start with H2\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent here...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe linter will warn you if H1 headings are detected in content.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch4 id=\"expressive-headings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExpressive headings\u003c/span\u003e \u003ca href=\"#expressive-headings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eHeadings and frontmatter titles use ordinary semantic Markdown inline elements.\nThe active theme and font pack choose how strongly they are presented in H1 and\nH2 headings:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Good themes make **good places** to ==think.==\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## A **good theme** makes _quiet words_, `technical words`, and ==loud words== work together.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Make a ~~perfect~~ memorable site.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis supports strong, emphasis, mark, code, links, superscript, subscript, and GFM strikethrough,\nincluding nested forms such as \u003ccode\u003e==**strange little ideas.**==\u003c/code\u003e. These are\nsemantic elements rather than a separate heading syntax. Visible headings keep\ntheir rich semantics, while browser titles, feeds, search, and social metadata\nuse the readable plain-text title. This behavior is intended to match\n\u003ca href=\"https://git.waylonwalker.com/waylon/md.waylonwalker.com\"\u003ePlaindown\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eHighlighted headings keep the same markup on cold and warm builds, including\nafter adding an unrelated post. Cached Markdown output is reused without\nadding another highlight wrapper. Upgrading from the duplicate-wrapper bug\nrefreshes affected pages and their dependent output automatically, without\nforcing unrelated posts to rebuild. Later builds reuse the refreshed pages.\nYou do not need to delete caches or refetch external assets.\u003c/p\u003e\n\u003ch3 id=\"paragraphs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eParagraphs\u003c/span\u003e \u003ca href=\"#paragraphs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eParagraphs are separated by blank lines:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis is the first paragraph. It can span\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emultiple lines in the source.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis is the second paragraph.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eThis is the first paragraph. It can span\nmultiple lines in the source.\u003c/p\u003e\n\u003cp\u003eThis is the second paragraph.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eThis is the first paragraph. It can span\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emultiple lines in the source.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eThis is the second paragraph.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"emphasis-and-strong\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEmphasis and Strong\u003c/span\u003e \u003ca href=\"#emphasis-and-strong\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e*Italic text* or \u003cspan class=\"ge\"\u003e_italic text_\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gs\"\u003e**Bold text**\u003c/span\u003e or \u003cspan class=\"gs\"\u003e__bold text__\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ge\"\u003e**\u003c/span\u003e*Bold and italic*** or \u003cspan class=\"gs\"\u003e___bold and italic___\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eItalic text\u003c/em\u003e or \u003cem\u003eitalic text\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eBold text\u003c/strong\u003e or \u003cstrong\u003ebold text\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eBold and italic\u003c/strong\u003e\u003c/em\u003e or \u003cem\u003e\u003cstrong\u003ebold and italic\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eem\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eItalic text\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eem\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e or \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eem\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eitalic text\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eem\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estrong\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eBold text\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003estrong\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e or \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estrong\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ebold text\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003estrong\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estrong\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eem\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eBold and italic\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eem\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003estrong\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e or \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estrong\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eem\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ebold and italic\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eem\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003estrong\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"links\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLinks\u003c/span\u003e \u003ca href=\"#links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003eLink text\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://example.com\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003eLink with title\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://example.com \u0026#34;Example Site\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;https://example.com\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[Reference link][ref]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[ref]: https://example.com\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://example.com\"\u003eLink text\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://example.com\" title=\"Example Site\"\u003eLink with title\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://example.com\"\u003ehttps://example.com\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://example.com\"\u003eReference link\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eLink text\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Example Site\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eLink with title\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ehttps://example.com\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eReference link\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"images\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eImages\u003c/span\u003e \u003ca href=\"#images\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eAlt text\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/photo.jpg\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eAlt text\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/photo.jpg \u0026#34;Image title\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003e![Clickable image\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/photo.jpg\u003c/span\u003e)](https://example.com)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/photo.jpg\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Alt text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/photo.jpg\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Alt text\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Image title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/photo.jpg\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Clickable image\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"unordered-lists\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUnordered Lists\u003c/span\u003e \u003ca href=\"#unordered-lists\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e Item one\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e Item two\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003e-\u003c/span\u003e Nested item\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003e-\u003c/span\u003e Another nested item\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e Item three\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e Also works with asterisks\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e*\u003c/span\u003e Like this\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eItem one\u003c/li\u003e\n\u003cli\u003eItem two\n\u003cul\u003e\n\u003cli\u003eNested item\u003c/li\u003e\n\u003cli\u003eAnother nested item\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eItem three\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003eAlso works with asterisks\u003c/li\u003e\n\u003cli\u003eLike this\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eItem one\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eItem two\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eNested item\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAnother nested item\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eItem three\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"ordered-lists\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOrdered Lists\u003c/span\u003e \u003ca href=\"#ordered-lists\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e1.\u003c/span\u003e First item\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e2.\u003c/span\u003e Second item\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"k\"\u003e1.\u003c/span\u003e Nested numbered item\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"k\"\u003e2.\u003c/span\u003e Another nested item\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e3.\u003c/span\u003e Third item\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e1.\u003c/span\u003e Numbers don\u0026#39;t have to be sequential\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e1.\u003c/span\u003e Markdown will number them correctly\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e1.\u003c/span\u003e This becomes 3\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eFirst item\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSecond item\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eNested numbered item\u003c/li\u003e\n\u003cli\u003eAnother nested item\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThird item\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNumbers don\u0026rsquo;t have to be sequential\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMarkdown will number them correctly\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThis becomes 3\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eol\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eFirst item\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eSecond item\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eol\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eNested numbered item\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAnother nested item\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eol\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eThird item\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eol\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"blockquotes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBlockquotes\u003c/span\u003e \u003ca href=\"#blockquotes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\u0026gt; \u003c/span\u003e\u003cspan class=\"ge\"\u003eThis is a blockquote.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\u0026gt; \u003c/span\u003e\u003cspan class=\"ge\"\u003eIt can span multiple lines.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\u0026gt; \u003c/span\u003e\u003cspan class=\"ge\"\u003eBlockquotes can be nested.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ge\"\u003e\u0026gt; \u0026gt; Like this inner quote.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\u0026gt; \u003c/span\u003e\u003cspan class=\"ge\"\u003eBlockquotes can contain **other** *Markdown* elements.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ge\"\u003e\u0026gt; - Including lists\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\u0026gt; \u003c/span\u003e\u003cspan class=\"ge\"\u003e- Like this\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive examples:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis is a blockquote.\nIt can span multiple lines.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBlockquotes can be nested.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLike this inner quote.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBlockquotes can contain \u003cstrong\u003eother\u003c/strong\u003e \u003cem\u003eMarkdown\u003c/em\u003e elements.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIncluding lists\u003c/li\u003e\n\u003cli\u003eLike this\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eblockquote\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eThis is a blockquote.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  It can span multiple lines.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eblockquote\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eblockquote\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eBlockquotes can be nested.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eblockquote\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eLike this inner quote.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eblockquote\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eblockquote\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"inline-code\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInline Code\u003c/span\u003e \u003ca href=\"#inline-code\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUse \u003cspan class=\"sb\"\u003e`backticks`\u003c/span\u003e for inline code.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUse `\u003cspan class=\"sb\"\u003e` `\u003c/span\u003ebackticks\u003cspan class=\"sb\"\u003e` `` to show literal backticks.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003eThe `\u003c/span\u003efmt.Println()` function prints to stdout.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eUse \u003ccode\u003ebackticks\u003c/code\u003e for inline code.\u003c/p\u003e\n\u003cp\u003eUse \u003ccode\u003e`backticks`\u003c/code\u003e to show literal backticks.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003efmt.Println()\u003c/code\u003e function prints to stdout.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eUse \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ebackticks\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e for inline code.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eUse \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e`backticks`\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e to show literal backticks.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eThe \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003efmt.Println()\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e function prints to stdout.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"horizontal-rules\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHorizontal Rules\u003c/span\u003e \u003ca href=\"#horizontal-rules\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent above\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent below\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ge\"\u003e**\u003c/span\u003e*\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAlso works with asterisks\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e___\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAnd underscores\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eContent above\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eContent below\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eAlso works with asterisks\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eAnd underscores\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eContent above\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eContent below\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAlso works with asterisks\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAnd underscores\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"extended-markdown-gfm\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExtended Markdown (GFM)\u003c/span\u003e \u003ca href=\"#extended-markdown-gfm\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go supports GitHub Flavored Markdown extensions.\u003c/p\u003e\n\u003ch3 id=\"tables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTables\u003c/span\u003e \u003ca href=\"#tables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTables use pipes (\u003ccode\u003e|\u003c/code\u003e) and hyphens (\u003ccode\u003e-\u003c/code\u003e) to define structure. Use colons (\u003ccode\u003e:\u003c/code\u003e) for alignment.\u003c/p\u003e\n\u003cp\u003eTables with a header row are sortable in rendered posts. Activate a column by\nselecting its header; select it again to reverse the order. Text sorts naturally,\nnumeric values sort numerically, and empty cells stay at the end. The sorting\ncontrols are keyboard accessible. The small sorting script is loaded only on\npages that contain a header table.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Feature      | Status      | Notes                    |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|--------------|:-----------:|-------------------------:|\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Tables       | Supported   | Left-aligned by default  |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Alignment    | Supported   | Center with \u003cspan class=\"sb\"\u003e`:`\u003c/span\u003e          |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Right align  | Supported   | Colon on right           |\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFeature\u003c/th\u003e\n\u003cth style=\"text-align:center\"\u003eStatus\u003c/th\u003e\n\u003cth style=\"text-align:right\"\u003eNotes\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eTables\u003c/td\u003e\n\u003ctd style=\"text-align:center\"\u003eSupported\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003eLeft-aligned by default\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAlignment\u003c/td\u003e\n\u003ctd style=\"text-align:center\"\u003eSupported\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003eCenter with \u003ccode\u003e:\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRight align\u003c/td\u003e\n\u003ctd style=\"text-align:center\"\u003eSupported\u003c/td\u003e\n\u003ctd style=\"text-align:right\"\u003eColon on right\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etable\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ethead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eFeature\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eth\u003c/span\u003e \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text-align: center\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eStatus\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eth\u003c/span\u003e \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text-align: right\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eNotes\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ethead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etbody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eTables\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text-align: center\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eSupported\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text-align: right\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eLeft-aligned by default\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAlignment\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text-align: center\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eSupported\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text-align: right\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eCenter with \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e:\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eRight align\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text-align: center\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eSupported\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text-align: right\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eColon on right\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etbody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etable\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eAlignment reference:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSyntax\u003c/th\u003e\n\u003cth\u003eAlignment\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e|---|\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLeft (default)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e|:---|\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLeft (explicit)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e|:---:|\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCenter\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e|---:|\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRight\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"strikethrough\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStrikethrough\u003c/span\u003e \u003ca href=\"#strikethrough\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e~~This text is struck through~~\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUse strikethrough for \u003cspan class=\"gd\"\u003e~~old information~~\u003c/span\u003e corrections.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cdel\u003eThis text is struck through\u003c/del\u003e\u003c/p\u003e\n\u003cp\u003eUse strikethrough for \u003cdel\u003eold information\u003c/del\u003e corrections.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003edel\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eThis text is struck through\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003edel\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eUse strikethrough for \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003edel\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eold information\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003edel\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e corrections.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"task-lists\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTask Lists\u003c/span\u003e \u003ca href=\"#task-lists\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e- [x]\u003c/span\u003e Completed task\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e- [x]\u003c/span\u003e Another completed task\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e- [ ]\u003c/span\u003e Incomplete task\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e- [ ]\u003c/span\u003e Another incomplete task\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003e- [x]\u003c/span\u003e Nested completed\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003e- [ ]\u003c/span\u003e Nested incomplete\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e Completed task\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e Another completed task\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Incomplete task\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Another incomplete task\n\u003cul\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e Nested completed\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Nested incomplete\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;task-list\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;task-list-item\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003einput\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;checkbox\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003echecked\u003c/span\u003e \u003cspan class=\"na\"\u003edisabled\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e Completed task\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;task-list-item\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003einput\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;checkbox\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003echecked\u003c/span\u003e \u003cspan class=\"na\"\u003edisabled\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e Another completed task\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;task-list-item\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003einput\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;checkbox\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003edisabled\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e Incomplete task\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;task-list-item\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003einput\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;checkbox\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003edisabled\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e Another incomplete task\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;task-list\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;task-list-item\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003einput\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;checkbox\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003echecked\u003c/span\u003e \u003cspan class=\"na\"\u003edisabled\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e Nested completed\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;task-list-item\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003einput\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;checkbox\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003edisabled\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e Nested incomplete\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"autolinks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAutolinks\u003c/span\u003e \u003ca href=\"#autolinks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eURLs and email addresses are automatically converted to links:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eVisit https://example.com for more info.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContact us at support\u003cspan class=\"ni\"\u003e@example\u003c/span\u003e.com.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewww.example.com also works.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eVisit \u003ca href=\"https://example.com\"\u003ehttps://example.com\u003c/a\u003e for more info.\u003c/p\u003e\n\u003cp\u003eContact us at \u003ca href=\"mailto:support@example.com\"\u003esupport@example.com\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.example.com\"\u003ewww.example.com\u003c/a\u003e also works.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eVisit \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ehttps://example.com\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e for more info.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eContact us at \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mailto:support@example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003esupport@example.com\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;http://www.example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ewww.example.com\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e also works.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"smart-quotes-typographer\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSmart Quotes (Typographer)\u003c/span\u003e \u003ca href=\"#smart-quotes-typographer\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go automatically converts straight quotes and punctuation to their typographic (curly) equivalents:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eInput\u003c/th\u003e\n\u003cth\u003eOutput\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;Hello\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;Hello\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDouble curly quotes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e'Hello'\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e'Hello'\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSingle curly quotes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eIt's\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eIt's\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eApostrophe\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e9--5\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e9–5\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEn dash\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehello---world\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehello—world\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEm dash\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewait...\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ewait…\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEllipsis\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;This sentence uses smart quotes.\u0026rdquo; It\u0026rsquo;s automatic—you don\u0026rsquo;t need to do anything special. Just write normally and markata-go handles the conversion.\u003c/p\u003e\n\u003cp\u003eUse en dashes for ranges like 9–5, and em dashes for breaks in thought—like this. Ellipses work too…\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDisabling:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eTo disable smart quotes (use straight quotes instead):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eextensions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etypographer\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"definition-lists\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDefinition Lists\u003c/span\u003e \u003ca href=\"#definition-lists\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCreate definition lists (glossary-style terms and definitions) using PHP Markdown Extra syntax:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTerm 1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:   Definition of the first term.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTerm 2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:   First definition of the second term.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:   Second definition of the second term.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cdl\u003e\n\u003cdt\u003eHTML\u003c/dt\u003e\n\u003cdd\u003eHyperText Markup Language - the standard markup language for documents designed to be displayed in a web browser.\u003c/dd\u003e\n\u003cdt\u003eCSS\u003c/dt\u003e\n\u003cdd\u003eCascading Style Sheets - a style sheet language used for describing the presentation of a document.\u003c/dd\u003e\n\u003cdd\u003eCan also refer to Content Scramble System (in different contexts).\u003c/dd\u003e\n\u003c/dl\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003edl\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003edt\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eTerm 1\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003edt\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003edd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eDefinition of the first term.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003edd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003edt\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eTerm 2\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003edt\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003edd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eFirst definition of the second term.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003edd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003edd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eSecond definition of the second term.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003edd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003edl\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eUse cases:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eGlossaries and terminology lists\u003c/li\u003e\n\u003cli\u003eFAQ sections (question as term, answer as definition)\u003c/li\u003e\n\u003cli\u003eKey-value documentation\u003c/li\u003e\n\u003cli\u003eAPI parameter descriptions\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eDisabling:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eextensions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefinition_list\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"footnotes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFootnotes\u003c/span\u003e \u003ca href=\"#footnotes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd footnotes to your content using PHP Markdown Extra syntax:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHere\u0026#39;s a sentence that needs a citation.[^1]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[^1]: This is the footnote content that appears at the bottom of the document.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003emarkata-go supports footnotes for academic writing and citations.\u003csup id=\"fnref:1\"\u003e\u003ca href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\"\u003e1\u003c/a\u003e\u003c/sup\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eHere\u0026#39;s a sentence that needs a citation.\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esup\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#fn:1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e1\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esup\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- Later in the document --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;footnotes\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eol\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;fn:1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eThis is the footnote content. \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#fnref:1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e↩\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eol\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eMultiple footnotes:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFirst citation.[^1] Second citation.[^2] Reuse first.[^1]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[^1]: First footnote content.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[^2]: Second footnote content.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBest practices:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eKeep footnotes brief and focused\u003c/li\u003e\n\u003cli\u003eUse descriptive reference labels (e.g., \u003ccode\u003e[^smith-2020]\u003c/code\u003e instead of \u003ccode\u003e[^1]\u003c/code\u003e) for maintainability\u003c/li\u003e\n\u003cli\u003ePlace all footnote definitions at the end of your document\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eDisabling:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eextensions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efootnote\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"cjk-line-breaks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCJK Line Breaks\u003c/span\u003e \u003ca href=\"#cjk-line-breaks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEnable proper line breaking for Chinese, Japanese, and Korean (CJK) text. Without this extension, CJK characters may wrap awkwardly in the middle of words.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eこれはテストです。これはテストです。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e这是一段中文测试文本。\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eこれはテストです。\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ebr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eこれはテストです。\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e这是一段中文测试文本。\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eConfiguration:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eextensions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecjk\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e  \u003cspan class=\"c\"\u003e# default: true\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"figures\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFigures\u003c/span\u003e \u003ca href=\"#figures\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAutomatically convert images with following paragraphs into HTML \u003ccode\u003e\u0026lt;figure\u0026gt;\u003c/code\u003e elements with \u003ccode\u003e\u0026lt;figcaption\u0026gt;\u003c/code\u003e. A single-paragraph blockquote immediately after an image is also treated as caption content, which is useful when the caption should read as quoted text.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eAlt text\u003c/span\u003e](\u003cspan class=\"na\"\u003eimage.jpg\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis is the caption for the figure.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eAlt text\u003c/span\u003e](\u003cspan class=\"na\"\u003eimage.jpg\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\u0026gt; \u003c/span\u003e\u003cspan class=\"ge\"\u003eThis quoted line also becomes the figure caption.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003efigure\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;image.jpg\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Alt text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003efigcaption\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eThis is the caption for the figure.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003efigcaption\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003efigure\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eUse cases:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eImage galleries with captions\u003c/li\u003e\n\u003cli\u003eCharts and diagrams with descriptions\u003c/li\u003e\n\u003cli\u003ePhotos with credits or descriptions\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eextensions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efigure\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e  \u003cspan class=\"c\"\u003e# default: true\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"blockquote-attribution\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBlockquote Attribution\u003c/span\u003e \u003ca href=\"#blockquote-attribution\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAutomatically convert blockquotes followed by attribution text into HTML \u003ccode\u003e\u0026lt;figure class=\u0026quot;quote\u0026quot;\u0026gt;\u003c/code\u003e elements with \u003ccode\u003e\u0026lt;figcaption\u0026gt;\u003c/code\u003e. The attribution text must directly follow the blockquote with no blank line between them.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\u0026gt; \u003c/span\u003e\u003cspan class=\"ge\"\u003eDesign is not just what it looks like and feels like.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\u0026gt; \u003c/span\u003e\u003cspan class=\"ge\"\u003eDesign is how it works.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSteve Jobs\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\u0026gt; \u003c/span\u003e\u003cspan class=\"ge\"\u003eThe only way to do great work is to love what you do.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ni\"\u003e@stevejobs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\u0026gt; \u003c/span\u003e\u003cspan class=\"ge\"\u003eStay hungry, stay foolish.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[[Steve Jobs]]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\u0026gt; \u003c/span\u003e\u003cspan class=\"ge\"\u003eInnovation distinguishes between a leader and a follower.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003eSteve Jobs\u003c/span\u003e](\u003cspan class=\"na\"\u003e/authors/steve-jobs\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003efigure\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;quote\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eblockquote\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eDesign is not just what it looks like and feels like.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       Design is how it works.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eblockquote\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003efigcaption\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"ni\"\u003e\u0026amp;mdash;\u003c/span\u003e Steve Jobs\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003efigcaption\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003efigure\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eUse cases:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eQuotations with named attributions\u003c/li\u003e\n\u003cli\u003ePull quotes with sources\u003c/li\u003e\n\u003cli\u003eTestimonials with author credits\u003c/li\u003e\n\u003cli\u003eBlockquotes with citation links\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"heading-anchors\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHeading Anchors\u003c/span\u003e \u003ca href=\"#heading-anchors\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd clickable permalink anchors to all headings for easy deep-linking.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## My Heading\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;my-heading\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eMy Heading \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;anchor\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#my-heading\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e¶\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe anchor appears on hover and uses your theme\u0026rsquo;s color scheme.\u003c/p\u003e\n\u003cp\u003eHeading IDs are generated from the heading\u0026rsquo;s \u003cstrong\u003evisible text\u003c/strong\u003e, so link\ndestinations, emphasis markers and inline code never leak into the slug:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Recent [TIL](/til/)        → id=\u0026#34;recent-til\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Use `git stash`            → id=\u0026#34;use-git-stash\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eExplicit IDs (\u003ccode\u003e## Title {#custom-id}\u003c/code\u003e) are always kept as written. Headings\nthat belong to embedded cards (for example from \u003ccode\u003erender_feed\u003c/code\u003e) are left alone.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eUse cases:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDocumentation sites needing deep links\u003c/li\u003e\n\u003cli\u003eEasy sharing of specific sections\u003c/li\u003e\n\u003cli\u003eTable of contents linking\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eextensions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eanchor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e  \u003cspan class=\"c\"\u003e# default: false (use heading_anchors plugin instead)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"code-blocks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCode Blocks\u003c/span\u003e \u003ca href=\"#code-blocks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"code-copy-controls-progressive-enhancement\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCode copy controls (progressive enhancement)\u003c/span\u003e \u003ca href=\"#code-copy-controls-progressive-enhancement\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOn pages containing code blocks, the default theme can add a compact \u003cstrong\u003eCopy\u003c/strong\u003e\nbutton, and a language label when the fence specifies a language. The controls\nreuse the existing palette-aware Chroma styling and don\u0026rsquo;t require another\nhighlighter. Markata only loads the small enhancement script on code-bearing\npages; partial-page navigations initialize new blocks once, without duplicate\nbuttons. Mermaid diagrams are excluded.\u003c/p\u003e\n\u003cp\u003eThe fenced source remains native \u003ccode\u003e\u0026lt;pre\u0026gt;\u0026lt;code\u0026gt;\u003c/code\u003e HTML without JavaScript.\nClipboard actions require the browser\u0026rsquo;s permission or a secure context; if\nautomatic copying isn\u0026rsquo;t available, the control selects the code so readers can\ncopy it manually. Controls are omitted from copied rich post content.\u003c/p\u003e\n\u003cp\u003eFenced code blocks support syntax highlighting for many languages.\u003c/p\u003e\n\u003ch3 id=\"basic-code-block\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Code Block\u003c/span\u003e \u003ca href=\"#basic-code-block\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePlain code block without language\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eNo syntax highlighting applied\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003epre\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ePlain code block without language\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eNo syntax highlighting applied\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003epre\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"syntax-highlighting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSyntax Highlighting\u003c/span\u003e \u003ca href=\"#syntax-highlighting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSpecify the language after the opening fence for syntax highlighting:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```go\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003epackage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Hello, World!\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003epre\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ecode\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;language-go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003epackage main\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eimport \u0026#34;fmt\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efunc main() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    fmt.Println(\u0026#34;Hello, World!\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003epre\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWith syntax highlighting enabled, the output includes highlight spans:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003epre\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ecode\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;language-go hljs\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hljs-keyword\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003epackage\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e main\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hljs-keyword\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eimport\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hljs-string\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u0026#34;fmt\u0026#34;\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hljs-function\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hljs-keyword\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003efunc\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hljs-title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003emain\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hljs-params\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e()\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    fmt.\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hljs-title function_\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ePrintln\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e(\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hljs-string\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u0026#34;Hello, World!\u0026#34;\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003epre\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"supported-languages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSupported Languages\u003c/span\u003e \u003ca href=\"#supported-languages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go supports syntax highlighting for many languages including:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCategory\u003c/th\u003e\n\u003cth\u003eLanguages\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eWeb\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003ehtml, css, javascript, typescript, jsx, tsx, json, xml\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eBackend\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003ego, python, ruby, java, c, cpp, rust, php\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eShell\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003ebash, sh, zsh, powershell, shell\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eData\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eyaml, toml, ini, sql\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eMarkup\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003emarkdown, latex, tex\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eConfig\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003edockerfile, nginx, apache\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eOther\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003ediff, plaintext, text\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigure syntax highlighting in \u003ccode\u003emarkata-go.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehighlight\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;github-dark\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Chroma theme (optional)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eline_numbers\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e     \u003cspan class=\"c\"\u003e# Line numbers (if supported)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"automatic-theme-from-palette\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAutomatic Theme from Palette\u003c/span\u003e \u003ca href=\"#automatic-theme-from-palette\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eBy default, syntax highlighting is \u003cstrong\u003edriven by your site\u0026rsquo;s palette code colors\u003c/strong\u003e. This ensures code blocks match your site\u0026rsquo;s overall look even when there is no exact Chroma theme match:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-mocha\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe palette\u0026rsquo;s \u003ccode\u003ecode-*\u003c/code\u003e component roles control the generated CSS variables used by Chroma token classes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecode-bg\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecode-text\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecode-comment\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecode-keyword\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecode-string\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecode-number\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecode-function\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecode-type\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecode-operator\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIf you want a specific Chroma theme instead of palette-native colors, set \u003ccode\u003emarkdown.highlight.theme\u003c/code\u003e explicitly.\u003c/p\u003e\n\u003ch4 id=\"explicit-override\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExplicit Override\u003c/span\u003e \u003ca href=\"#explicit-override\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eTo use a different code theme than your palette suggests:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;catppuccin-mocha\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehighlight\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dracula\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Override: use Dracula instead of Catppuccin\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"available-themes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAvailable Themes\u003c/span\u003e \u003ca href=\"#available-themes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003ePopular themes include:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTheme\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egithub\u003c/code\u003e / \u003ccode\u003egithub-dark\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eClean, neutral (default)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emonokai\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eClassic dark theme\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edracula\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eVibrant dark theme\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enord\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eArctic, blue-tinted\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecatppuccin-mocha\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSoothing pastel (dark)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecatppuccin-latte\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSoothing pastel (light)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erose-pine\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSoho vibes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egruvbox\u003c/code\u003e / \u003ccode\u003egruvbox-light\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRetro groove\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etokyonight-night\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTokyo city lights\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esolarized-dark\u003c/code\u003e / \u003ccode\u003esolarized-light\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eScientifically designed\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eSee the \u003ca href=\"https://xyproto.github.io/splash/docs/\"\u003eChroma Style Gallery\u003c/a\u003e for all available themes.\u003c/p\u003e\n\u003ch3 id=\"language-aliases\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLanguage Aliases\u003c/span\u003e \u003ca href=\"#language-aliases\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCommon aliases are supported:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAlias\u003c/th\u003e\n\u003cth\u003eLanguage\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ejs\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ejavascript\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ets\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003etypescript\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epy\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003epython\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erb\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eruby\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esh\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebash\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eyml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eyaml\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emd\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003emarkdown\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"attribute-syntax\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAttribute Syntax\u003c/span\u003e \u003ca href=\"#attribute-syntax\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go supports adding CSS classes, IDs, and other attributes to elements using the brace syntax \u003ccode\u003e{...}\u003c/code\u003e. This works for block-level elements (headings, paragraphs, blockquotes, lists, tables) and inline elements (images, links, emphasis, code, strikethrough).\u003c/p\u003e\n\u003ch3 id=\"adding-classes-to-images\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdding Classes to Images\u003c/span\u003e \u003ca href=\"#adding-classes-to-images\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe most common use case is adding CSS classes to images for styling:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eBeautiful sunset\u003c/span\u003e](\u003cspan class=\"na\"\u003esunset.webp\u003c/span\u003e){.more-cinematic}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eProduct photo\u003c/span\u003e](\u003cspan class=\"na\"\u003eproduct.jpg\u003c/span\u003e){.shadow .rounded}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"sunset.webp\" alt=\"Beautiful sunset\" class=\"more-cinematic\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;sunset.webp\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Beautiful sunset\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;more-cinematic\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;product.jpg\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Product photo\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;shadow rounded\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"adding-ids-to-images\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdding IDs to Images\u003c/span\u003e \u003ca href=\"#adding-ids-to-images\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eYou can also add IDs for JavaScript targeting or anchor links:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eHero banner\u003c/span\u003e](\u003cspan class=\"na\"\u003ehero.png\u003c/span\u003e){\u003cspan class=\"ni\"\u003e#hero\u003c/span\u003e-image}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eMain product\u003c/span\u003e](\u003cspan class=\"na\"\u003eproduct.webp\u003c/span\u003e){\u003cspan class=\"ni\"\u003e#featured\u003c/span\u003e-product .highlight}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hero.png\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Hero banner\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hero-image\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;product.webp\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Main product\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;featured-product\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;highlight\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"styling-links\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStyling Links\u003c/span\u003e \u003ca href=\"#styling-links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eApply classes to links for custom styling:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003eRead the documentation\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://example.com/docs\u003c/span\u003e){.button .primary}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003eExternal link\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://github.com\u003c/span\u003e){.external-link}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://example.com/docs\" class=\"button primary\"\u003eRead the documentation\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com\" class=\"external-link\"\u003eExternal link\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com/docs\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;button primary\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eRead the documentation\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://github.com\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;external-link\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eExternal link\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"styling-headings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStyling Headings\u003c/span\u003e \u003ca href=\"#styling-headings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd classes or custom IDs to headings:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Featured Section {.highlighted}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Installation {#install}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Important Notice {#notice .warning-header}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 class=\"example-class\" id=\"example-heading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample Heading\u003c/span\u003e \u003ca href=\"#example-heading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;highlighted\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;featured-section\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eFeatured Section\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;install\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eInstallation\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;notice\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;warning-header\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eImportant Notice\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"styling-paragraphs-and-block-elements\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStyling Paragraphs and Block Elements\u003c/span\u003e \u003ca href=\"#styling-paragraphs-and-block-elements\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eA short paragraph\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{.lead}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e\u0026gt; \u003c/span\u003e\u003cspan class=\"ge\"\u003eA callout blockquote\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{.callout}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e A list item\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {.item}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Col |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|---|\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Cell {.cell} |\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;lead\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eA short paragraph\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eblockquote\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;callout\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eA callout blockquote\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eblockquote\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;item\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eA list item\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etable\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etbody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;cell\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eCell\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etd\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etbody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etable\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"styling-inline-text\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStyling Inline Text\u003c/span\u003e \u003ca href=\"#styling-inline-text\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e*note*{.accent}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e`code`\u003c/span\u003e{.inline-code}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gd\"\u003e~~deprecated~~\u003c/span\u003e{.deprecated}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[[hello-world]]{.wikilink-pill}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eem\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;accent\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003enote\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eem\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ecode\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;inline-code\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ecode\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003edel\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;deprecated\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003edeprecated\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003edel\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/hello-world/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;wikilink wikilink-pill\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eHello World\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"syntax-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSyntax Reference\u003c/span\u003e \u003ca href=\"#syntax-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSyntax\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eResult\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e{.classname}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSingle CSS class\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eclass=\u0026quot;classname\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e{.class1 .class2}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMultiple classes\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eclass=\u0026quot;class1 class2\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e{#idname}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eID attribute\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eid=\u0026quot;idname\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e{#id .class}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eID and class\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eid=\u0026quot;id\u0026quot; class=\u0026quot;class\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e{data-attr=value}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCustom attribute\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edata-attr=\u0026quot;value\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"common-use-cases\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Use Cases\u003c/span\u003e \u003ca href=\"#common-use-cases\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eImage galleries:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003ePhoto 1\u003c/span\u003e](\u003cspan class=\"na\"\u003ephoto1.jpg\u003c/span\u003e){.gallery-item .zoomable}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003ePhoto 2\u003c/span\u003e](\u003cspan class=\"na\"\u003ephoto2.jpg\u003c/span\u003e){.gallery-item .zoomable}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCall-to-action buttons:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003eGet Started\u003c/span\u003e](\u003cspan class=\"na\"\u003esignup\u003c/span\u003e){.cta-button .large}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003eLearn More\u003c/span\u003e](\u003cspan class=\"na\"\u003edocs\u003c/span\u003e){.text-link .subtle}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eResponsive images:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eHero image\u003c/span\u003e](\u003cspan class=\"na\"\u003ehero.webp\u003c/span\u003e){.full-width .lazy-load}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eNavigation links:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003eHome\u003c/span\u003e](\u003cspan class=\"na\"\u003e/\u003c/span\u003e){.nav-link .active}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003eAbout\u003c/span\u003e](\u003cspan class=\"na\"\u003e/about\u003c/span\u003e){.nav-link}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"css-examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCSS Examples\u003c/span\u003e \u003ca href=\"#css-examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eHere are some CSS rules you might use with attribute-styled elements:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Cinematic image style */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003emore-cinematic\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003efilter\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003econtrast\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mf\"\u003e1.1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"nb\"\u003esaturate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mf\"\u003e1.2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eborder-radius\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Shadow and border */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eshadow\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ebox-shadow\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"nb\"\u003ergba\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ebordered\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eborder\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"kc\"\u003esolid\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eborder\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Button-style links */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ebutton\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003einline-block\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003epadding\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"kt\"\u003eem\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"kt\"\u003eem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eprimary\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ewhite\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003etext-decoration\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enone\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eborder-radius\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ebutton\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eprimary\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eaccent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* External link indicator */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eexternal-link\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nd\"\u003eafter\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34; ↗\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003efont-size\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.8\u003c/span\u003e\u003cspan class=\"kt\"\u003eem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"admonitions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdmonitions\u003c/span\u003e \u003ca href=\"#admonitions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdmonitions (also called callouts) are visually distinct blocks for notes, warnings, tips, and other highlighted content.\u003c/p\u003e\n\u003ch3 id=\"basic-syntax\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Syntax\u003c/span\u003e \u003ca href=\"#basic-syntax\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse \u003ccode\u003e!!!\u003c/code\u003e followed by the type and optional title:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! note \u0026#34;Optional Title\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Admonition content here.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Can span multiple lines.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Supports \u003cspan class=\"gs\"\u003e**Markdown**\u003c/span\u003e formatting.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! warning\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Warning without custom title uses type as title.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive examples:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eOptional Title\u003c/p\u003e\n\u003cp\u003eAdmonition content here.\nCan span multiple lines.\u003c/p\u003e\n\u003cp\u003eSupports \u003cstrong\u003eMarkdown\u003c/strong\u003e formatting.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eWarning\u003c/p\u003e\n\u003cp\u003eWarning without custom title uses type as title.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;admonition note\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;admonition-title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eOptional Title\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAdmonition content here.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  Can span multiple lines.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eSupports \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estrong\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eMarkdown\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003estrong\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e formatting.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;admonition warning\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;admonition-title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eWarning\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eWarning without custom title uses type as title.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"admonition-types\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdmonition Types\u003c/span\u003e \u003ca href=\"#admonition-types\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault Title\u003c/th\u003e\n\u003cth\u003eTypical Color\u003c/th\u003e\n\u003cth\u003eUse Case\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enote\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNote\u003c/td\u003e\n\u003ctd\u003eBlue\u003c/td\u003e\n\u003ctd\u003eAdditional information\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einfo\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInfo\u003c/td\u003e\n\u003ctd\u003eBlue\u003c/td\u003e\n\u003ctd\u003eBackground context\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etip\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTip\u003c/td\u003e\n\u003ctd\u003eGreen\u003c/td\u003e\n\u003ctd\u003eHelpful suggestions\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHint\u003c/td\u003e\n\u003ctd\u003eGreen\u003c/td\u003e\n\u003ctd\u003eSubtle guidance\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esuccess\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSuccess\u003c/td\u003e\n\u003ctd\u003eGreen\u003c/td\u003e\n\u003ctd\u003ePositive outcomes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewarning\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWarning\u003c/td\u003e\n\u003ctd\u003eYellow/Orange\u003c/td\u003e\n\u003ctd\u003ePotential issues\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecaution\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCaution\u003c/td\u003e\n\u003ctd\u003eYellow/Orange\u003c/td\u003e\n\u003ctd\u003eProceed carefully\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edanger\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDanger\u003c/td\u003e\n\u003ctd\u003eRed\u003c/td\u003e\n\u003ctd\u003eCritical warnings\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eerror\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eError\u003c/td\u003e\n\u003ctd\u003eRed\u003c/td\u003e\n\u003ctd\u003eError conditions\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebug\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBug\u003c/td\u003e\n\u003ctd\u003eRed\u003c/td\u003e\n\u003ctd\u003eKnown issues\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexample\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eExample\u003c/td\u003e\n\u003ctd\u003ePurple\u003c/td\u003e\n\u003ctd\u003eCode examples\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003equote\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eQuote\u003c/td\u003e\n\u003ctd\u003eGray\u003c/td\u003e\n\u003ctd\u003eQuotations\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eabstract\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAbstract\u003c/td\u003e\n\u003ctd\u003eCyan\u003c/td\u003e\n\u003ctd\u003eSummaries\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003easide\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e(none)\u003c/td\u003e\n\u003ctd\u003eGray\u003c/td\u003e\n\u003ctd\u003eSidebar/marginal notes\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"examples-of-each-type\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples of Each Type\u003c/span\u003e \u003ca href=\"#examples-of-each-type\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEach example below shows the markdown syntax followed by how it renders.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eNote:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! note\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    This is a general note providing additional context or information\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    that might be helpful but isn\u0026#39;t critical.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cp\u003eThis is a general note providing additional context or information\nthat might be helpful but isn\u0026rsquo;t critical.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003e\u003cstrong\u003eTip:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! tip \u0026#34;Pro Tip\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Use keyboard shortcuts to speed up your workflow.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Press \u003cspan class=\"sb\"\u003e`Ctrl+Shift+P`\u003c/span\u003e to open the command palette.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition tip\"\u003e\n\u003cp class=\"admonition-title\"\u003ePro Tip\u003c/p\u003e\n\u003cp\u003eUse keyboard shortcuts to speed up your workflow.\nPress \u003ccode\u003eCtrl+Shift+P\u003c/code\u003e to open the command palette.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003e\u003cstrong\u003eWarning:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! warning \u0026#34;Deprecation Notice\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    This API will be removed in version 3.0.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Please migrate to the new API before upgrading.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eDeprecation Notice\u003c/p\u003e\n\u003cp\u003eThis API will be removed in version 3.0.\nPlease migrate to the new API before upgrading.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003e\u003cstrong\u003eDanger:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! danger \u0026#34;Data Loss Warning\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    This operation cannot be undone. Make sure you have\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    a backup before proceeding.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003eData Loss Warning\u003c/p\u003e\n\u003cp\u003eThis operation cannot be undone. Make sure you have\na backup before proceeding.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003e\u003cstrong\u003eInfo:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! info\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    This feature was introduced in version 2.5 and requires\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Go 1.21 or later.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition info\"\u003e\n\u003cp class=\"admonition-title\"\u003eInfo\u003c/p\u003e\n\u003cp\u003eThis feature was introduced in version 2.5 and requires\nGo 1.21 or later.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003e\u003cstrong\u003eExample:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! example \u0026#34;Usage Example\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ``\u003cspan class=\"sb\"\u003e`go\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    result := myFunction(input)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    fmt.Println(result)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    `\u003c/span\u003e``\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition example\"\u003e\n\u003cp class=\"admonition-title\"\u003eUsage Example\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eresult\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003emyFunction\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003einput\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eresult\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp\u003e\u003cstrong\u003eSuccess:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! success \u0026#34;Build Complete\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Your site has been successfully built and deployed.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition success\"\u003e\n\u003cp class=\"admonition-title\"\u003eBuild Complete\u003c/p\u003e\n\u003cp\u003eYour site has been successfully built and deployed.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003e\u003cstrong\u003eBug:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! bug \u0026#34;Known Issue\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    There is a known issue with Safari where animations may flicker.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    A fix is planned for the next release.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition bug\"\u003e\n\u003cp class=\"admonition-title\"\u003eKnown Issue\u003c/p\u003e\n\u003cp\u003eThere is a known issue with Safari where animations may flicker.\nA fix is planned for the next release.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003e\u003cstrong\u003eQuote:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! quote \u0026#34;Albert Einstein\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Imagination is more important than knowledge. Knowledge is limited.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Imagination encircles the world.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eAlbert Einstein\u003c/p\u003e\n\u003cp\u003eImagination is more important than knowledge. Knowledge is limited.\nImagination encircles the world.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003e\u003cstrong\u003eAbstract:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! abstract \u0026#34;Summary\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    This article covers the basics of static site generation,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    including configuration, templating, and deployment strategies.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition abstract\"\u003e\n\u003cp class=\"admonition-title\"\u003eSummary\u003c/p\u003e\n\u003cp\u003eThis article covers the basics of static site generation,\nincluding configuration, templating, and deployment strategies.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch3 id=\"collapsible-admonitions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCollapsible Admonitions\u003c/span\u003e \u003ca href=\"#collapsible-admonitions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse \u003ccode\u003e???\u003c/code\u003e for collapsed (closed by default) or \u003ccode\u003e???+\u003c/code\u003e for expanded (open by default):\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e??? note \u0026#34;Click to expand\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    This content is hidden by default.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Click the title to reveal it.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e???+ tip \u0026#34;Expanded by default\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    This content is visible initially.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Click to collapse.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive examples:\u003c/strong\u003e\u003c/p\u003e\n\u003cdetails class=\"admonition note\"\u003e\n\u003csummary class=\"admonition-title\"\u003eClick to expand\u003c/summary\u003e\n\u003cp\u003eThis content is hidden by default.\nClick the title to reveal it.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails class=\"admonition tip\" open\u003e\n\u003csummary class=\"admonition-title\"\u003eExpanded by default\u003c/summary\u003e\n\u003cp\u003eThis content is visible initially.\nClick to collapse.\u003c/p\u003e\n\u003c/details\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003edetails\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;admonition note\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esummary\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;admonition-title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eClick to expand\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esummary\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eThis content is hidden by default.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  Click the title to reveal it.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003edetails\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003edetails\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;admonition tip\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esummary\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;admonition-title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eExpanded by default\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esummary\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eThis content is visible initially.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  Click to collapse.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003edetails\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"nested-content-in-admonitions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNested Content in Admonitions\u003c/span\u003e \u003ca href=\"#nested-content-in-admonitions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdmonitions can contain any Markdown content:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! example \u0026#34;Complete Example\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Here\u0026#39;s a full working example:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ``\u003cspan class=\"sb\"\u003e`python\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    def greet(name):\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e        return f\u0026#34;Hello, {name}!\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    print(greet(\u0026#34;World\u0026#34;))\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    `\u003c/span\u003e`\u003cspan class=\"sb\"\u003e`\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    **Output:**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    `\u003c/span\u003e`\u003cspan class=\"sb\"\u003e`\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    Hello, World!\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    `\u003c/span\u003e``\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003e-\u003c/span\u003e Works with Python 3.6+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003e-\u003c/span\u003e Requires no dependencies\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! note\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    A blank line after the admonition header is allowed.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Content must still be indented.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! tip\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003e-\u003c/span\u003e The first body line can be a list, heading or quote too;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003e-\u003c/span\u003e it is parsed as Markdown, never as an indented code block.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"admonition example\"\u003e\n\u003cp class=\"admonition-title\"\u003eComplete Example\u003c/p\u003e\n\u003cp\u003eHere\u0026rsquo;s a full working example:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003egreet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Hello, \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003egreet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;World\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eHello, World!\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003eWorks with Python 3.6+\u003c/li\u003e\n\u003cli\u003eRequires no dependencies\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/div\u003e\n\u003ch3 id=\"aside-marginal-notes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAside (Marginal Notes)\u003c/span\u003e \u003ca href=\"#aside-marginal-notes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe \u003ccode\u003easide\u003c/code\u003e type creates sidebar or marginal notes:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! aside\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    This is a marginal note that floats to the side.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! aside \u0026#34;Definition\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    A \u003cspan class=\"gs\"\u003e**static site generator**\u003c/span\u003e converts source files into static HTML.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003caside class=\"admonition aside aside-right\"\u003e\n\u003cp\u003eThis is a marginal note that floats to the side.\u003c/p\u003e\n\u003c/aside\u003e\n\u003caside class=\"admonition aside aside-right\"\u003e\n\u003cp class=\"admonition-title\"\u003eDefinition\u003c/p\u003e\n\u003cp\u003eA \u003cstrong\u003estatic site generator\u003c/strong\u003e converts source files into static HTML.\u003c/p\u003e\n\u003c/aside\u003e\n\u003cp\u003eControl positioning with inline modifiers:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! aside inline\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Floats to the left of content.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!!! aside inline end\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Floats to the right of content (default).\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSee \u003ca href=\"../advanced-usage.md#admonitions-and-callouts\"\u003eAdvanced Usage\u003c/a\u003e for styling and customization options.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"wikilinks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWikilinks\u003c/span\u003e \u003ca href=\"#wikilinks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWikilinks provide an easy way to link between posts using \u003ccode\u003e[[slug]]\u003c/code\u003e syntax.\u003c/p\u003e\n\u003ch3 id=\"basic-syntax-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Syntax\u003c/span\u003e \u003ca href=\"#basic-syntax-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCheck out [[getting-started]] for installation instructions.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSee also: [[quickstart]], [[advanced-usage]]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCheck out [[getting-started]] for installation instructions.\u003c/p\u003e\n\u003cp\u003eSee also: [[quickstart]], [[advanced-usage]]\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput (when posts exist):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eCheck out \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/getting-started/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;wikilink\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eGetting Started\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e for installation instructions.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eSee also: \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/quickstart/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;wikilink\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eQuickstart\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e, \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/advanced-usage/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;wikilink\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAdvanced Usage\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"custom-link-text\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Link Text\u003c/span\u003e \u003ca href=\"#custom-link-text\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse the pipe (\u003ccode\u003e|\u003c/code\u003e) to specify custom link text:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRead the [[getting-started|installation guide]] first.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFor more details, see [[advanced-usage|the advanced guide]].\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eRead the [[getting-started|installation guide]] first.\u003c/p\u003e\n\u003cp\u003eFor more details, see [[advanced-usage|the advanced guide]].\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eRead the \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/getting-started/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;wikilink\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003einstallation guide\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e first.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eFor more details, see \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/advanced-usage/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;wikilink\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ethe advanced guide\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"linking-to-sections\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLinking to Sections\u003c/span\u003e \u003ca href=\"#linking-to-sections\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eLink to specific headings within posts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSee [[feeds-guide\u003cspan class=\"ni\"\u003e#feed\u003c/span\u003e-configuration]] for feed setup.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCheck the [[templates-guide\u003cspan class=\"ni\"\u003e#available\u003c/span\u003e-variables|template variables section]].\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eSee [[feeds-guide#feed-configuration]] for feed setup.\u003c/p\u003e\n\u003cp\u003eCheck the [[templates-guide#available-variables|template variables section]].\u003c/p\u003e\n\u003ch3 id=\"wikilink-resolution\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWikilink Resolution\u003c/span\u003e \u003ca href=\"#wikilink-resolution\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go resolves wikilinks by:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eFinding a post where \u003ccode\u003eslug == link_target\u003c/code\u003e (case-insensitive)\u003c/li\u003e\n\u003cli\u003eIf no slug match, checking for posts with matching \u003ccode\u003ealiases\u003c/code\u003e in frontmatter\u003c/li\u003e\n\u003cli\u003eIf found: renders as \u003ccode\u003e\u0026lt;a href=\u0026quot;{post.href}\u0026quot;\u0026gt;{text}\u0026lt;/a\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eIf not found: leaves as literal \u003ccode\u003e[[link]]\u003c/code\u003e and warns\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"using-aliases\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing Aliases\u003c/span\u003e \u003ca href=\"#using-aliases\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eYou can define aliases in your post\u0026rsquo;s frontmatter to create alternative names for linking:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eTarget post (\u003ccode\u003eecmascript.md\u003c/code\u003e):\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ECMAScript Language Specification\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ecmascript\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ealiases\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ejs\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ejavascript\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003eJavaScript\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eSource post:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLearn about [[js]] and [[javascript]] - both link to the ECMAScript post!\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eLearn about \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/ecmascript/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;wikilink\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eECMAScript Language Specification\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e and \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/ecmascript/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;wikilink\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eECMAScript Language Specification\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e - both link to the ECMAScript post!\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eSlug Precedence\u003c/p\u003e\n\u003cp\u003eIf a slug and an alias have the same name, the slug always takes precedence.\nFor example, if post A has \u003ccode\u003eslug: \u0026quot;javascript\u0026quot;\u003c/code\u003e and post B has\n\u003ccode\u003ealiases: [\u0026quot;javascript\u0026quot;]\u003c/code\u003e, then \u003ccode\u003e[[javascript]]\u003c/code\u003e will link to post A.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch3 id=\"broken-link-handling\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBroken Link Handling\u003c/span\u003e \u003ca href=\"#broken-link-handling\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen a wikilink target doesn\u0026rsquo;t exist:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSee [[nonexistent-post]] for more.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eSee [[nonexistent-post]] for more.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eSee [[nonexistent-post]] for more.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBuild warning:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eWarning: Broken wikilink in posts/my-post.md: [[nonexistent-post]] (post not found)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eEnable strict mode to fail builds on broken links:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estrict_wikilinks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"syntax-reference-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSyntax Reference\u003c/span\u003e \u003ca href=\"#syntax-reference-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSyntax\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eOutput\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e[[slug]]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBasic link (auto-title)\u003c/td\u003e\n\u003ctd\u003eLink with post title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e[[slug|Text]]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCustom text\u003c/td\u003e\n\u003ctd\u003eLink with \u0026ldquo;Text\u0026rdquo;\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e[[slug#section]]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSection link\u003c/td\u003e\n\u003ctd\u003eLink to heading anchor\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e[[slug#section|Text]]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSection with text\u003c/td\u003e\n\u003ctd\u003eCustom text to section\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"hover-cards\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHover Cards\u003c/span\u003e \u003ca href=\"#hover-cards\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe default theme shows a small preview card when a reader hovers or\nkeyboard-focuses certain links. One component (\u003ccode\u003ejs/tooltips.js\u003c/code\u003e) draws every\ncard, so they share the same look, placement, and keyboard behavior.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSource\u003c/th\u003e\n\u003cth\u003eWhat the card shows\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eWikilinks (\u003ccode\u003e[[slug]]\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003eTarget title, description, date, and path\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGlossary terms\u003c/td\u003e\n\u003ctd\u003eTerm name, definition, and path (replaces the browser\u0026rsquo;s native \u003ccode\u003etitle\u003c/code\u003e tooltip)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edata-hover-title\u003c/code\u003e / \u003ccode\u003edata-hover-description\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eYour own title and text\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edata-hover-card=\u0026quot;#id\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRich HTML copied from a \u003ccode\u003e\u0026lt;template\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eExternal links (opt-in)\u003c/td\u003e\n\u003ctd\u003ePage title, description, preview image, site icon, and path\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eWikilinks and glossary terms get cards automatically. External links get cards\nwhen you enable the \u003ca href=\"/docs/reference/plugins/#external_link_hover\"\u003e\u003ccode\u003eexternal_link_hover\u003c/code\u003e\u003c/a\u003e\nplugin. For anything else, add attributes to inline HTML in your Markdown.\u003c/p\u003e\n\u003ch3 id=\"simple-text-card\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSimple Text Card\u003c/span\u003e \u003ca href=\"#simple-text-card\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMarkata supports \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003edata-hover-title\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Static Site Generator\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"na\"\u003edata-hover-description\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Builds plain HTML files ahead of time.\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eSSGs\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMarkata supports \u003cspan data-hover-title=\"Static Site Generator\" data-hover-description=\"Builds plain HTML files ahead of time.\"\u003eSSGs\u003c/span\u003e.\u003c/p\u003e\n\u003ch3 id=\"rich-card-from-a-template\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRich Card From a Template\u003c/span\u003e \u003ca href=\"#rich-card-from-a-template\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePoint \u003ccode\u003edata-hover-card\u003c/code\u003e at a \u003ccode\u003e\u0026lt;template\u0026gt;\u003c/code\u003e (or any element) by CSS selector.\nThe template can hold links and markup, and the reader can move the pointer\ninto the card to click them.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTry \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003edata-hover-card\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#vibe-card\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003evibe coding\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e today.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;vibe-card\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estrong\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/vibe-coding/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eVibe Coding\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003estrong\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eDescribe intent to an AI assistant and iterate on the result.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eTry \u003cspan data-hover-card=\"#vibe-card-example\"\u003evibe coding\u003c/span\u003e today.\u003c/p\u003e\n\u003ctemplate id=\"vibe-card-example\"\u003e\n  \u003cstrong\u003eVibe Coding\u003c/strong\u003e\n  \u003cp\u003eDescribe intent to an AI assistant and iterate on the result.\u003c/p\u003e\n\u003c/template\u003e\n\u003ch3 id=\"external-link-cards\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExternal Link Cards\u003c/span\u003e \u003ca href=\"#external-link-cards\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTurn on the \u003ccode\u003eexternal_link_hover\u003c/code\u003e plugin and ordinary Markdown links to other\nsites get preview cards:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eexternal_link_hover\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efetch\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# look up pages that aren\u0026#39;t cached yet\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efavicon_service\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://icons.duckduckgo.com/ip3/{host}.ico\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSee the [\u003cspan class=\"nt\"\u003emarkata-go repo\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://github.com/WaylonWalker/markata-go\u003c/span\u003e).\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe card uses metadata markata-go already has: Open Graph and oEmbed data from\nthe embeds cache, your blogroll feed entries, and the link\u0026rsquo;s Markdown title.\nWith \u003ccode\u003efetch = false\u003c/code\u003e (the default) the build makes no network requests, and\nlinks without metadata still get a small card with the host and path.\u003c/p\u003e\n\u003cp\u003eTo skip one link, add \u003ccode\u003edata-no-preview\u003c/code\u003e with inline HTML:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003edata-no-preview\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eno card here\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBehavior\u003c/span\u003e \u003ca href=\"#behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eCards open after a short delay, stay open while the pointer is over the\ntarget or the card, and close on pointer leave, scroll, click elsewhere, or\n\u003ckbd\u003eEscape\u003c/kbd\u003e.\u003c/li\u003e\n\u003cli\u003eCards open on keyboard focus. Custom targets get \u003ccode\u003etabindex=\u0026quot;0\u0026quot;\u003c/code\u003e\nautomatically, so plain \u003ccode\u003e\u0026lt;span\u0026gt;\u003c/code\u003e elements are reachable with \u003ckbd\u003eTab\u003c/kbd\u003e.\u003c/li\u003e\n\u003cli\u003eCards open on the side your pointer is on. For a link that wraps across\nlines, hovering the first line opens the card above the link, and hovering\nthe last line opens it below. The card never covers the link, and it flips\nsides when there isn\u0026rsquo;t room. Single-line links and keyboard focus open below.\u003c/li\u003e\n\u003cli\u003eMention cards use the same placement rules.\u003c/li\u003e\n\u003cli\u003eTouch devices don\u0026rsquo;t get hover cards; tapping a link follows it.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"styling-hover-cards\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStyling Hover Cards\u003c/span\u003e \u003ca href=\"#styling-hover-cards\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEvery card has the \u003ccode\u003ehover-card\u003c/code\u003e class, plus a modifier for its source:\n\u003ccode\u003ewikilink-tooltip\u003c/code\u003e, \u003ccode\u003ehover-card--glossary\u003c/code\u003e, \u003ccode\u003ehover-card--external\u003c/code\u003e, or\n\u003ccode\u003ehover-card--rich\u003c/code\u003e. Override them in your own CSS:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehover-card\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003emax-width\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e28\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eborder-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eaccent\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ehover-card--rich\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003emax-height\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e16\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"adding-your-own-hover-source\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdding Your Own Hover Source\u003c/span\u003e \u003ca href=\"#adding-your-own-hover-source\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTheme and plugin scripts can register more sources. The build function gets\nthe hovered element and returns a DOM node (or \u003ccode\u003enull\u003c/code\u003e to skip):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eMarkataHoverCards\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eregister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;abbr[title]\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eel\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003enode\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;div\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003enode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eclassName\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;tooltip-desc\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003enode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etextContent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eel\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetAttribute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;title\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nx\"\u003enode\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBuilt-in sources take precedence over sources you register.\u003c/p\u003e\n\u003cp\u003eIf a script draws its own popup, reuse the placement rules so it opens on the\nsame side as every other card:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003epos\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eMarkataHoverCards\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eplacement\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003elink\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003epopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eoffsetWidth\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003epopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eoffsetHeight\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;fixed\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etop\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003epos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etop\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;px\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eleft\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003epos\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eleft\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;px\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition tip\"\u003e\n\u003cp class=\"admonition-title\"\u003ePrefer this over ad-hoc tooltips\u003c/p\u003e\n\u003cp\u003eUse hover cards instead of hand-written \u003ccode\u003ewa-tooltip\u003c/code\u003e + script combinations\nfor link and term previews. They follow the active palette, handle\nkeyboard focus, and stay inside the viewport.\u003c/p\u003e\n\u003c/div\u003e\n\u003chr\u003e\n\u003ch2 id=\"table-of-contents-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTable of Contents\u003c/span\u003e \u003ca href=\"#table-of-contents-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go can automatically generate a table of contents from your headings.\u003c/p\u003e\n\u003ch3 id=\"enabling-toc\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnabling TOC\u003c/span\u003e \u003ca href=\"#enabling-toc\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThere are three ways to control TOC display, in order of priority:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003e[[toc]]\u003c/code\u003e placeholder\u003c/strong\u003e - Insert TOC inline in your content\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFrontmatter\u003c/strong\u003e - \u003ccode\u003etoc: true\u003c/code\u003e or \u003ccode\u003etoc: false\u003c/code\u003e per-post override\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGlobal config\u003c/strong\u003e - Auto-enable based on content length\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"toc-placeholder\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTOC Placeholder\u003c/span\u003e \u003ca href=\"#toc-placeholder\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eInsert \u003ccode\u003e[[toc]]\u003c/code\u003e anywhere in your markdown to render the TOC at that position:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Article\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Table of Contents\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[[toc]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Introduction\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent starts here...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"frontmatter-override\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFrontmatter Override\u003c/span\u003e \u003ca href=\"#frontmatter-override\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eControl TOC per-post in frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Long Article\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etoc\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c\"\u003e# Force enable TOC\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Introduction\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e## Getting Started\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr disable TOC for a specific post:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Short Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etoc\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"c\"\u003e# Disable TOC even if global config enables it\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Introduction\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"global-auto-enable\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGlobal Auto-Enable\u003c/span\u003e \u003ca href=\"#global-auto-enable\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigure automatic TOC display based on content thresholds:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etoc\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_enable\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emin_toc_links\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e     \u003cspan class=\"c\"\u003e# Show if 3+ headings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emin_word_count\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e500\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Show if 500+ words\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"priority-order\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePriority Order\u003c/span\u003e \u003ca href=\"#priority-order\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTOC display is determined by the following priority:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003e[[toc]]\u003c/code\u003e placeholder\u003c/strong\u003e → Always shows TOC at placeholder position\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFrontmatter \u003ccode\u003etoc: false\u003c/code\u003e\u003c/strong\u003e → Disables TOC for this post\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFrontmatter \u003ccode\u003etoc: true\u003c/code\u003e\u003c/strong\u003e → Forces TOC for this post\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGlobal \u003ccode\u003eauto_enable: true\u003c/code\u003e\u003c/strong\u003e → Auto-shows if thresholds met\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGlobal \u003ccode\u003eenabled: true\u003c/code\u003e\u003c/strong\u003e → Default TOC behavior\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"toc-options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTOC Options\u003c/span\u003e \u003ca href=\"#toc-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etoc\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable TOC generation\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etoc_depth\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e2\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMaximum heading level (1-6)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etoc_min_items\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e2\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMinimum headings to show TOC\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Deep Dive Article\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etoc\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etoc_depth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e3\u003c/span\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"c\"\u003e# Include h1, h2, h3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etoc_min_items\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e3\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"c\"\u003e# Only show if 3+ headings\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"generated-toc-structure\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGenerated TOC Structure\u003c/span\u003e \u003ca href=\"#generated-toc-structure\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe TOC is available as \u003ccode\u003epost.Extra.toc_html\u003c/code\u003e:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eExample output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;toc\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#introduction\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eIntroduction\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#getting-started\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eGetting Started\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#prerequisites\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ePrerequisites\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#installation\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eInstallation\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#core-concepts\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eCore Concepts\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#advanced-topics\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAdvanced Topics\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"using-toc-in-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing TOC in Templates\u003c/span\u003e \u003ca href=\"#using-toc-in-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eInclude the TOC in your post template:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Extra.toc_html\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e\u0026lt;aside class=\u0026#34;toc-sidebar\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e    \u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Extra.toc_html\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003esafe\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e\u0026lt;/aside\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eendif\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e\u0026lt;div class=\u0026#34;post-content\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e    \u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003ebody\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003esafe\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e\u0026lt;/div\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSee [[templates-guide|Templates]] for more template examples.\u003c/p\u003e\n\u003ch3 id=\"configuration-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigure TOC defaults in \u003ccode\u003emarkata-go.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etoc\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault_depth\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emin_items\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"heading-anchors-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHeading Anchors\u003c/span\u003e \u003ca href=\"#heading-anchors-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go automatically generates anchor IDs for all headings, enabling direct linking to sections.\u003c/p\u003e\n\u003ch3 id=\"auto-generated-ids\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuto-Generated IDs\u003c/span\u003e \u003ca href=\"#auto-generated-ids\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eHeadings are automatically assigned IDs based on their text:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Hello World\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## What\u0026#39;s New?\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## 2024 Updates\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## FAQ\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hello-world\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eHello World\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;whats-new\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eWhat\u0026#39;s New?\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;2024-updates\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e2024 Updates\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;faq\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eFAQ\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition tip\"\u003e\n\u003cp class=\"admonition-title\"\u003eTry it\u003c/p\u003e\n\u003cp\u003eEvery heading on this page has an auto-generated ID. Hover over any heading to see the anchor link, or try linking to \u003ca href=\"#auto-generated-ids\"\u003e#auto-generated-ids\u003c/a\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch3 id=\"id-generation-rules\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eID Generation Rules\u003c/span\u003e \u003ca href=\"#id-generation-rules\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eHeading\u003c/th\u003e\n\u003cth\u003eGenerated ID\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e## Hello World\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehello-world\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e## What's New?\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ewhats-new\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e## C++ Tutorial\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ec-tutorial\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e## 100% Complete\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e100-complete\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e## Leading Space\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eleading-space\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"duplicate-handling\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDuplicate Handling\u003c/span\u003e \u003ca href=\"#duplicate-handling\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen multiple headings have the same text, numbers are appended:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## FAQ\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## FAQ\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## FAQ\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;faq\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eFAQ\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;faq-1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eFAQ\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;faq-2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eFAQ\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"custom-ids\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom IDs\u003c/span\u003e \u003ca href=\"#custom-ids\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOverride the auto-generated ID with custom syntax:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## My Section {#custom-id}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Installation Guide {#install}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Frequently Asked Questions {#faq-section}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;custom-id\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eMy Section\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;install\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eInstallation Guide\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;faq-section\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eFrequently Asked Questions\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"anchor-links\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAnchor Links\u003c/span\u003e \u003ca href=\"#anchor-links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go can add clickable anchor links to headings:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;my-section\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  My Section\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#my-section\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;heading-anchor\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e#\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eConfigure anchor link appearance:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eanchors\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eposition\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;end\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# \u0026#34;start\u0026#34; or \u0026#34;end\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esymbol\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#\u0026#34;\u003c/span\u003e        \u003cspan class=\"c\"\u003e# or \u0026#34;link\u0026#34;, \u0026#34;paragraph\u0026#34;, etc.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"linking-to-headings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLinking to Headings\u003c/span\u003e \u003ca href=\"#linking-to-headings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eLink to headings using their IDs:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSee [\u003cspan class=\"nt\"\u003ethe installation section\u003c/span\u003e](\u003cspan class=\"na\"\u003e#installation\u003c/span\u003e) for setup instructions.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJump to [\u003cspan class=\"nt\"\u003eFAQ\u003c/span\u003e](\u003cspan class=\"na\"\u003e#faq\u003c/span\u003e) for common questions.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr use wikilinks with section anchors:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSee [[getting-started\u003cspan class=\"ni\"\u003e#installation\u003c/span\u003e]] for setup.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"footnotes-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFootnotes\u003c/span\u003e \u003ca href=\"#footnotes-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFootnotes let you add references without interrupting the flow of your content.\u003c/p\u003e\n\u003ch3 id=\"basic-syntax-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Syntax\u003c/span\u003e \u003ca href=\"#basic-syntax-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHere\u0026#39;s a sentence with a footnote.[^1]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAnother sentence with a named footnote.[^note]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[^1]: This is the first footnote content.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[^note]: This is a named footnote. It can be referenced\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    multiple times and span multiple lines.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    It can even contain multiple paragraphs.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eHere\u0026rsquo;s a sentence with a footnote.\u003csup id=\"fnref:2\"\u003e\u003ca href=\"#fn:2\" class=\"footnote-ref\" role=\"doc-noteref\"\u003e2\u003c/a\u003e\u003c/sup\u003e\u003c/p\u003e\n\u003cp\u003eAnother sentence with a named footnote.\u003csup id=\"fnref:3\"\u003e\u003ca href=\"#fn:3\" class=\"footnote-ref\" role=\"doc-noteref\"\u003e3\u003c/a\u003e\u003c/sup\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eHere\u0026#39;s a sentence with a footnote.\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esup\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;fnref:1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#fn:1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e1\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esup\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAnother sentence with a named footnote.\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esup\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;fnref:note\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#fn:note\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e2\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esup\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;footnotes\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eol\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;fn:1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eThis is the first footnote content. \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#fnref:1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"ni\"\u003e\u0026amp;#8617;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;fn:note\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eThis is a named footnote. It can be referenced\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      multiple times and span multiple lines.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eIt can even contain multiple paragraphs. \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#fnref:note\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"ni\"\u003e\u0026amp;#8617;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eol\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"inline-footnotes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInline Footnotes\u003c/span\u003e \u003ca href=\"#inline-footnotes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor short notes, use inline syntax:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHere\u0026#39;s an inline footnote.^[This is the footnote content inline.]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLive example:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eHere\u0026rsquo;s an inline footnote.^[This is the footnote content inline.]\u003c/p\u003e\n\u003ch3 id=\"footnote-best-practices\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFootnote Best Practices\u003c/span\u003e \u003ca href=\"#footnote-best-practices\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003ePlacement\u003c/strong\u003e: Footnote definitions can be anywhere in the document, but are typically placed at the end.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eNaming\u003c/strong\u003e: Use descriptive names for complex documents:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[^citation-smith-2024]: Smith, J. (2024). \u003cspan class=\"ge\"\u003e*The Article*\u003c/span\u003e. Journal.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[^definition-ssr]: Server-Side Rendering: Generating HTML on the server.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eMulti-paragraph footnotes\u003c/strong\u003e: Indent continuation lines with 4 spaces:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[^long-note]: First paragraph of the footnote.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Second paragraph must be indented.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Third paragraph too.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[[templates-guide|Templates]] - Using TOC and content in templates\u003c/li\u003e\n\u003cli\u003e[[advanced-usage|Advanced Usage]] - Advanced admonition customization\u003c/li\u003e\n\u003cli\u003e[[dynamic-content|Dynamic Content]] - Using Jinja in Markdown\u003c/li\u003e\n\u003cli\u003e[[frontmatter-guide|Frontmatter]] - Frontmatter fields and metadata\u003c/li\u003e\n\u003cli\u003e[[configuration-guide|Configuration]] - Markdown configuration options\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"image-zoom-lightbox\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eImage Zoom / Lightbox\u003c/span\u003e \u003ca href=\"#image-zoom-lightbox\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go supports optional image zoom functionality using GLightbox. When enabled, users can click/tap images to view them in a full-screen lightbox with support for mobile gestures, keyboard navigation, and gallery mode.\u003c/p\u003e\n\u003ch3 id=\"enabling-image-zoom\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnabling Image Zoom\u003c/span\u003e \u003ca href=\"#enabling-image-zoom\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eImage zoom is disabled by default. Enable it in your \u003ccode\u003emarkata-go.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eimage_zoom\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"marking-individual-images\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMarking Individual Images\u003c/span\u003e \u003ca href=\"#marking-individual-images\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse the \u003ccode\u003e{data-zoomable}\u003c/code\u003e attribute marker to make specific images zoomable:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eBeautiful sunset {data-zoomable}\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/sunset.jpg\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003eRegular image without zoom\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/icon.png\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/sunset.jpg\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;glightbox-link\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/sunset.jpg\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Beautiful sunset\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;glightbox\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;1200\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;675\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003edata-glightbox\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;description: Beautiful sunset\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/images/icon.png\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Regular image without zoom\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe first image will open in a lightbox when clicked. The second remains a regular image.\u003c/p\u003e\n\u003ch3 id=\"alternative-class-marker\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAlternative: Class Marker\u003c/span\u003e \u003ca href=\"#alternative-class-marker\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eYou can also use the \u003ccode\u003e{.zoomable}\u003c/code\u003e class marker:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003ePhoto {.zoomable}\u003c/span\u003e](\u003cspan class=\"na\"\u003e/images/photo.jpg\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"enable-for-all-images-in-a-post\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnable for All Images in a Post\u003c/span\u003e \u003ca href=\"#enable-for-all-images-in-a-post\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd \u003ccode\u003eimage_zoom: true\u003c/code\u003e to your frontmatter to enable zoom for all images in that post:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Photo Gallery\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eimage_zoom\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003eFirst photo](/images/photo1.jpg)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003eSecond photo](/images/photo2.jpg)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e!\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003eThird photo](/images/photo3.jpg)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAll three images will be zoomable without needing individual markers.\u003c/p\u003e\n\u003ch3 id=\"enable-for-all-images-site-wide\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnable for All Images Site-Wide\u003c/span\u003e \u003ca href=\"#enable-for-all-images-site-wide\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTo make all images zoomable by default across your entire site:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eimage_zoom\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_all_images\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"configuration-options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration Options\u003c/span\u003e \u003ca href=\"#configuration-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eimage_zoom\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e           \u003cspan class=\"c\"\u003e# Enable the plugin (default: false)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elibrary\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;glightbox\u0026#34;\u003c/span\u003e     \u003cspan class=\"c\"\u003e# Lightbox library (currently only glightbox supported)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eselector\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.glightbox\u0026#34;\u003c/span\u003e   \u003cspan class=\"c\"\u003e# CSS selector for zoomable images\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecdn\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                \u003cspan class=\"c\"\u003e# Use CDN for library files (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_all_images\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e   \u003cspan class=\"c\"\u003e# Make all images zoomable (default: false)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# GLightbox-specific options\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eopen_effect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;zoom\u0026#34;\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Effect when opening: \u0026#34;zoom\u0026#34;, \u0026#34;fade\u0026#34;, \u0026#34;none\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eclose_effect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;zoom\u0026#34;\u003c/span\u003e     \u003cspan class=\"c\"\u003e# Effect when closing: \u0026#34;zoom\u0026#34;, \u0026#34;fade\u0026#34;, \u0026#34;none\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslide_effect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;slide\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Effect when sliding: \u0026#34;slide\u0026#34;, \u0026#34;fade\u0026#34;, \u0026#34;zoom\u0026#34;, \u0026#34;none\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etouch_navigation\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e   \u003cspan class=\"c\"\u003e# Enable touch/swipe gestures\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eloop\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Loop through images in gallery\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edraggable\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Enable dragging images to navigate\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"keyboard-navigation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKeyboard Navigation\u003c/span\u003e \u003ca href=\"#keyboard-navigation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen the lightbox is open:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eKey\u003c/th\u003e\n\u003cth\u003eAction\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eEscape\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eClose the lightbox\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e→\u003c/code\u003e / \u003ccode\u003eRight Arrow\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNext image (in gallery)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e←\u003c/code\u003e / \u003ccode\u003eLeft Arrow\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePrevious image (in gallery)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"mobile-gestures\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMobile Gestures\u003c/span\u003e \u003ca href=\"#mobile-gestures\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOn touch devices:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eGesture\u003c/th\u003e\n\u003cth\u003eAction\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eSwipe left/right\u003c/td\u003e\n\u003ctd\u003eNavigate between images\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePinch\u003c/td\u003e\n\u003ctd\u003eZoom in/out\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDrag\u003c/td\u003e\n\u003ctd\u003ePan zoomed image\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTap outside\u003c/td\u003e\n\u003ctd\u003eClose lightbox\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"image-galleries\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eImage Galleries\u003c/span\u003e \u003ca href=\"#image-galleries\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eImages marked as zoomable within the same post automatically form a gallery. Users can navigate between them using arrow keys or swipe gestures.\u003c/p\u003e\n\u003ch3 id=\"css-customization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCSS Customization\u003c/span\u003e \u003ca href=\"#css-customization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eStyle the lightbox links with CSS:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Style the zoomable image wrapper */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eglightbox-link\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003einline-block\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ecursor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ezoom-in\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Add hover effect */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eglightbox-link\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003ehover\u003c/span\u003e \u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eopacity\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.9\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003etransform\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003escale\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mf\"\u003e1.02\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003etransition\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eall\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.2\u003c/span\u003e\u003cspan class=\"kt\"\u003es\u003c/span\u003e \u003cspan class=\"kc\"\u003eease\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Style for zoomable images */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eglightbox\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ecursor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ezoom-in\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"performance-notes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePerformance Notes\u003c/span\u003e \u003ca href=\"#performance-notes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eJavaScript and CSS for GLightbox are only loaded on pages that have zoomable images\u003c/li\u003e\n\u003cli\u003eWhen using CDN (default), files are loaded from jsDelivr\u003c/li\u003e\n\u003cli\u003eThe library is ~11KB gzipped, loaded asynchronously\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"footnotes\" role=\"doc-endnotes\"\u003e\n\u003chr\u003e\n\u003col\u003e\n\u003cli id=\"fn:1\"\u003e\n\u003cp\u003eFootnotes are automatically collected and placed at the end of the document with backlinks for easy navigation.\u0026#160;\u003ca href=\"#fnref:1\" class=\"footnote-backref\" role=\"doc-backlink\"\u003e\u0026#x21a9;\u0026#xfe0e;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli id=\"fn:2\"\u003e\n\u003cp\u003eThis is the first footnote content.\u0026#160;\u003ca href=\"#fnref:2\" class=\"footnote-backref\" role=\"doc-backlink\"\u003e\u0026#x21a9;\u0026#xfe0e;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli id=\"fn:3\"\u003e\n\u003cp\u003eThis is a named footnote. It can be referenced\nmultiple times and span multiple lines.\u003c/p\u003e\n\u003cp\u003eIt can even contain multiple paragraphs.\u0026#160;\u003ca href=\"#fnref:3\" class=\"footnote-backref\" role=\"doc-backlink\"\u003e\u0026#x21a9;\u0026#xfe0e;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/div\u003e\n",
      "content_text": "\n\nmarkata-go supports standard Markdown (CommonMark), GitHub Flavored Markdown (GFM) extensions, and several powerful additions like admonitions, wikilinks, and automatic table of contents generation. This guide covers everything you need to know about writing content in markata-go.\n\n## Table of Contents\n\n- [Basic Markdown](#basic-markdown)\n- [Extended Markdown (GFM)](#extended-markdown-gfm)\n- [Code Blocks](#code-blocks)\n- [Attribute Syntax](#attribute-syntax)\n- [Admonitions](#admonitions)\n- [Wikilinks](#wikilinks)\n- [Hover Cards](#hover-cards)\n- [Table of Contents](#table-of-contents)\n- [Heading Anchors](#heading-anchors)\n- [Footnotes](#footnotes)\n- [Lucide icons](/docs/guides/icons/) - inline SVG icons, centered icon cards, and feature rows\n- [Native Markdown tabs](/docs/guides/markdown-containers/#native-tabs-no-web-awesome-required) - tabbed code and install instructions\n- [Rich Markdown layouts](/docs/guides/markdown-containers/) - responsive cards, grids, and diagrams\n- [Roads](/docs/guides/roads/) - scroll-drawn timelines and roadmaps (separate guide)\n\n\n---\n\nvideo\n\n![kickflip down the 3 stair - fingerboarding](https://dropper.waylonwalker.com/file/6f042a91-1e90-445d-b91d-8d4ee187af2c.mp4)\n\nimage\n\n![](https://dropper.waylonwalker.com/file/1b7f257c-5193-4b74-b768-2fa4a7ccdec8.webp)\n\n## Basic Markdown\n\nmarkata-go supports all standard Markdown syntax as defined by CommonMark.\n\n### Headings\n\nUse `#` characters to create headings (levels 1-6):\n\n**Input:**\n\n```markdown\n# Heading 1\n## Heading 2\n### Heading 3\n#### Heading 4\n##### Heading 5\n###### Heading 6\n```\n\n**Output:**\n\n```html\n\u003ch1\u003eHeading 1\u003c/h1\u003e\n\u003ch2\u003eHeading 2\u003c/h2\u003e\n\u003ch3\u003eHeading 3\u003c/h3\u003e\n\u003ch4\u003eHeading 4\u003c/h4\u003e\n\u003ch5\u003eHeading 5\u003c/h5\u003e\n\u003ch6\u003eHeading 6\u003c/h6\u003e\n```\n\n!!! warning \"Avoid H1 in Content\"\n\n    **Don't use H1 (`#`) headings in your markdown content.** Templates automatically generate an H1 from your frontmatter `title`, so using H1 in content creates duplicate H1 tags.\n\n    This harms:\n    - **SEO** - Search engines expect one H1 per page\n    - **Accessibility** - Screen readers use H1 for page identification\n\n    **Start your content with H2 (`##`) or deeper:**\n\n    ```markdown\n    ---\n    title: My Page Title  # This becomes the H1\n    ---\n\n    ## First Section       # Start with H2\n\n    Content here...\n    ```\n\n    The linter will warn you if H1 headings are detected in content.\n\n#### Expressive headings\n\nHeadings and frontmatter titles use ordinary semantic Markdown inline elements.\nThe active theme and font pack choose how strongly they are presented in H1 and\nH2 headings:\n\n```yaml\n---\ntitle: \"Good themes make **good places** to ==think.==\"\n---\n```\n\n```markdown\n## A **good theme** makes _quiet words_, `technical words`, and ==loud words== work together.\n\n## Make a ~~perfect~~ memorable site.\n```\n\nThis supports strong, emphasis, mark, code, links, superscript, subscript, and GFM strikethrough,\nincluding nested forms such as `==**strange little ideas.**==`. These are\nsemantic elements rather than a separate heading syntax. Visible headings keep\ntheir rich semantics, while browser titles, feeds, search, and social metadata\nuse the readable plain-text title. This behavior is intended to match\n[Plaindown](https://git.waylonwalker.com/waylon/md.waylonwalker.com).\n\nHighlighted headings keep the same markup on cold and warm builds, including\nafter adding an unrelated post. Cached Markdown output is reused without\nadding another highlight wrapper. Upgrading from the duplicate-wrapper bug\nrefreshes affected pages and their dependent output automatically, without\nforcing unrelated posts to rebuild. Later builds reuse the refreshed pages.\nYou do not need to delete caches or refetch external assets.\n\n### Paragraphs\n\nParagraphs are separated by blank lines:\n\n**Input:**\n\n```markdown\nThis is the first paragraph. It can span\nmultiple lines in the source.\n\nThis is the second paragraph.\n```\n\n**Live example:**\n\nThis is the first paragraph. It can span\nmultiple lines in the source.\n\nThis is the second paragraph.\n\n**Output:**\n\n```html\n\u003cp\u003eThis is the first paragraph. It can span\nmultiple lines in the source.\u003c/p\u003e\n\n\u003cp\u003eThis is the second paragraph.\u003c/p\u003e\n```\n\n### Emphasis and Strong\n\n**Input:**\n\n```markdown\n*Italic text* or _italic text_\n\n**Bold text** or __bold text__\n\n***Bold and italic*** or ___bold and italic___\n```\n\n**Live example:**\n\n*Italic text* or _italic text_\n\n**Bold text** or __bold text__\n\n***Bold and italic*** or ___bold and italic___\n\n**Output:**\n\n```html\n\u003cp\u003e\u003cem\u003eItalic text\u003c/em\u003e or \u003cem\u003eitalic text\u003c/em\u003e\u003c/p\u003e\n\n\u003cp\u003e\u003cstrong\u003eBold text\u003c/strong\u003e or \u003cstrong\u003ebold text\u003c/strong\u003e\u003c/p\u003e\n\n\u003cp\u003e\u003cstrong\u003e\u003cem\u003eBold and italic\u003c/em\u003e\u003c/strong\u003e or \u003cstrong\u003e\u003cem\u003ebold and italic\u003c/em\u003e\u003c/strong\u003e\u003c/p\u003e\n```\n\n### Links\n\n**Input:**\n\n```markdown\n[Link text](https://example.com)\n\n[Link with title](https://example.com \"Example Site\")\n\n\u003chttps://example.com\u003e\n\n[Reference link][ref]\n\n[ref]: https://example.com\n```\n\n**Live example:**\n\n[Link text](https://example.com)\n\n[Link with title](https://example.com \"Example Site\")\n\n\u003chttps://example.com\u003e\n\n[Reference link][ref]\n\n[ref]: https://example.com\n\n**Output:**\n\n```html\n\u003cp\u003e\u003ca href=\"https://example.com\"\u003eLink text\u003c/a\u003e\u003c/p\u003e\n\n\u003cp\u003e\u003ca href=\"https://example.com\" title=\"Example Site\"\u003eLink with title\u003c/a\u003e\u003c/p\u003e\n\n\u003cp\u003e\u003ca href=\"https://example.com\"\u003ehttps://example.com\u003c/a\u003e\u003c/p\u003e\n\n\u003cp\u003e\u003ca href=\"https://example.com\"\u003eReference link\u003c/a\u003e\u003c/p\u003e\n```\n\n### Images\n\n**Input:**\n\n```markdown\n![Alt text](/images/photo.jpg)\n\n![Alt text](/images/photo.jpg \"Image title\")\n\n[![Clickable image](/images/photo.jpg)](https://example.com)\n```\n\n**Output:**\n\n```html\n\u003cp\u003e\u003cimg src=\"/images/photo.jpg\" alt=\"Alt text\"\u003e\u003c/p\u003e\n\n\u003cp\u003e\u003cimg src=\"/images/photo.jpg\" alt=\"Alt text\" title=\"Image title\"\u003e\u003c/p\u003e\n\n\u003cp\u003e\u003ca href=\"https://example.com\"\u003e\u003cimg src=\"/images/photo.jpg\" alt=\"Clickable image\"\u003e\u003c/a\u003e\u003c/p\u003e\n```\n\n### Unordered Lists\n\n**Input:**\n\n```markdown\n- Item one\n- Item two\n  - Nested item\n  - Another nested item\n- Item three\n\n* Also works with asterisks\n* Like this\n```\n\n**Live example:**\n\n- Item one\n- Item two\n  - Nested item\n  - Another nested item\n- Item three\n\n* Also works with asterisks\n* Like this\n\n**Output:**\n\n```html\n\u003cul\u003e\n  \u003cli\u003eItem one\u003c/li\u003e\n  \u003cli\u003eItem two\n    \u003cul\u003e\n      \u003cli\u003eNested item\u003c/li\u003e\n      \u003cli\u003eAnother nested item\u003c/li\u003e\n    \u003c/ul\u003e\n  \u003c/li\u003e\n  \u003cli\u003eItem three\u003c/li\u003e\n\u003c/ul\u003e\n```\n\n### Ordered Lists\n\n**Input:**\n\n```markdown\n1. First item\n2. Second item\n   1. Nested numbered item\n   2. Another nested item\n3. Third item\n\n1. Numbers don't have to be sequential\n1. Markdown will number them correctly\n1. This becomes 3\n```\n\n**Live example:**\n\n1. First item\n2. Second item\n   1. Nested numbered item\n   2. Another nested item\n3. Third item\n\n1. Numbers don't have to be sequential\n1. Markdown will number them correctly\n1. This becomes 3\n\n**Output:**\n\n```html\n\u003col\u003e\n  \u003cli\u003eFirst item\u003c/li\u003e\n  \u003cli\u003eSecond item\n    \u003col\u003e\n      \u003cli\u003eNested numbered item\u003c/li\u003e\n      \u003cli\u003eAnother nested item\u003c/li\u003e\n    \u003c/ol\u003e\n  \u003c/li\u003e\n  \u003cli\u003eThird item\u003c/li\u003e\n\u003c/ol\u003e\n```\n\n### Blockquotes\n\n**Input:**\n\n```markdown\n\u003e This is a blockquote.\n\u003e It can span multiple lines.\n\n\u003e Blockquotes can be nested.\n\u003e\n\u003e \u003e Like this inner quote.\n\n\u003e Blockquotes can contain **other** *Markdown* elements.\n\u003e\n\u003e - Including lists\n\u003e - Like this\n```\n\n**Live examples:**\n\n\u003e This is a blockquote.\n\u003e It can span multiple lines.\n\n\u003e Blockquotes can be nested.\n\u003e\n\u003e \u003e Like this inner quote.\n\n\u003e Blockquotes can contain **other** *Markdown* elements.\n\u003e\n\u003e - Including lists\n\u003e - Like this\n\n**Output:**\n\n```html\n\u003cblockquote\u003e\n  \u003cp\u003eThis is a blockquote.\n  It can span multiple lines.\u003c/p\u003e\n\u003c/blockquote\u003e\n\n\u003cblockquote\u003e\n  \u003cp\u003eBlockquotes can be nested.\u003c/p\u003e\n  \u003cblockquote\u003e\n    \u003cp\u003eLike this inner quote.\u003c/p\u003e\n  \u003c/blockquote\u003e\n\u003c/blockquote\u003e\n```\n\n### Inline Code\n\n**Input:**\n\n```markdown\nUse `backticks` for inline code.\n\nUse `` `backticks` `` to show literal backticks.\n\nThe `fmt.Println()` function prints to stdout.\n```\n\n**Live example:**\n\nUse `backticks` for inline code.\n\nUse `` `backticks` `` to show literal backticks.\n\nThe `fmt.Println()` function prints to stdout.\n\n**Output:**\n\n```html\n\u003cp\u003eUse \u003ccode\u003ebackticks\u003c/code\u003e for inline code.\u003c/p\u003e\n\n\u003cp\u003eUse \u003ccode\u003e`backticks`\u003c/code\u003e to show literal backticks.\u003c/p\u003e\n\n\u003cp\u003eThe \u003ccode\u003efmt.Println()\u003c/code\u003e function prints to stdout.\u003c/p\u003e\n```\n\n### Horizontal Rules\n\n**Input:**\n\n```markdown\nContent above\n\n---\n\nContent below\n\n***\n\nAlso works with asterisks\n\n___\n\nAnd underscores\n```\n\n**Live example:**\n\nContent above\n\n---\n\nContent below\n\n***\n\nAlso works with asterisks\n\n___\n\nAnd underscores\n\n**Output:**\n\n```html\n\u003cp\u003eContent above\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eContent below\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eAlso works with asterisks\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eAnd underscores\u003c/p\u003e\n```\n\n---\n\n## Extended Markdown (GFM)\n\nmarkata-go supports GitHub Flavored Markdown extensions.\n\n### Tables\n\nTables use pipes (`|`) and hyphens (`-`) to define structure. Use colons (`:`) for alignment.\n\nTables with a header row are sortable in rendered posts. Activate a column by\nselecting its header; select it again to reverse the order. Text sorts naturally,\nnumeric values sort numerically, and empty cells stay at the end. The sorting\ncontrols are keyboard accessible. The small sorting script is loaded only on\npages that contain a header table.\n\n**Input:**\n\n```markdown\n| Feature      | Status      | Notes                    |\n|--------------|:-----------:|-------------------------:|\n| Tables       | Supported   | Left-aligned by default  |\n| Alignment    | Supported   | Center with `:`          |\n| Right align  | Supported   | Colon on right           |\n```\n\n**Live example:**\n\n| Feature      | Status      | Notes                    |\n|--------------|:-----------:|-------------------------:|\n| Tables       | Supported   | Left-aligned by default  |\n| Alignment    | Supported   | Center with `:`          |\n| Right align  | Supported   | Colon on right           |\n\n**Output:**\n\n```html\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003eFeature\u003c/th\u003e\n      \u003cth style=\"text-align: center\"\u003eStatus\u003c/th\u003e\n      \u003cth style=\"text-align: right\"\u003eNotes\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eTables\u003c/td\u003e\n      \u003ctd style=\"text-align: center\"\u003eSupported\u003c/td\u003e\n      \u003ctd style=\"text-align: right\"\u003eLeft-aligned by default\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eAlignment\u003c/td\u003e\n      \u003ctd style=\"text-align: center\"\u003eSupported\u003c/td\u003e\n      \u003ctd style=\"text-align: right\"\u003eCenter with \u003ccode\u003e:\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eRight align\u003c/td\u003e\n      \u003ctd style=\"text-align: center\"\u003eSupported\u003c/td\u003e\n      \u003ctd style=\"text-align: right\"\u003eColon on right\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n```\n\n**Alignment reference:**\n\n| Syntax | Alignment |\n|--------|-----------|\n| `\\|---\\|` | Left (default) |\n| `\\|:---\\|` | Left (explicit) |\n| `\\|:---:\\|` | Center |\n| `\\|---:\\|` | Right |\n\n### Strikethrough\n\n**Input:**\n\n```markdown\n~~This text is struck through~~\n\nUse strikethrough for ~~old information~~ corrections.\n```\n\n**Live example:**\n\n~~This text is struck through~~\n\nUse strikethrough for ~~old information~~ corrections.\n\n**Output:**\n\n```html\n\u003cp\u003e\u003cdel\u003eThis text is struck through\u003c/del\u003e\u003c/p\u003e\n\n\u003cp\u003eUse strikethrough for \u003cdel\u003eold information\u003c/del\u003e corrections.\u003c/p\u003e\n```\n\n### Task Lists\n\n**Input:**\n\n```markdown\n- [x] Completed task\n- [x] Another completed task\n- [ ] Incomplete task\n- [ ] Another incomplete task\n  - [x] Nested completed\n  - [ ] Nested incomplete\n```\n\n**Live example:**\n\n- [x] Completed task\n- [x] Another completed task\n- [ ] Incomplete task\n- [ ] Another incomplete task\n  - [x] Nested completed\n  - [ ] Nested incomplete\n\n**Output:**\n\n```html\n\u003cul class=\"task-list\"\u003e\n  \u003cli class=\"task-list-item\"\u003e\n    \u003cinput type=\"checkbox\" checked disabled\u003e Completed task\n  \u003c/li\u003e\n  \u003cli class=\"task-list-item\"\u003e\n    \u003cinput type=\"checkbox\" checked disabled\u003e Another completed task\n  \u003c/li\u003e\n  \u003cli class=\"task-list-item\"\u003e\n    \u003cinput type=\"checkbox\" disabled\u003e Incomplete task\n  \u003c/li\u003e\n  \u003cli class=\"task-list-item\"\u003e\n    \u003cinput type=\"checkbox\" disabled\u003e Another incomplete task\n    \u003cul class=\"task-list\"\u003e\n      \u003cli class=\"task-list-item\"\u003e\n        \u003cinput type=\"checkbox\" checked disabled\u003e Nested completed\n      \u003c/li\u003e\n      \u003cli class=\"task-list-item\"\u003e\n        \u003cinput type=\"checkbox\" disabled\u003e Nested incomplete\n      \u003c/li\u003e\n    \u003c/ul\u003e\n  \u003c/li\u003e\n\u003c/ul\u003e\n```\n\n### Autolinks\n\nURLs and email addresses are automatically converted to links:\n\n**Input:**\n\n```markdown\nVisit https://example.com for more info.\n\nContact us at support@example.com.\n\nwww.example.com also works.\n```\n\n**Live example:**\n\nVisit https://example.com for more info.\n\nContact us at support@example.com.\n\nwww.example.com also works.\n\n**Output:**\n\n```html\n\u003cp\u003eVisit \u003ca href=\"https://example.com\"\u003ehttps://example.com\u003c/a\u003e for more info.\u003c/p\u003e\n\n\u003cp\u003eContact us at \u003ca href=\"mailto:support@example.com\"\u003esupport@example.com\u003c/a\u003e.\u003c/p\u003e\n\n\u003cp\u003e\u003ca href=\"http://www.example.com\"\u003ewww.example.com\u003c/a\u003e also works.\u003c/p\u003e\n```\n\n---\n\n## Smart Quotes (Typographer)\n\nmarkata-go automatically converts straight quotes and punctuation to their typographic (curly) equivalents:\n\n| Input | Output | Description |\n|-------|--------|-------------|\n| `\"Hello\"` | `\"Hello\"` | Double curly quotes |\n| `'Hello'` | `'Hello'` | Single curly quotes |\n| `It's` | `It's` | Apostrophe |\n| `9--5` | `9–5` | En dash |\n| `hello---world` | `hello—world` | Em dash |\n| `wait...` | `wait…` | Ellipsis |\n\n**Live example:**\n\n\"This sentence uses smart quotes.\" It's automatic—you don't need to do anything special. Just write normally and markata-go handles the conversion.\n\nUse en dashes for ranges like 9–5, and em dashes for breaks in thought—like this. Ellipses work too…\n\n**Disabling:**\n\nTo disable smart quotes (use straight quotes instead):\n\n```toml\n[markdown.extensions]\ntypographer = false\n```\n\n---\n\n## Definition Lists\n\nCreate definition lists (glossary-style terms and definitions) using PHP Markdown Extra syntax:\n\n**Input:**\n\n```markdown\nTerm 1\n:   Definition of the first term.\n\nTerm 2\n:   First definition of the second term.\n:   Second definition of the second term.\n```\n\n**Live example:**\n\nHTML\n:   HyperText Markup Language - the standard markup language for documents designed to be displayed in a web browser.\n\nCSS\n:   Cascading Style Sheets - a style sheet language used for describing the presentation of a document.\n:   Can also refer to Content Scramble System (in different contexts).\n\n**Output:**\n\n```html\n\u003cdl\u003e\n  \u003cdt\u003eTerm 1\u003c/dt\u003e\n  \u003cdd\u003eDefinition of the first term.\u003c/dd\u003e\n\n  \u003cdt\u003eTerm 2\u003c/dt\u003e\n  \u003cdd\u003eFirst definition of the second term.\u003c/dd\u003e\n  \u003cdd\u003eSecond definition of the second term.\u003c/dd\u003e\n\u003c/dl\u003e\n```\n\n**Use cases:**\n- Glossaries and terminology lists\n- FAQ sections (question as term, answer as definition)\n- Key-value documentation\n- API parameter descriptions\n\n**Disabling:**\n\n```toml\n[markdown.extensions]\ndefinition_list = false\n```\n\n---\n\n## Footnotes\n\nAdd footnotes to your content using PHP Markdown Extra syntax:\n\n**Input:**\n\n```markdown\nHere's a sentence that needs a citation.[^1]\n\n[^1]: This is the footnote content that appears at the bottom of the document.\n```\n\n**Live example:**\n\nmarkata-go supports footnotes for academic writing and citations.[^footnote-demo]\n\n[^footnote-demo]: Footnotes are automatically collected and placed at the end of the document with backlinks for easy navigation.\n\n**Output:**\n\n```html\n\u003cp\u003eHere's a sentence that needs a citation.\u003csup\u003e\u003ca href=\"#fn:1\"\u003e1\u003c/a\u003e\u003c/sup\u003e\u003c/p\u003e\n\n\u003c!-- Later in the document --\u003e\n\u003csection class=\"footnotes\"\u003e\n  \u003col\u003e\n    \u003cli id=\"fn:1\"\u003e\n      \u003cp\u003eThis is the footnote content. \u003ca href=\"#fnref:1\"\u003e↩\u003c/a\u003e\u003c/p\u003e\n    \u003c/li\u003e\n  \u003c/ol\u003e\n\u003c/section\u003e\n```\n\n**Multiple footnotes:**\n\n```markdown\nFirst citation.[^1] Second citation.[^2] Reuse first.[^1]\n\n[^1]: First footnote content.\n[^2]: Second footnote content.\n```\n\n**Best practices:**\n- Keep footnotes brief and focused\n- Use descriptive reference labels (e.g., `[^smith-2020]` instead of `[^1]`) for maintainability\n- Place all footnote definitions at the end of your document\n\n**Disabling:**\n\n```toml\n[markdown.extensions]\nfootnote = false\n```\n\n---\n\n## CJK Line Breaks\n\nEnable proper line breaking for Chinese, Japanese, and Korean (CJK) text. Without this extension, CJK characters may wrap awkwardly in the middle of words.\n\n**Input:**\n\n```markdown\nこれはテストです。これはテストです。\n这是一段中文测试文本。\n```\n\n**Output:**\n\n```html\n\u003cp\u003eこれはテストです。\u003cbr\u003eこれはテストです。\u003c/p\u003e\n\u003cp\u003e这是一段中文测试文本。\u003c/p\u003e\n```\n\n**Configuration:**\n\n```toml\n[markdown.extensions]\ncjk = true  # default: true\n```\n\n---\n\n## Figures\n\nAutomatically convert images with following paragraphs into HTML `\u003cfigure\u003e` elements with `\u003cfigcaption\u003e`. A single-paragraph blockquote immediately after an image is also treated as caption content, which is useful when the caption should read as quoted text.\n\n**Input:**\n\n```markdown\n![Alt text](image.jpg)\nThis is the caption for the figure.\n```\n\n```markdown\n![Alt text](image.jpg)\n\u003e This quoted line also becomes the figure caption.\n```\n\n**Output:**\n\n```html\n\u003cfigure\u003e\n  \u003cimg src=\"image.jpg\" alt=\"Alt text\"\u003e\n  \u003cfigcaption\u003eThis is the caption for the figure.\u003c/figcaption\u003e\n\u003c/figure\u003e\n```\n\n**Use cases:**\n- Image galleries with captions\n- Charts and diagrams with descriptions\n- Photos with credits or descriptions\n\n**Configuration:**\n\n```toml\n[markdown.extensions]\nfigure = true  # default: true\n```\n\n---\n\n## Blockquote Attribution\n\nAutomatically convert blockquotes followed by attribution text into HTML `\u003cfigure class=\"quote\"\u003e` elements with `\u003cfigcaption\u003e`. The attribution text must directly follow the blockquote with no blank line between them.\n\n**Input:**\n\n```markdown\n\u003e Design is not just what it looks like and feels like.\n\u003e Design is how it works.\nSteve Jobs\n```\n\n```markdown\n\u003e The only way to do great work is to love what you do.\n@stevejobs\n```\n\n```markdown\n\u003e Stay hungry, stay foolish.\n[[Steve Jobs]]\n```\n\n```markdown\n\u003e Innovation distinguishes between a leader and a follower.\n[Steve Jobs](/authors/steve-jobs)\n```\n\n**Output:**\n\n```html\n\u003cfigure class=\"quote\"\u003e\n  \u003cblockquote\u003e\n    \u003cp\u003eDesign is not just what it looks like and feels like.\n       Design is how it works.\u003c/p\u003e\n  \u003c/blockquote\u003e\n  \u003cfigcaption\u003e\u0026mdash; Steve Jobs\u003c/figcaption\u003e\n\u003c/figure\u003e\n```\n\n**Use cases:**\n- Quotations with named attributions\n- Pull quotes with sources\n- Testimonials with author credits\n- Blockquotes with citation links\n\n---\n\n## Heading Anchors\n\nAdd clickable permalink anchors to all headings for easy deep-linking.\n\n**Input:**\n\n```markdown\n## My Heading\n```\n\n**Output:**\n\n```html\n\u003ch2 id=\"my-heading\"\u003eMy Heading \u003ca class=\"anchor\" href=\"#my-heading\"\u003e¶\u003c/a\u003e\u003c/h2\u003e\n```\n\nThe anchor appears on hover and uses your theme's color scheme.\n\nHeading IDs are generated from the heading's **visible text**, so link\ndestinations, emphasis markers and inline code never leak into the slug:\n\n```markdown\n## Recent [TIL](/til/)        → id=\"recent-til\"\n## Use `git stash`            → id=\"use-git-stash\"\n```\n\nExplicit IDs (`## Title {#custom-id}`) are always kept as written. Headings\nthat belong to embedded cards (for example from `render_feed`) are left alone.\n\n**Use cases:**\n- Documentation sites needing deep links\n- Easy sharing of specific sections\n- Table of contents linking\n\n**Configuration:**\n\n```toml\n[markdown.extensions]\nanchor = false  # default: false (use heading_anchors plugin instead)\n```\n\n---\n\n## Code Blocks\n\n### Code copy controls (progressive enhancement)\n\nOn pages containing code blocks, the default theme can add a compact **Copy**\nbutton, and a language label when the fence specifies a language. The controls\nreuse the existing palette-aware Chroma styling and don't require another\nhighlighter. Markata only loads the small enhancement script on code-bearing\npages; partial-page navigations initialize new blocks once, without duplicate\nbuttons. Mermaid diagrams are excluded.\n\nThe fenced source remains native `\u003cpre\u003e\u003ccode\u003e` HTML without JavaScript.\nClipboard actions require the browser's permission or a secure context; if\nautomatic copying isn't available, the control selects the code so readers can\ncopy it manually. Controls are omitted from copied rich post content.\n\n\n\nFenced code blocks support syntax highlighting for many languages.\n\n### Basic Code Block\n\n**Input:**\n\n````markdown\n```\nPlain code block without language\nNo syntax highlighting applied\n```\n````\n\n**Output:**\n\n```html\n\u003cpre\u003e\u003ccode\u003ePlain code block without language\nNo syntax highlighting applied\n\u003c/code\u003e\u003c/pre\u003e\n```\n\n### Syntax Highlighting\n\nSpecify the language after the opening fence for syntax highlighting:\n\n**Input:**\n\n````markdown\n```go\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n    fmt.Println(\"Hello, World!\")\n}\n```\n````\n\n**Output:**\n\n```html\n\u003cpre\u003e\u003ccode class=\"language-go\"\u003epackage main\n\nimport \"fmt\"\n\nfunc main() {\n    fmt.Println(\"Hello, World!\")\n}\n\u003c/code\u003e\u003c/pre\u003e\n```\n\nWith syntax highlighting enabled, the output includes highlight spans:\n\n```html\n\u003cpre\u003e\u003ccode class=\"language-go hljs\"\u003e\n\u003cspan class=\"hljs-keyword\"\u003epackage\u003c/span\u003e main\n\n\u003cspan class=\"hljs-keyword\"\u003eimport\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e\"fmt\"\u003c/span\u003e\n\n\u003cspan class=\"hljs-function\"\u003e\u003cspan class=\"hljs-keyword\"\u003efunc\u003c/span\u003e \u003cspan class=\"hljs-title\"\u003emain\u003c/span\u003e\u003cspan class=\"hljs-params\"\u003e()\u003c/span\u003e\u003c/span\u003e {\n    fmt.\u003cspan class=\"hljs-title function_\"\u003ePrintln\u003c/span\u003e(\u003cspan class=\"hljs-string\"\u003e\"Hello, World!\"\u003c/span\u003e)\n}\n\u003c/code\u003e\u003c/pre\u003e\n```\n\n### Supported Languages\n\nmarkata-go supports syntax highlighting for many languages including:\n\n| Category | Languages |\n|----------|-----------|\n| **Web** | html, css, javascript, typescript, jsx, tsx, json, xml |\n| **Backend** | go, python, ruby, java, c, cpp, rust, php |\n| **Shell** | bash, sh, zsh, powershell, shell |\n| **Data** | yaml, toml, ini, sql |\n| **Markup** | markdown, latex, tex |\n| **Config** | dockerfile, nginx, apache |\n| **Other** | diff, plaintext, text |\n\n### Configuration\n\nConfigure syntax highlighting in `markata-go.toml`:\n\n```toml\n[markata-go.markdown.highlight]\nenabled = true\ntheme = \"github-dark\"    # Chroma theme (optional)\nline_numbers = false     # Line numbers (if supported)\n```\n\n#### Automatic Theme from Palette\n\nBy default, syntax highlighting is **driven by your site's palette code colors**. This ensures code blocks match your site's overall look even when there is no exact Chroma theme match:\n\n```toml\n[markata-go.theme]\npalette = \"catppuccin-mocha\"\n```\n\nThe palette's `code-*` component roles control the generated CSS variables used by Chroma token classes:\n\n- `code-bg`\n- `code-text`\n- `code-comment`\n- `code-keyword`\n- `code-string`\n- `code-number`\n- `code-function`\n- `code-type`\n- `code-operator`\n\nIf you want a specific Chroma theme instead of palette-native colors, set `markdown.highlight.theme` explicitly.\n\n#### Explicit Override\n\nTo use a different code theme than your palette suggests:\n\n```toml\n[markata-go.theme]\npalette = \"catppuccin-mocha\"\n\n[markata-go.markdown.highlight]\ntheme = \"dracula\"  # Override: use Dracula instead of Catppuccin\n```\n\n#### Available Themes\n\nPopular themes include:\n\n| Theme | Description |\n|-------|-------------|\n| `github` / `github-dark` | Clean, neutral (default) |\n| `monokai` | Classic dark theme |\n| `dracula` | Vibrant dark theme |\n| `nord` | Arctic, blue-tinted |\n| `catppuccin-mocha` | Soothing pastel (dark) |\n| `catppuccin-latte` | Soothing pastel (light) |\n| `rose-pine` | Soho vibes |\n| `gruvbox` / `gruvbox-light` | Retro groove |\n| `tokyonight-night` | Tokyo city lights |\n| `solarized-dark` / `solarized-light` | Scientifically designed |\n\nSee the [Chroma Style Gallery](https://xyproto.github.io/splash/docs/) for all available themes.\n\n### Language Aliases\n\nCommon aliases are supported:\n\n| Alias | Language |\n|-------|----------|\n| `js` | javascript |\n| `ts` | typescript |\n| `py` | python |\n| `rb` | ruby |\n| `sh` | bash |\n| `yml` | yaml |\n| `md` | markdown |\n\n---\n\n## Attribute Syntax\n\nmarkata-go supports adding CSS classes, IDs, and other attributes to elements using the brace syntax `{...}`. This works for block-level elements (headings, paragraphs, blockquotes, lists, tables) and inline elements (images, links, emphasis, code, strikethrough).\n\n### Adding Classes to Images\n\nThe most common use case is adding CSS classes to images for styling:\n\n**Input:**\n\n```markdown\n![Beautiful sunset](sunset.webp){.more-cinematic}\n\n![Product photo](product.jpg){.shadow .rounded}\n```\n\n**Live example:**\n\n![Beautiful sunset](sunset.webp){.more-cinematic}\n\n**Output:**\n\n```html\n\u003cimg src=\"sunset.webp\" alt=\"Beautiful sunset\" class=\"more-cinematic\"\u003e\n\u003cimg src=\"product.jpg\" alt=\"Product photo\" class=\"shadow rounded\"\u003e\n```\n\n### Adding IDs to Images\n\nYou can also add IDs for JavaScript targeting or anchor links:\n\n**Input:**\n\n```markdown\n![Hero banner](hero.png){#hero-image}\n\n![Main product](product.webp){#featured-product .highlight}\n```\n\n**Output:**\n\n```html\n\u003cimg src=\"hero.png\" alt=\"Hero banner\" id=\"hero-image\"\u003e\n\u003cimg src=\"product.webp\" alt=\"Main product\" id=\"featured-product\" class=\"highlight\"\u003e\n```\n\n### Styling Links\n\nApply classes to links for custom styling:\n\n**Input:**\n\n```markdown\n[Read the documentation](https://example.com/docs){.button .primary}\n\n[External link](https://github.com){.external-link}\n```\n\n**Live example:**\n\n[Read the documentation](https://example.com/docs){.button .primary}\n\n[External link](https://github.com){.external-link}\n\n**Output:**\n\n```html\n\u003ca href=\"https://example.com/docs\" class=\"button primary\"\u003eRead the documentation\u003c/a\u003e\n\u003ca href=\"https://github.com\" class=\"external-link\"\u003eExternal link\u003c/a\u003e\n```\n\n### Styling Headings\n\nAdd classes or custom IDs to headings:\n\n**Input:**\n\n```markdown\n## Featured Section {.highlighted}\n\n## Installation {#install}\n\n## Important Notice {#notice .warning-header}\n```\n\n**Live example:**\n\n## Example Heading {.example-class}\n\n**Output:**\n\n```html\n\u003ch2 class=\"highlighted\" id=\"featured-section\"\u003eFeatured Section\u003c/h2\u003e\n\u003ch2 id=\"install\"\u003eInstallation\u003c/h2\u003e\n\u003ch2 id=\"notice\" class=\"warning-header\"\u003eImportant Notice\u003c/h2\u003e\n```\n\n### Styling Paragraphs and Block Elements\n\n**Input:**\n\n```markdown\nA short paragraph\n{.lead}\n\n\u003e A callout blockquote\n{.callout}\n\n- A list item\n  {.item}\n\n| Col |\n|---|\n| Cell {.cell} |\n```\n\n**Output:**\n\n```html\n\u003cp class=\"lead\"\u003eA short paragraph\u003c/p\u003e\n\u003cblockquote class=\"callout\"\u003e\n  \u003cp\u003eA callout blockquote\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cul\u003e\n  \u003cli class=\"item\"\u003eA list item\u003c/li\u003e\n\u003c/ul\u003e\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd class=\"cell\"\u003eCell\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n```\n\n### Styling Inline Text\n\n**Input:**\n\n```markdown\n*note*{.accent}\n\n`code`{.inline-code}\n\n~~deprecated~~{.deprecated}\n\n[[hello-world]]{.wikilink-pill}\n```\n\n**Output:**\n\n```html\n\u003cem class=\"accent\"\u003enote\u003c/em\u003e\n\u003ccode class=\"inline-code\"\u003ecode\u003c/code\u003e\n\u003cdel class=\"deprecated\"\u003edeprecated\u003c/del\u003e\n\u003ca href=\"/hello-world/\" class=\"wikilink wikilink-pill\"\u003eHello World\u003c/a\u003e\n```\n\n### Syntax Reference\n\n| Syntax | Description | Result |\n|--------|-------------|--------|\n| `{.classname}` | Single CSS class | `class=\"classname\"` |\n| `{.class1 .class2}` | Multiple classes | `class=\"class1 class2\"` |\n| `{#idname}` | ID attribute | `id=\"idname\"` |\n| `{#id .class}` | ID and class | `id=\"id\" class=\"class\"` |\n| `{data-attr=value}` | Custom attribute | `data-attr=\"value\"` |\n\n### Common Use Cases\n\n**Image galleries:**\n```markdown\n![Photo 1](photo1.jpg){.gallery-item .zoomable}\n![Photo 2](photo2.jpg){.gallery-item .zoomable}\n```\n\n**Call-to-action buttons:**\n```markdown\n[Get Started](signup){.cta-button .large}\n[Learn More](docs){.text-link .subtle}\n```\n\n**Responsive images:**\n```markdown\n![Hero image](hero.webp){.full-width .lazy-load}\n```\n\n**Navigation links:**\n```markdown\n[Home](/){.nav-link .active}\n[About](/about){.nav-link}\n```\n\n### CSS Examples\n\nHere are some CSS rules you might use with attribute-styled elements:\n\n```css\n/* Cinematic image style */\n.more-cinematic {\n  filter: contrast(1.1) saturate(1.2);\n  border-radius: 8px;\n}\n\n/* Shadow and border */\n.shadow {\n  box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n}\n\n.bordered {\n  border: 2px solid var(--border-color);\n}\n\n/* Button-style links */\n.button {\n  display: inline-block;\n  padding: 0.5em 1em;\n  background: var(--primary-color);\n  color: white;\n  text-decoration: none;\n  border-radius: 4px;\n}\n\n.button.primary {\n  background: var(--accent-color);\n}\n\n/* External link indicator */\n.external-link::after {\n  content: \" ↗\";\n  font-size: 0.8em;\n}\n```\n\n---\n\n## Admonitions\n\nAdmonitions (also called callouts) are visually distinct blocks for notes, warnings, tips, and other highlighted content.\n\n### Basic Syntax\n\nUse `!!!` followed by the type and optional title:\n\n**Input:**\n\n```markdown\n!!! note \"Optional Title\"\n    Admonition content here.\n    Can span multiple lines.\n\n    Supports **Markdown** formatting.\n\n!!! warning\n    Warning without custom title uses type as title.\n```\n\n**Live examples:**\n\n!!! note \"Optional Title\"\n\n    Admonition content here.\n    Can span multiple lines.\n\n    Supports **Markdown** formatting.\n\n!!! warning\n\n    Warning without custom title uses type as title.\n\n**Output:**\n\n```html\n\u003cdiv class=\"admonition note\"\u003e\n  \u003cp class=\"admonition-title\"\u003eOptional Title\u003c/p\u003e\n  \u003cp\u003eAdmonition content here.\n  Can span multiple lines.\u003c/p\u003e\n  \u003cp\u003eSupports \u003cstrong\u003eMarkdown\u003c/strong\u003e formatting.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv class=\"admonition warning\"\u003e\n  \u003cp class=\"admonition-title\"\u003eWarning\u003c/p\u003e\n  \u003cp\u003eWarning without custom title uses type as title.\u003c/p\u003e\n\u003c/div\u003e\n```\n\n### Admonition Types\n\n| Type | Default Title | Typical Color | Use Case |\n|------|---------------|---------------|----------|\n| `note` | Note | Blue | Additional information |\n| `info` | Info | Blue | Background context |\n| `tip` | Tip | Green | Helpful suggestions |\n| `hint` | Hint | Green | Subtle guidance |\n| `success` | Success | Green | Positive outcomes |\n| `warning` | Warning | Yellow/Orange | Potential issues |\n| `caution` | Caution | Yellow/Orange | Proceed carefully |\n| `danger` | Danger | Red | Critical warnings |\n| `error` | Error | Red | Error conditions |\n| `bug` | Bug | Red | Known issues |\n| `example` | Example | Purple | Code examples |\n| `quote` | Quote | Gray | Quotations |\n| `abstract` | Abstract | Cyan | Summaries |\n| `aside` | (none) | Gray | Sidebar/marginal notes |\n\n### Examples of Each Type\n\nEach example below shows the markdown syntax followed by how it renders.\n\n**Note:**\n\n```markdown\n!!! note\n    This is a general note providing additional context or information\n    that might be helpful but isn't critical.\n```\n\n!!! note\n\n    This is a general note providing additional context or information\n    that might be helpful but isn't critical.\n\n**Tip:**\n\n```markdown\n!!! tip \"Pro Tip\"\n    Use keyboard shortcuts to speed up your workflow.\n    Press `Ctrl+Shift+P` to open the command palette.\n```\n\n!!! tip \"Pro Tip\"\n\n    Use keyboard shortcuts to speed up your workflow.\n    Press `Ctrl+Shift+P` to open the command palette.\n\n**Warning:**\n\n```markdown\n!!! warning \"Deprecation Notice\"\n    This API will be removed in version 3.0.\n    Please migrate to the new API before upgrading.\n```\n\n!!! warning \"Deprecation Notice\"\n\n    This API will be removed in version 3.0.\n    Please migrate to the new API before upgrading.\n\n**Danger:**\n\n```markdown\n!!! danger \"Data Loss Warning\"\n    This operation cannot be undone. Make sure you have\n    a backup before proceeding.\n```\n\n!!! danger \"Data Loss Warning\"\n\n    This operation cannot be undone. Make sure you have\n    a backup before proceeding.\n\n**Info:**\n\n```markdown\n!!! info\n    This feature was introduced in version 2.5 and requires\n    Go 1.21 or later.\n```\n\n!!! info\n\n    This feature was introduced in version 2.5 and requires\n    Go 1.21 or later.\n\n**Example:**\n\n```markdown\n!!! example \"Usage Example\"\n    ```go\n    result := myFunction(input)\n    fmt.Println(result)\n    ```\n```\n\n!!! example \"Usage Example\"\n\n    ```go\n    result := myFunction(input)\n    fmt.Println(result)\n    ```\n\n**Success:**\n\n```markdown\n!!! success \"Build Complete\"\n    Your site has been successfully built and deployed.\n```\n\n!!! success \"Build Complete\"\n\n    Your site has been successfully built and deployed.\n\n**Bug:**\n\n```markdown\n!!! bug \"Known Issue\"\n    There is a known issue with Safari where animations may flicker.\n    A fix is planned for the next release.\n```\n\n!!! bug \"Known Issue\"\n\n    There is a known issue with Safari where animations may flicker.\n    A fix is planned for the next release.\n\n**Quote:**\n\n```markdown\n!!! quote \"Albert Einstein\"\n    Imagination is more important than knowledge. Knowledge is limited.\n    Imagination encircles the world.\n```\n\n!!! quote \"Albert Einstein\"\n\n    Imagination is more important than knowledge. Knowledge is limited.\n    Imagination encircles the world.\n\n**Abstract:**\n\n```markdown\n!!! abstract \"Summary\"\n    This article covers the basics of static site generation,\n    including configuration, templating, and deployment strategies.\n```\n\n!!! abstract \"Summary\"\n\n    This article covers the basics of static site generation,\n    including configuration, templating, and deployment strategies.\n\n### Collapsible Admonitions\n\nUse `???` for collapsed (closed by default) or `???+` for expanded (open by default):\n\n**Input:**\n\n```markdown\n??? note \"Click to expand\"\n    This content is hidden by default.\n    Click the title to reveal it.\n\n???+ tip \"Expanded by default\"\n    This content is visible initially.\n    Click to collapse.\n```\n\n**Live examples:**\n\n??? note \"Click to expand\"\n\n    This content is hidden by default.\n    Click the title to reveal it.\n\n???+ tip \"Expanded by default\"\n\n    This content is visible initially.\n    Click to collapse.\n\n**Output:**\n\n```html\n\u003cdetails class=\"admonition note\"\u003e\n  \u003csummary class=\"admonition-title\"\u003eClick to expand\u003c/summary\u003e\n  \u003cp\u003eThis content is hidden by default.\n  Click the title to reveal it.\u003c/p\u003e\n\u003c/details\u003e\n\n\u003cdetails class=\"admonition tip\" open\u003e\n  \u003csummary class=\"admonition-title\"\u003eExpanded by default\u003c/summary\u003e\n  \u003cp\u003eThis content is visible initially.\n  Click to collapse.\u003c/p\u003e\n\u003c/details\u003e\n```\n\n### Nested Content in Admonitions\n\nAdmonitions can contain any Markdown content:\n\n```markdown\n!!! example \"Complete Example\"\n    Here's a full working example:\n\n    ```python\n    def greet(name):\n        return f\"Hello, {name}!\"\n\n    print(greet(\"World\"))\n    ```\n\n    **Output:**\n\n    ```\n    Hello, World!\n    ```\n\n    - Works with Python 3.6+\n    - Requires no dependencies\n\n!!! note\n\n    A blank line after the admonition header is allowed.\n    Content must still be indented.\n\n!!! tip\n    - The first body line can be a list, heading or quote too;\n    - it is parsed as Markdown, never as an indented code block.\n```\n\n**Live example:**\n\n!!! example \"Complete Example\"\n\n    Here's a full working example:\n\n    ```python\n    def greet(name):\n        return f\"Hello, {name}!\"\n\n    print(greet(\"World\"))\n    ```\n\n    **Output:**\n\n    ```\n    Hello, World!\n    ```\n\n    - Works with Python 3.6+\n    - Requires no dependencies\n\n### Aside (Marginal Notes)\n\nThe `aside` type creates sidebar or marginal notes:\n\n```markdown\n!!! aside\n    This is a marginal note that floats to the side.\n\n!!! aside \"Definition\"\n    A **static site generator** converts source files into static HTML.\n```\n\n!!! aside\n\n    This is a marginal note that floats to the side.\n\n!!! aside \"Definition\"\n\n    A **static site generator** converts source files into static HTML.\n\nControl positioning with inline modifiers:\n\n```markdown\n!!! aside inline\n    Floats to the left of content.\n\n!!! aside inline end\n    Floats to the right of content (default).\n```\n\nSee [Advanced Usage](../advanced-usage.md#admonitions-and-callouts) for styling and customization options.\n\n---\n\n## Wikilinks\n\nWikilinks provide an easy way to link between posts using `[[slug]]` syntax.\n\n### Basic Syntax\n\n**Input:**\n\n```markdown\nCheck out [[getting-started]] for installation instructions.\n\nSee also: [[quickstart]], [[advanced-usage]]\n```\n\n**Live example:**\n\nCheck out [[getting-started]] for installation instructions.\n\nSee also: [[quickstart]], [[advanced-usage]]\n\n**Output (when posts exist):**\n\n```html\n\u003cp\u003eCheck out \u003ca href=\"/getting-started/\" class=\"wikilink\"\u003eGetting Started\u003c/a\u003e for installation instructions.\u003c/p\u003e\n\n\u003cp\u003eSee also: \u003ca href=\"/quickstart/\" class=\"wikilink\"\u003eQuickstart\u003c/a\u003e, \u003ca href=\"/advanced-usage/\" class=\"wikilink\"\u003eAdvanced Usage\u003c/a\u003e\u003c/p\u003e\n```\n\n### Custom Link Text\n\nUse the pipe (`|`) to specify custom link text:\n\n**Input:**\n\n```markdown\nRead the [[getting-started|installation guide]] first.\n\nFor more details, see [[advanced-usage|the advanced guide]].\n```\n\n**Live example:**\n\nRead the [[getting-started|installation guide]] first.\n\nFor more details, see [[advanced-usage|the advanced guide]].\n\n**Output:**\n\n```html\n\u003cp\u003eRead the \u003ca href=\"/getting-started/\" class=\"wikilink\"\u003einstallation guide\u003c/a\u003e first.\u003c/p\u003e\n\n\u003cp\u003eFor more details, see \u003ca href=\"/advanced-usage/\" class=\"wikilink\"\u003ethe advanced guide\u003c/a\u003e.\u003c/p\u003e\n```\n\n### Linking to Sections\n\nLink to specific headings within posts:\n\n```markdown\nSee [[feeds-guide#feed-configuration]] for feed setup.\n\nCheck the [[templates-guide#available-variables|template variables section]].\n```\n\n**Live example:**\n\nSee [[feeds-guide#feed-configuration]] for feed setup.\n\nCheck the [[templates-guide#available-variables|template variables section]].\n\n### Wikilink Resolution\n\nmarkata-go resolves wikilinks by:\n\n1. Finding a post where `slug == link_target` (case-insensitive)\n2. If no slug match, checking for posts with matching `aliases` in frontmatter\n3. If found: renders as `\u003ca href=\"{post.href}\"\u003e{text}\u003c/a\u003e`\n4. If not found: leaves as literal `[[link]]` and warns\n\n### Using Aliases\n\nYou can define aliases in your post's frontmatter to create alternative names for linking:\n\n**Target post (`ecmascript.md`):**\n\n```yaml\n---\ntitle: \"ECMAScript Language Specification\"\nslug: \"ecmascript\"\naliases:\n  - js\n  - javascript\n  - JavaScript\n---\n```\n\n**Source post:**\n\n```markdown\nLearn about [[js]] and [[javascript]] - both link to the ECMAScript post!\n```\n\n**Output:**\n\n```html\n\u003cp\u003eLearn about \u003ca href=\"/ecmascript/\" class=\"wikilink\"\u003eECMAScript Language Specification\u003c/a\u003e and \u003ca href=\"/ecmascript/\" class=\"wikilink\"\u003eECMAScript Language Specification\u003c/a\u003e - both link to the ECMAScript post!\u003c/p\u003e\n```\n\n!!! note \"Slug Precedence\"\n\n    If a slug and an alias have the same name, the slug always takes precedence.\n    For example, if post A has `slug: \"javascript\"` and post B has\n    `aliases: [\"javascript\"]`, then `[[javascript]]` will link to post A.\n\n### Broken Link Handling\n\nWhen a wikilink target doesn't exist:\n\n**Input:**\n\n```markdown\nSee [[nonexistent-post]] for more.\n```\n\n**Live example:**\n\nSee [[nonexistent-post]] for more.\n\n**Output:**\n\n```html\n\u003cp\u003eSee [[nonexistent-post]] for more.\u003c/p\u003e\n```\n\n**Build warning:**\n\n```\nWarning: Broken wikilink in posts/my-post.md: [[nonexistent-post]] (post not found)\n```\n\nEnable strict mode to fail builds on broken links:\n\n```toml\n[markata-go]\nstrict_wikilinks = true\n```\n\n### Syntax Reference\n\n| Syntax | Description | Output |\n|--------|-------------|--------|\n| `[[slug]]` | Basic link (auto-title) | Link with post title |\n| `[[slug\\|Text]]` | Custom text | Link with \"Text\" |\n| `[[slug#section]]` | Section link | Link to heading anchor |\n| `[[slug#section\\|Text]]` | Section with text | Custom text to section |\n\n---\n\n## Hover Cards\n\nThe default theme shows a small preview card when a reader hovers or\nkeyboard-focuses certain links. One component (`js/tooltips.js`) draws every\ncard, so they share the same look, placement, and keyboard behavior.\n\n| Source | What the card shows |\n|--------|---------------------|\n| Wikilinks (`[[slug]]`) | Target title, description, date, and path |\n| Glossary terms | Term name, definition, and path (replaces the browser's native `title` tooltip) |\n| `data-hover-title` / `data-hover-description` | Your own title and text |\n| `data-hover-card=\"#id\"` | Rich HTML copied from a `\u003ctemplate\u003e` |\n| External links (opt-in) | Page title, description, preview image, site icon, and path |\n\nWikilinks and glossary terms get cards automatically. External links get cards\nwhen you enable the [`external_link_hover`](/docs/reference/plugins/#external_link_hover)\nplugin. For anything else, add attributes to inline HTML in your Markdown.\n\n### Simple Text Card\n\n```html\nMarkata supports \u003cspan data-hover-title=\"Static Site Generator\"\n  data-hover-description=\"Builds plain HTML files ahead of time.\"\u003eSSGs\u003c/span\u003e.\n```\n\n**Live example:**\n\nMarkata supports \u003cspan data-hover-title=\"Static Site Generator\" data-hover-description=\"Builds plain HTML files ahead of time.\"\u003eSSGs\u003c/span\u003e.\n\n### Rich Card From a Template\n\nPoint `data-hover-card` at a `\u003ctemplate\u003e` (or any element) by CSS selector.\nThe template can hold links and markup, and the reader can move the pointer\ninto the card to click them.\n\n```html\nTry \u003cspan data-hover-card=\"#vibe-card\"\u003evibe coding\u003c/span\u003e today.\n\n\u003ctemplate id=\"vibe-card\"\u003e\n  \u003cstrong\u003e\u003ca href=\"/vibe-coding/\"\u003eVibe Coding\u003c/a\u003e\u003c/strong\u003e\n  \u003cp\u003eDescribe intent to an AI assistant and iterate on the result.\u003c/p\u003e\n\u003c/template\u003e\n```\n\n**Live example:**\n\nTry \u003cspan data-hover-card=\"#vibe-card-example\"\u003evibe coding\u003c/span\u003e today.\n\n\u003ctemplate id=\"vibe-card-example\"\u003e\n  \u003cstrong\u003eVibe Coding\u003c/strong\u003e\n  \u003cp\u003eDescribe intent to an AI assistant and iterate on the result.\u003c/p\u003e\n\u003c/template\u003e\n\n### External Link Cards\n\nTurn on the `external_link_hover` plugin and ordinary Markdown links to other\nsites get preview cards:\n\n```toml\n[markata-go.external_link_hover]\nenabled = true\nfetch = true                 # look up pages that aren't cached yet\nfavicon_service = \"https://icons.duckduckgo.com/ip3/{host}.ico\"\n```\n\n```markdown\nSee the [markata-go repo](https://github.com/WaylonWalker/markata-go).\n```\n\nThe card uses metadata markata-go already has: Open Graph and oEmbed data from\nthe embeds cache, your blogroll feed entries, and the link's Markdown title.\nWith `fetch = false` (the default) the build makes no network requests, and\nlinks without metadata still get a small card with the host and path.\n\nTo skip one link, add `data-no-preview` with inline HTML:\n\n```html\n\u003ca href=\"https://example.com/\" data-no-preview\u003eno card here\u003c/a\u003e\n```\n\n### Behavior\n\n- Cards open after a short delay, stay open while the pointer is over the\n  target or the card, and close on pointer leave, scroll, click elsewhere, or\n  \u003ckbd\u003eEscape\u003c/kbd\u003e.\n- Cards open on keyboard focus. Custom targets get `tabindex=\"0\"`\n  automatically, so plain `\u003cspan\u003e` elements are reachable with \u003ckbd\u003eTab\u003c/kbd\u003e.\n- Cards open on the side your pointer is on. For a link that wraps across\n  lines, hovering the first line opens the card above the link, and hovering\n  the last line opens it below. The card never covers the link, and it flips\n  sides when there isn't room. Single-line links and keyboard focus open below.\n- Mention cards use the same placement rules.\n- Touch devices don't get hover cards; tapping a link follows it.\n\n### Styling Hover Cards\n\nEvery card has the `hover-card` class, plus a modifier for its source:\n`wikilink-tooltip`, `hover-card--glossary`, `hover-card--external`, or\n`hover-card--rich`. Override them in your own CSS:\n\n```css\n.hover-card {\n  max-width: 28rem;\n  border-color: var(--color-accent);\n}\n\n.hover-card--rich {\n  max-height: 16rem;\n}\n```\n\n### Adding Your Own Hover Source\n\nTheme and plugin scripts can register more sources. The build function gets\nthe hovered element and returns a DOM node (or `null` to skip):\n\n```javascript\nwindow.MarkataHoverCards.register('abbr[title]', function (el) {\n  var node = document.createElement('div');\n  node.className = 'tooltip-desc';\n  node.textContent = el.getAttribute('title');\n  return node;\n});\n```\n\nBuilt-in sources take precedence over sources you register.\n\nIf a script draws its own popup, reuse the placement rules so it opens on the\nsame side as every other card:\n\n```javascript\nvar pos = window.MarkataHoverCards.placement(link, popup.offsetWidth, popup.offsetHeight);\npopup.style.position = 'fixed';\npopup.style.top = pos.top + 'px';\npopup.style.left = pos.left + 'px';\n```\n\n!!! tip \"Prefer this over ad-hoc tooltips\"\n\n    Use hover cards instead of hand-written `wa-tooltip` + script combinations\n    for link and term previews. They follow the active palette, handle\n    keyboard focus, and stay inside the viewport.\n\n---\n\n## Table of Contents\n\nmarkata-go can automatically generate a table of contents from your headings.\n\n### Enabling TOC\n\nThere are three ways to control TOC display, in order of priority:\n\n1. **`[[toc]]` placeholder** - Insert TOC inline in your content\n2. **Frontmatter** - `toc: true` or `toc: false` per-post override\n3. **Global config** - Auto-enable based on content length\n\n### TOC Placeholder\n\nInsert `[[toc]]` anywhere in your markdown to render the TOC at that position:\n\n```markdown\n---\ntitle: \"My Article\"\n---\n\n# Table of Contents\n[[toc]]\n\n## Introduction\n\nContent starts here...\n```\n\n### Frontmatter Override\n\nControl TOC per-post in frontmatter:\n\n```yaml\n---\ntitle: \"My Long Article\"\ntoc: true        # Force enable TOC\n---\n\n# Introduction\n\n## Getting Started\n```\n\nOr disable TOC for a specific post:\n\n```yaml\n---\ntitle: \"Short Post\"\ntoc: false       # Disable TOC even if global config enables it\n---\n\n# Introduction\n```\n\n### Global Auto-Enable\n\nConfigure automatic TOC display based on content thresholds:\n\n```toml\n[markata-go.toc]\nenabled = true\nauto_enable = true\nmin_toc_links = 3     # Show if 3+ headings\nmin_word_count = 500  # Show if 500+ words\n```\n\n### Priority Order\n\nTOC display is determined by the following priority:\n\n1. **`[[toc]]` placeholder** → Always shows TOC at placeholder position\n2. **Frontmatter `toc: false`** → Disables TOC for this post\n3. **Frontmatter `toc: true`** → Forces TOC for this post\n4. **Global `auto_enable: true`** → Auto-shows if thresholds met\n5. **Global `enabled: true`** → Default TOC behavior\n\n### TOC Options\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `toc` | bool | `false` | Enable TOC generation |\n| `toc_depth` | int | `2` | Maximum heading level (1-6) |\n| `toc_min_items` | int | `2` | Minimum headings to show TOC |\n\n```yaml\n---\ntitle: \"Deep Dive Article\"\ntoc: true\ntoc_depth: 3       # Include h1, h2, h3\ntoc_min_items: 3   # Only show if 3+ headings\n---\n```\n\n### Generated TOC Structure\n\nThe TOC is available as `post.Extra.toc_html`:\n\n**Example output:**\n\n```html\n\u003cnav class=\"toc\"\u003e\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"#introduction\"\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\n      \u003ca href=\"#getting-started\"\u003eGetting Started\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#prerequisites\"\u003ePrerequisites\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#core-concepts\"\u003eCore Concepts\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#advanced-topics\"\u003eAdvanced Topics\u003c/a\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/nav\u003e\n```\n\n### Using TOC in Templates\n\nInclude the TOC in your post template:\n\n```django\n{% if post.Extra.toc_html %}\n\u003caside class=\"toc-sidebar\"\u003e\n    {{ post.Extra.toc_html|safe }}\n\u003c/aside\u003e\n{% endif %}\n\n\u003cdiv class=\"post-content\"\u003e\n    {{ body|safe }}\n\u003c/div\u003e\n```\n\nSee [[templates-guide|Templates]] for more template examples.\n\n### Configuration\n\nConfigure TOC defaults in `markata-go.toml`:\n\n```toml\n[markata-go.toc]\nenabled = true\ndefault_depth = 2\nmin_items = 2\n```\n\n---\n\n## Heading Anchors\n\nmarkata-go automatically generates anchor IDs for all headings, enabling direct linking to sections.\n\n### Auto-Generated IDs\n\nHeadings are automatically assigned IDs based on their text:\n\n**Input:**\n\n```markdown\n## Hello World\n## What's New?\n## 2024 Updates\n## FAQ\n```\n\n**Output:**\n\n```html\n\u003ch2 id=\"hello-world\"\u003eHello World\u003c/h2\u003e\n\u003ch2 id=\"whats-new\"\u003eWhat's New?\u003c/h2\u003e\n\u003ch2 id=\"2024-updates\"\u003e2024 Updates\u003c/h2\u003e\n\u003ch2 id=\"faq\"\u003eFAQ\u003c/h2\u003e\n```\n\n!!! tip \"Try it\"\n\n    Every heading on this page has an auto-generated ID. Hover over any heading to see the anchor link, or try linking to [#auto-generated-ids](#auto-generated-ids).\n\n### ID Generation Rules\n\n| Heading | Generated ID |\n|---------|--------------|\n| `## Hello World` | `hello-world` |\n| `## What's New?` | `whats-new` |\n| `## C++ Tutorial` | `c-tutorial` |\n| `## 100% Complete` | `100-complete` |\n| `## Leading Space` | `leading-space` |\n\n### Duplicate Handling\n\nWhen multiple headings have the same text, numbers are appended:\n\n**Input:**\n\n```markdown\n## FAQ\n## FAQ\n## FAQ\n```\n\n**Output:**\n\n```html\n\u003ch2 id=\"faq\"\u003eFAQ\u003c/h2\u003e\n\u003ch2 id=\"faq-1\"\u003eFAQ\u003c/h2\u003e\n\u003ch2 id=\"faq-2\"\u003eFAQ\u003c/h2\u003e\n```\n\n### Custom IDs\n\nOverride the auto-generated ID with custom syntax:\n\n**Input:**\n\n```markdown\n## My Section {#custom-id}\n\n## Installation Guide {#install}\n\n## Frequently Asked Questions {#faq-section}\n```\n\n**Output:**\n\n```html\n\u003ch2 id=\"custom-id\"\u003eMy Section\u003c/h2\u003e\n\u003ch2 id=\"install\"\u003eInstallation Guide\u003c/h2\u003e\n\u003ch2 id=\"faq-section\"\u003eFrequently Asked Questions\u003c/h2\u003e\n```\n\n### Anchor Links\n\nmarkata-go can add clickable anchor links to headings:\n\n```html\n\u003ch2 id=\"my-section\"\u003e\n  My Section\n  \u003ca href=\"#my-section\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\n\u003c/h2\u003e\n```\n\nConfigure anchor link appearance:\n\n```toml\n[markata-go.markdown.anchors]\nenabled = true\nposition = \"end\"    # \"start\" or \"end\"\nsymbol = \"#\"        # or \"link\", \"paragraph\", etc.\n```\n\n### Linking to Headings\n\nLink to headings using their IDs:\n\n```markdown\nSee [the installation section](#installation) for setup instructions.\n\nJump to [FAQ](#faq) for common questions.\n```\n\nOr use wikilinks with section anchors:\n\n```markdown\nSee [[getting-started#installation]] for setup.\n```\n\n---\n\n## Footnotes\n\nFootnotes let you add references without interrupting the flow of your content.\n\n### Basic Syntax\n\n**Input:**\n\n```markdown\nHere's a sentence with a footnote.[^1]\n\nAnother sentence with a named footnote.[^note]\n\n[^1]: This is the first footnote content.\n\n[^note]: This is a named footnote. It can be referenced\n    multiple times and span multiple lines.\n\n    It can even contain multiple paragraphs.\n```\n\n**Live example:**\n\nHere's a sentence with a footnote.[^example-1]\n\nAnother sentence with a named footnote.[^example-note]\n\n[^example-1]: This is the first footnote content.\n\n[^example-note]: This is a named footnote. It can be referenced\n    multiple times and span multiple lines.\n\n    It can even contain multiple paragraphs.\n\n**Output:**\n\n```html\n\u003cp\u003eHere's a sentence with a footnote.\u003csup id=\"fnref:1\"\u003e\u003ca href=\"#fn:1\"\u003e1\u003c/a\u003e\u003c/sup\u003e\u003c/p\u003e\n\n\u003cp\u003eAnother sentence with a named footnote.\u003csup id=\"fnref:note\"\u003e\u003ca href=\"#fn:note\"\u003e2\u003c/a\u003e\u003c/sup\u003e\u003c/p\u003e\n\n\u003cdiv class=\"footnotes\"\u003e\n  \u003chr\u003e\n  \u003col\u003e\n    \u003cli id=\"fn:1\"\u003e\n      \u003cp\u003eThis is the first footnote content. \u003ca href=\"#fnref:1\"\u003e\u0026#8617;\u003c/a\u003e\u003c/p\u003e\n    \u003c/li\u003e\n    \u003cli id=\"fn:note\"\u003e\n      \u003cp\u003eThis is a named footnote. It can be referenced\n      multiple times and span multiple lines.\u003c/p\u003e\n      \u003cp\u003eIt can even contain multiple paragraphs. \u003ca href=\"#fnref:note\"\u003e\u0026#8617;\u003c/a\u003e\u003c/p\u003e\n    \u003c/li\u003e\n  \u003c/ol\u003e\n\u003c/div\u003e\n```\n\n### Inline Footnotes\n\nFor short notes, use inline syntax:\n\n```markdown\nHere's an inline footnote.^[This is the footnote content inline.]\n```\n\n**Live example:**\n\nHere's an inline footnote.^[This is the footnote content inline.]\n\n### Footnote Best Practices\n\n1. **Placement**: Footnote definitions can be anywhere in the document, but are typically placed at the end.\n\n2. **Naming**: Use descriptive names for complex documents:\n   ```markdown\n   [^citation-smith-2024]: Smith, J. (2024). *The Article*. Journal.\n   [^definition-ssr]: Server-Side Rendering: Generating HTML on the server.\n   ```\n\n3. **Multi-paragraph footnotes**: Indent continuation lines with 4 spaces:\n   ```markdown\n   [^long-note]: First paragraph of the footnote.\n\n       Second paragraph must be indented.\n\n       Third paragraph too.\n   ```\n\n---\n\n## See Also\n\n- [[templates-guide|Templates]] - Using TOC and content in templates\n- [[advanced-usage|Advanced Usage]] - Advanced admonition customization\n- [[dynamic-content|Dynamic Content]] - Using Jinja in Markdown\n- [[frontmatter-guide|Frontmatter]] - Frontmatter fields and metadata\n- [[configuration-guide|Configuration]] - Markdown configuration options\n\n---\n\n## Image Zoom / Lightbox\n\nmarkata-go supports optional image zoom functionality using GLightbox. When enabled, users can click/tap images to view them in a full-screen lightbox with support for mobile gestures, keyboard navigation, and gallery mode.\n\n### Enabling Image Zoom\n\nImage zoom is disabled by default. Enable it in your `markata-go.toml`:\n\n```toml\n[markata-go.image_zoom]\nenabled = true\n```\n\n### Marking Individual Images\n\nUse the `{data-zoomable}` attribute marker to make specific images zoomable:\n\n**Input:**\n\n```markdown\n![Beautiful sunset {data-zoomable}](/images/sunset.jpg)\n\n![Regular image without zoom](/images/icon.png)\n```\n\n**Output:**\n\n```html\n\u003ca href=\"/images/sunset.jpg\" class=\"glightbox-link\"\u003e\n  \u003cimg src=\"/images/sunset.jpg\" alt=\"Beautiful sunset\" class=\"glightbox\" width=\"1200\" height=\"675\" data-glightbox=\"description: Beautiful sunset\"\u003e\n\u003c/a\u003e\n\n\u003cimg src=\"/images/icon.png\" alt=\"Regular image without zoom\"\u003e\n```\n\nThe first image will open in a lightbox when clicked. The second remains a regular image.\n\n### Alternative: Class Marker\n\nYou can also use the `{.zoomable}` class marker:\n\n```markdown\n![Photo {.zoomable}](/images/photo.jpg)\n```\n\n### Enable for All Images in a Post\n\nAdd `image_zoom: true` to your frontmatter to enable zoom for all images in that post:\n\n```yaml\n---\ntitle: \"Photo Gallery\"\nimage_zoom: true\n---\n\n![First photo](/images/photo1.jpg)\n![Second photo](/images/photo2.jpg)\n![Third photo](/images/photo3.jpg)\n```\n\nAll three images will be zoomable without needing individual markers.\n\n### Enable for All Images Site-Wide\n\nTo make all images zoomable by default across your entire site:\n\n```toml\n[markata-go.image_zoom]\nenabled = true\nauto_all_images = true\n```\n\n### Configuration Options\n\n```toml\n[markata-go.image_zoom]\nenabled = false           # Enable the plugin (default: false)\nlibrary = \"glightbox\"     # Lightbox library (currently only glightbox supported)\nselector = \".glightbox\"   # CSS selector for zoomable images\ncdn = true                # Use CDN for library files (default: true)\nauto_all_images = false   # Make all images zoomable (default: false)\n\n# GLightbox-specific options\nopen_effect = \"zoom\"      # Effect when opening: \"zoom\", \"fade\", \"none\"\nclose_effect = \"zoom\"     # Effect when closing: \"zoom\", \"fade\", \"none\"\nslide_effect = \"slide\"    # Effect when sliding: \"slide\", \"fade\", \"zoom\", \"none\"\ntouch_navigation = true   # Enable touch/swipe gestures\nloop = false              # Loop through images in gallery\ndraggable = true          # Enable dragging images to navigate\n```\n\n### Keyboard Navigation\n\nWhen the lightbox is open:\n\n| Key | Action |\n|-----|--------|\n| `Escape` | Close the lightbox |\n| `→` / `Right Arrow` | Next image (in gallery) |\n| `←` / `Left Arrow` | Previous image (in gallery) |\n\n### Mobile Gestures\n\nOn touch devices:\n\n| Gesture | Action |\n|---------|--------|\n| Swipe left/right | Navigate between images |\n| Pinch | Zoom in/out |\n| Drag | Pan zoomed image |\n| Tap outside | Close lightbox |\n\n### Image Galleries\n\nImages marked as zoomable within the same post automatically form a gallery. Users can navigate between them using arrow keys or swipe gestures.\n\n### CSS Customization\n\nStyle the lightbox links with CSS:\n\n```css\n/* Style the zoomable image wrapper */\n.glightbox-link {\n  display: inline-block;\n  cursor: zoom-in;\n}\n\n/* Add hover effect */\n.glightbox-link:hover img {\n  opacity: 0.9;\n  transform: scale(1.02);\n  transition: all 0.2s ease;\n}\n\n/* Style for zoomable images */\nimg.glightbox {\n  cursor: zoom-in;\n}\n```\n\n### Performance Notes\n\n- JavaScript and CSS for GLightbox are only loaded on pages that have zoomable images\n- When using CDN (default), files are loaded from jsDelivr\n- The library is ~11KB gzipped, loaded asynchronously\n",
      "summary": "Guide to supported Markdown syntax including GFM, admonitions, wikilinks, and table of contents",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "markdown",
        "content"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/keyboard-navigation/",
      "url": "https://markata.dev/docs/guides/keyboard-navigation/",
      "title": "Keyboard Navigation",
      "content_html": "\u003cp\u003emarkata-go sites include comprehensive keyboard shortcuts for power users and those who prefer keyboard navigation. All shortcuts are designed to be intuitive, following conventions from popular tools like Vim and GitHub.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eAccessibility:\u003c/strong\u003e Shortcuts respect user preferences and can be disabled. They never intercept keyboard input from form fields or focused interactive controls, so native Enter and Space activation continues to work.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"quick-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Reference\u003c/span\u003e \u003ca href=\"#quick-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePress \u003ccode\u003e?\u003c/code\u003e at any time to see the full shortcuts help modal.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"scrolling\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eScrolling\u003c/span\u003e \u003ca href=\"#scrolling\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNavigate through page content using vim-style shortcuts:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eShortcut\u003c/th\u003e\n\u003cth\u003eAction\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ej\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eScroll down (~2 lines)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ek\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eScroll up (~2 lines)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ed\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eScroll half-page down\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eu\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eScroll half-page up\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eg g\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eScroll to top of page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eShift+G\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eScroll to bottom of page\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eNote:\u003c/strong\u003e On feed/list pages with multiple posts, \u003ccode\u003ej\u003c/code\u003e/\u003ccode\u003ek\u003c/code\u003e will navigate between posts instead of scrolling.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"feed-navigation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Navigation\u003c/span\u003e \u003ca href=\"#feed-navigation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen viewing a page with multiple posts (index, archive, tag pages), keyboard navigation lets you browse through posts:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eShortcut\u003c/th\u003e\n\u003cth\u003eAction\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ej\u003c/code\u003e or \u003ccode\u003eDown Arrow\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHighlight next post\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ek\u003c/code\u003e or \u003ccode\u003eUp Arrow\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHighlight previous post\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eEnter\u003c/code\u003e or \u003ccode\u003eo\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOpen highlighted post\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eShift+O\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOpen highlighted post in new tab\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe highlighted post is visually indicated with an outline. Press \u003ccode\u003eEscape\u003c/code\u003e to clear the highlight.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"go-to-shortcuts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGo-To Shortcuts\u003c/span\u003e \u003ca href=\"#go-to-shortcuts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGitHub-style two-key sequences for quick navigation:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eShortcut\u003c/th\u003e\n\u003cth\u003eAction\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eg h\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGo to home page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eg s\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFocus search input\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003ePress the first key (\u003ccode\u003eg\u003c/code\u003e), then the second key within 800ms.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"utility-shortcuts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUtility Shortcuts\u003c/span\u003e \u003ca href=\"#utility-shortcuts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eShortcut\u003c/th\u003e\n\u003cth\u003eAction\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFocus search input\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCmd/Ctrl+K\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFocus search (alternative)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ey y\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCopy current URL to clipboard\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e[\u003c/code\u003e or \u003ccode\u003eShift+K\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePrevious post in the current series/feed, or previous page on a feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e]\u003c/code\u003e or \u003ccode\u003eShift+J\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNext post in the current series/feed, or next page on a feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eb\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eToggle the left sidebar drawer (series). Works at every width; hover a drawer handle to see its key\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eShift+B\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eToggle the right sidebar drawer (on this page)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e{\u003c/code\u003e / \u003ccode\u003e}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSwitch the sidebar to the previous / next primary feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003es\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOn a post, toggle reader mode; on a feed, switch between simple and rich views\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e?\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eShow shortcuts help modal\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eEscape\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eClose modals and overlay drawers, clear highlight, blur inputs\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"reader-mode\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReader Mode\u003c/span\u003e \u003ca href=\"#reader-mode\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOn a post, press \u003ccode\u003es\u003c/code\u003e to hide the site header, footer, and sidebars and center a\nwider reading column without dimming the text. Press \u003ccode\u003es\u003c/code\u003e again to restore the\nnormal layout. The address gains \u003ccode\u003e?reader=1\u003c/code\u003e while reader mode is active, so you\ncan bookmark or share that view. On feed pages, \u003ccode\u003es\u003c/code\u003e switches between simple and\nrich views instead.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"accessibility-features\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAccessibility Features\u003c/span\u003e \u003ca href=\"#accessibility-features\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"respects-user-preferences\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRespects User Preferences\u003c/span\u003e \u003ca href=\"#respects-user-preferences\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eReduced Motion:\u003c/strong\u003e When \u003ccode\u003eprefers-reduced-motion\u003c/code\u003e is enabled, smooth scrolling is disabled for instant navigation.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eInput Context:\u003c/strong\u003e Shortcuts are automatically disabled when typing in text inputs, textareas, or contenteditable elements, including fields inside shadow DOM such as the \u003ccode\u003emarkata-go serve\u003c/code\u003e settings sidebar.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"disable-shortcuts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDisable Shortcuts\u003c/span\u003e \u003ca href=\"#disable-shortcuts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf keyboard shortcuts interfere with your workflow or assistive technology:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ePress \u003ccode\u003e?\u003c/code\u003e to open the shortcuts modal\u003c/li\u003e\n\u003cli\u003eClick \u0026ldquo;Disable Shortcuts\u0026rdquo;\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThis preference is saved in your browser and persists across visits.\u003c/p\u003e\n\u003ch3 id=\"re-enable-shortcuts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRe-enable Shortcuts\u003c/span\u003e \u003ca href=\"#re-enable-shortcuts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003ePress \u003ccode\u003e?\u003c/code\u003e (this still works even when shortcuts are disabled)\u003c/li\u003e\n\u003cli\u003eClick \u0026ldquo;Enable Shortcuts\u0026rdquo;\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"customization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustomization\u003c/span\u003e \u003ca href=\"#customization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"for-site-owners\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFor Site Owners\u003c/span\u003e \u003ca href=\"#for-site-owners\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eKeyboard shortcuts are part of the default theme. If you need to customize or extend them:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eOverride the JavaScript:\u003c/strong\u003e Copy the shortcut modules from \u003ccode\u003epkg/themes/default/static/js/\u003c/code\u003e to your \u003ccode\u003estatic/js/\u003c/code\u003e directory and modify as needed. The main files are:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003esearch-shortcuts.js\u003c/code\u003e - Search and modal shortcuts\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enavigation-shortcuts.js\u003c/code\u003e - Feed navigation shortcuts\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003escrolling-shortcuts.js\u003c/code\u003e - Scrolling shortcuts\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehistory-shortcuts.js\u003c/code\u003e - Browser history shortcuts\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eshortcuts-registry.js\u003c/code\u003e - Core registry system\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eAdd to the modal:\u003c/strong\u003e Override the \u003ccode\u003epartials/shortcuts-modal.html\u003c/code\u003e template to add your custom shortcuts.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eStyling:\u003c/strong\u003e The keyboard highlight class \u003ccode\u003e.kb-highlighted\u003c/code\u003e can be customized in your CSS:\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Custom highlight style */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ekb-highlighted\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eoutline\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"kc\"\u003esolid\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eprimary\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eoutline-offset\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003ergba\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eprimary\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ergb\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"javascript-api\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJavaScript API\u003c/span\u003e \u003ca href=\"#javascript-api\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe shortcuts system exposes functions for programmatic use:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Show toast notification\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkataShortcuts\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eshowToast\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Custom message\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Programmatic scrolling\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkataShortcuts\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esmoothScroll\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \u003cspan class=\"c1\"\u003e// Scroll down 100px\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkataShortcuts\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esmoothScrollToTop\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkataShortcuts\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esmoothScrollToBottom\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Copy URL\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkataShortcuts\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecopyUrlToClipboard\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Check if shortcuts are disabled\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkataShortcuts\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eareShortcutsDisabled\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e// Shortcuts are enabled\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Modal control\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkataShortcuts\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eshowShortcutsModal\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkataShortcuts\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehideShortcutsModal\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"browser-compatibility\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBrowser Compatibility\u003c/span\u003e \u003ca href=\"#browser-compatibility\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eKeyboard shortcuts work in all modern browsers:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eChrome/Edge 80+\u003c/li\u003e\n\u003cli\u003eFirefox 75+\u003c/li\u003e\n\u003cli\u003eSafari 13+\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe clipboard API (\u003ccode\u003eyy\u003c/code\u003e to copy URL) requires a secure context (HTTPS or localhost).\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/themes/\"\u003eThemes Guide\u003c/a\u003e - Theme customization including keyboard shortcuts\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfiguration Guide\u003c/a\u003e - Site configuration options\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/accessibility/\"\u003eAccessibility\u003c/a\u003e - Accessibility features and best practices\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nmarkata-go sites include comprehensive keyboard shortcuts for power users and those who prefer keyboard navigation. All shortcuts are designed to be intuitive, following conventions from popular tools like Vim and GitHub.\n\n\u003e **Accessibility:** Shortcuts respect user preferences and can be disabled. They never intercept keyboard input from form fields or focused interactive controls, so native Enter and Space activation continues to work.\n\n## Quick Reference\n\nPress `?` at any time to see the full shortcuts help modal.\n\n---\n\n## Scrolling\n\nNavigate through page content using vim-style shortcuts:\n\n| Shortcut | Action |\n|----------|--------|\n| `j` | Scroll down (~2 lines) |\n| `k` | Scroll up (~2 lines) |\n| `d` | Scroll half-page down |\n| `u` | Scroll half-page up |\n| `g g` | Scroll to top of page |\n| `Shift+G` | Scroll to bottom of page |\n\n**Note:** On feed/list pages with multiple posts, `j`/`k` will navigate between posts instead of scrolling.\n\n---\n\n## Feed Navigation\n\nWhen viewing a page with multiple posts (index, archive, tag pages), keyboard navigation lets you browse through posts:\n\n| Shortcut | Action |\n|----------|--------|\n| `j` or `Down Arrow` | Highlight next post |\n| `k` or `Up Arrow` | Highlight previous post |\n| `Enter` or `o` | Open highlighted post |\n| `Shift+O` | Open highlighted post in new tab |\n\nThe highlighted post is visually indicated with an outline. Press `Escape` to clear the highlight.\n\n---\n\n## Go-To Shortcuts\n\nGitHub-style two-key sequences for quick navigation:\n\n| Shortcut | Action |\n|----------|--------|\n| `g h` | Go to home page |\n| `g s` | Focus search input |\n\nPress the first key (`g`), then the second key within 800ms.\n\n---\n\n## Utility Shortcuts\n\n| Shortcut | Action |\n|----------|--------|\n| `/` | Focus search input |\n| `Cmd/Ctrl+K` | Focus search (alternative) |\n| `y y` | Copy current URL to clipboard |\n| `[` or `Shift+K` | Previous post in the current series/feed, or previous page on a feed |\n| `]` or `Shift+J` | Next post in the current series/feed, or next page on a feed |\n| `b` | Toggle the left sidebar drawer (series). Works at every width; hover a drawer handle to see its key |\n| `Shift+B` | Toggle the right sidebar drawer (on this page) |\n| `{` / `}` | Switch the sidebar to the previous / next primary feed |\n| `s` | On a post, toggle reader mode; on a feed, switch between simple and rich views |\n| `?` | Show shortcuts help modal |\n| `Escape` | Close modals and overlay drawers, clear highlight, blur inputs |\n\n---\n\n## Reader Mode\n\nOn a post, press `s` to hide the site header, footer, and sidebars and center a\nwider reading column without dimming the text. Press `s` again to restore the\nnormal layout. The address gains `?reader=1` while reader mode is active, so you\ncan bookmark or share that view. On feed pages, `s` switches between simple and\nrich views instead.\n\n---\n\n## Accessibility Features\n\n### Respects User Preferences\n\n- **Reduced Motion:** When `prefers-reduced-motion` is enabled, smooth scrolling is disabled for instant navigation.\n- **Input Context:** Shortcuts are automatically disabled when typing in text inputs, textareas, or contenteditable elements, including fields inside shadow DOM such as the `markata-go serve` settings sidebar.\n\n### Disable Shortcuts\n\nIf keyboard shortcuts interfere with your workflow or assistive technology:\n\n1. Press `?` to open the shortcuts modal\n2. Click \"Disable Shortcuts\"\n\nThis preference is saved in your browser and persists across visits.\n\n### Re-enable Shortcuts\n\n1. Press `?` (this still works even when shortcuts are disabled)\n2. Click \"Enable Shortcuts\"\n\n---\n\n## Customization\n\n### For Site Owners\n\nKeyboard shortcuts are part of the default theme. If you need to customize or extend them:\n\n1. **Override the JavaScript:** Copy the shortcut modules from `pkg/themes/default/static/js/` to your `static/js/` directory and modify as needed. The main files are:\n   - `search-shortcuts.js` - Search and modal shortcuts\n   - `navigation-shortcuts.js` - Feed navigation shortcuts\n   - `scrolling-shortcuts.js` - Scrolling shortcuts\n   - `history-shortcuts.js` - Browser history shortcuts\n   - `shortcuts-registry.js` - Core registry system\n\n2. **Add to the modal:** Override the `partials/shortcuts-modal.html` template to add your custom shortcuts.\n\n3. **Styling:** The keyboard highlight class `.kb-highlighted` can be customized in your CSS:\n\n```css\n/* Custom highlight style */\n.kb-highlighted {\n  outline: 3px solid var(--color-primary);\n  outline-offset: 4px;\n  background-color: rgba(var(--color-primary-rgb), 0.1);\n}\n```\n\n### JavaScript API\n\nThe shortcuts system exposes functions for programmatic use:\n\n```javascript\n// Show toast notification\nmarkataShortcuts.showToast('Custom message');\n\n// Programmatic scrolling\nmarkataShortcuts.smoothScroll(100);  // Scroll down 100px\nmarkataShortcuts.smoothScrollToTop();\nmarkataShortcuts.smoothScrollToBottom();\n\n// Copy URL\nmarkataShortcuts.copyUrlToClipboard();\n\n// Check if shortcuts are disabled\nif (!markataShortcuts.areShortcutsDisabled()) {\n  // Shortcuts are enabled\n}\n\n// Modal control\nmarkataShortcuts.showShortcutsModal();\nmarkataShortcuts.hideShortcutsModal();\n```\n\n---\n\n## Browser Compatibility\n\nKeyboard shortcuts work in all modern browsers:\n\n- Chrome/Edge 80+\n- Firefox 75+\n- Safari 13+\n\nThe clipboard API (`yy` to copy URL) requires a secure context (HTTPS or localhost).\n\n---\n\n## See Also\n\n- [Themes Guide](/docs/guides/themes/) - Theme customization including keyboard shortcuts\n- [Configuration Guide](/docs/guides/configuration/) - Site configuration options\n- [Accessibility](/docs/guides/accessibility/) - Accessibility features and best practices\n",
      "summary": "Complete guide to keyboard shortcuts for navigating markata-go sites",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "accessibility",
        "keyboard",
        "navigation"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/garden/",
      "url": "https://markata.dev/docs/guides/garden/",
      "title": "Garden View",
      "content_html": "\u003cp\u003eThe garden view plugin generates a knowledge graph of your site\u0026rsquo;s content, showing how posts relate through tags and internal links. It exports the graph as JSON and renders an interactive garden page.\u003c/p\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe garden view is enabled by default. After building your site, you\u0026rsquo;ll find:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/garden/graph.json\u003c/code\u003e \u0026ndash; the full knowledge graph as JSON\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/garden/index.html\u003c/code\u003e \u0026ndash; an HTML page showing tag clusters\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eNo configuration is needed for the default behavior.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd a \u003ccode\u003e[markata-go.garden]\u003c/code\u003e section to your config file to customize the garden view:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egarden\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Enable the garden view (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epath\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;garden\u0026#34;\u003c/span\u003e             \u003cspan class=\"c\"\u003e# Output path prefix (default: \u0026#34;garden\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexport_json\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Emit graph.json (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erender_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Generate garden/index.html (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_tags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e         \u003cspan class=\"c\"\u003e# Include tag nodes in graph (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_posts\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Include post nodes in graph (default: true)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_nodes\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2000\u003c/span\u003e            \u003cspan class=\"c\"\u003e# Maximum number of nodes (default: 2000)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude_tags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e           \u003cspan class=\"c\"\u003e# Tags to exclude from graph (default: [])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;garden.html\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Template for the garden page (default: \u0026#34;garden.html\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Garden\u0026#34;\u003c/span\u003e            \u003cspan class=\"c\"\u003e# Page title (default: \u0026#34;Garden\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e            \u003cspan class=\"c\"\u003e# Page description (default: \u0026#34;\u0026#34;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"graph-json\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGraph JSON\u003c/span\u003e \u003ca href=\"#graph-json\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ccode\u003egraph.json\u003c/code\u003e file contains the full knowledge graph with nodes and edges:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;nodes\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;post:my-post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;label\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Post Title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;href\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/my-post/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;tags\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorial\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2024-01-15T00:00:00Z\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;A short description\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tag:go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tag\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;label\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;href\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/tags/go/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;count\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e12\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;edges\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;post:my-post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;target\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;post:another-post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;link\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;post:my-post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;target\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tag:go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tag\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tag:go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;target\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tag:tutorial\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;co-occurrence\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;weight\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"node-types\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNode Types\u003c/span\u003e \u003ca href=\"#node-types\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eID Format\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epost:\u0026lt;slug\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eA published post\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etag\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etag:\u0026lt;name\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eA tag used by one or more posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"edge-types\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEdge Types\u003c/span\u003e \u003ca href=\"#edge-types\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eSource -\u0026gt; Target\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elink\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003epost -\u0026gt; post\u003c/td\u003e\n\u003ctd\u003eInternal link from one post to another\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etag\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003epost -\u0026gt; tag\u003c/td\u003e\n\u003ctd\u003ePost belongs to tag\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eco-occurrence\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003etag -\u0026gt; tag\u003c/td\u003e\n\u003ctd\u003eTags appear together on posts (weighted)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"tag-clusters\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTag Clusters\u003c/span\u003e \u003ca href=\"#tag-clusters\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe garden page shows tags grouped with their related tags. Two tags are \u0026ldquo;related\u0026rdquo; when they appear on the same post (co-occurrence). The more posts they share, the stronger the relationship.\u003c/p\u003e\n\u003cp\u003eTags are sorted by post count (most used first), and related tags are listed by co-occurrence weight (highest first).\u003c/p\u003e\n\u003cp\u003eThe default garden page also includes a graph preview that uses \u003ccode\u003egraph.json\u003c/code\u003e to show top tags, their strongest relationships, and (optionally) recent posts. Post templates can add a compact preview that focuses on a single post and its connections.\u003c/p\u003e\n\u003ch3 id=\"post-graph-preview\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePost Graph Preview\u003c/span\u003e \u003ca href=\"#post-graph-preview\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd the post-level graph component to show a small connections graph for the current entry. The component uses \u003ccode\u003egraph_json\u003c/code\u003e plus \u003ccode\u003epost.href\u003c/code\u003e to fetch and filter the node set down to direct connections (the post itself and its related tags/posts).\u003c/p\u003e\n\u003cp\u003eIn your post template, include:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% include \u0026#34;components/post_graph.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe preview automatically hides when the post is not present in \u003ccode\u003egraph.json\u003c/code\u003e or has no connections.\u003c/p\u003e\n\u003cp\u003eWhen the preview is not rendered, its JavaScript is not loaded either, which keeps ordinary article pages lighter.\u003c/p\u003e\n\u003cp\u003eWhen view transitions are enabled, the preview also re-initializes after client-side page swaps, so navigating between posts does not require a hard refresh to render the graph.\u003c/p\u003e\n\u003ch2 id=\"filtering\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFiltering\u003c/span\u003e \u003ca href=\"#filtering\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePosts are included in the garden graph only if all of the following are true:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003epublished\u003c/code\u003e is \u003ccode\u003etrue\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edraft\u003c/code\u003e is \u003ccode\u003efalse\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eprivate\u003c/code\u003e is \u003ccode\u003efalse\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eskip\u003c/code\u003e is \u003ccode\u003efalse\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eNone of the post\u0026rsquo;s tags are in the \u003ccode\u003eexclude_tags\u003c/code\u003e list\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"node-limit\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNode Limit\u003c/span\u003e \u003ca href=\"#node-limit\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf the total number of nodes exceeds \u003ccode\u003emax_nodes\u003c/code\u003e, the plugin removes the least-used tags first. Posts are never removed by the node limit. Edges referencing removed nodes are also pruned.\u003c/p\u003e\n\u003ch2 id=\"excluding-tags\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExcluding Tags\u003c/span\u003e \u003ca href=\"#excluding-tags\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse \u003ccode\u003eexclude_tags\u003c/code\u003e to remove specific tags from the graph entirely. Posts with excluded tags are also excluded:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egarden\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eexclude_tags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;draft-ideas\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;internal\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"custom-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Templates\u003c/span\u003e \u003ca href=\"#custom-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOverride the garden page by creating a \u003ccode\u003egarden.html\u003c/code\u003e in your templates directory. The template receives these context variables:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003ePage title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edescription\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003ePage description\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egraph_json\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eURL path to graph.json\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etag_clusters\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]TagCluster\u003c/td\u003e\n\u003ctd\u003eTag groups with related tags\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etotal_posts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eNumber of post nodes in the graph\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etotal_tags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eNumber of tag nodes in the graph\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etotal_edges\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eNumber of edges in the graph\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eEach \u003ccode\u003eTagCluster\u003c/code\u003e has:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eName\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eTag name\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCount\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eNumber of posts with this tag\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eHref\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eURL to the tag listing page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eRelated\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]TagRelation\u003c/td\u003e\n\u003ctd\u003eRelated tags with co-occurrence\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eEach \u003ccode\u003eTagRelation\u003c/code\u003e has:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eName\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRelated tag name\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCount\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eNumber of shared posts (edge weight)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eHref\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eURL to the related tag listing page\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"using-graph-json-with-visualization-libraries\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing graph.json with Visualization Libraries\u003c/span\u003e \u003ca href=\"#using-graph-json-with-visualization-libraries\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe graph.json file is designed to work with JavaScript graph visualization libraries. Here is an example using D3.js:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://d3js.org/d3.v7.min.js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efetch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;/garden/graph.json\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ethen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003er\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ethen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e// data.nodes and data.edges are ready for D3 force layout\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003esimulation\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ed3\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eforceSimulation\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enodes\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eforce\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;link\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ed3\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eforceLink\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eedges\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003ed\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eforce\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;charge\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ed3\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eforceManyBody\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eforce\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;center\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ed3\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eforceCenter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ewidth\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eheight\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"disabling-the-garden\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDisabling the Garden\u003c/span\u003e \u003ca href=\"#disabling-the-garden\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTo disable the garden view entirely:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egarden\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo keep the JSON export but skip the HTML page:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egarden\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erender_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n\nThe garden view plugin generates a knowledge graph of your site's content, showing how posts relate through tags and internal links. It exports the graph as JSON and renders an interactive garden page.\n\n## Quick Start\n\nThe garden view is enabled by default. After building your site, you'll find:\n\n- `/garden/graph.json` -- the full knowledge graph as JSON\n- `/garden/index.html` -- an HTML page showing tag clusters\n\nNo configuration is needed for the default behavior.\n\n## Configuration\n\nAdd a `[markata-go.garden]` section to your config file to customize the garden view:\n\n```toml\n[markata-go.garden]\nenabled = true              # Enable the garden view (default: true)\npath = \"garden\"             # Output path prefix (default: \"garden\")\nexport_json = true          # Emit graph.json (default: true)\nrender_page = true          # Generate garden/index.html (default: true)\ninclude_tags = true         # Include tag nodes in graph (default: true)\ninclude_posts = true        # Include post nodes in graph (default: true)\nmax_nodes = 2000            # Maximum number of nodes (default: 2000)\nexclude_tags = []           # Tags to exclude from graph (default: [])\ntemplate = \"garden.html\"    # Template for the garden page (default: \"garden.html\")\ntitle = \"Garden\"            # Page title (default: \"Garden\")\ndescription = \"\"            # Page description (default: \"\")\n```\n\n## Graph JSON\n\nThe `graph.json` file contains the full knowledge graph with nodes and edges:\n\n```json\n{\n  \"nodes\": [\n    {\n      \"id\": \"post:my-post\",\n      \"type\": \"post\",\n      \"label\": \"My Post Title\",\n      \"href\": \"/my-post/\",\n      \"tags\": [\"go\", \"tutorial\"],\n      \"date\": \"2024-01-15T00:00:00Z\",\n      \"description\": \"A short description\"\n    },\n    {\n      \"id\": \"tag:go\",\n      \"type\": \"tag\",\n      \"label\": \"go\",\n      \"href\": \"/tags/go/\",\n      \"count\": 12\n    }\n  ],\n  \"edges\": [\n    {\n      \"source\": \"post:my-post\",\n      \"target\": \"post:another-post\",\n      \"type\": \"link\"\n    },\n    {\n      \"source\": \"post:my-post\",\n      \"target\": \"tag:go\",\n      \"type\": \"tag\"\n    },\n    {\n      \"source\": \"tag:go\",\n      \"target\": \"tag:tutorial\",\n      \"type\": \"co-occurrence\",\n      \"weight\": 5\n    }\n  ]\n}\n```\n\n### Node Types\n\n| Type   | ID Format        | Description                    |\n|--------|------------------|--------------------------------|\n| `post` | `post:\u003cslug\u003e`    | A published post               |\n| `tag`  | `tag:\u003cname\u003e`     | A tag used by one or more posts|\n\n### Edge Types\n\n| Type            | Source -\u003e Target | Description                              |\n|-----------------|------------------|------------------------------------------|\n| `link`          | post -\u003e post     | Internal link from one post to another   |\n| `tag`           | post -\u003e tag      | Post belongs to tag                      |\n| `co-occurrence` | tag -\u003e tag       | Tags appear together on posts (weighted) |\n\n## Tag Clusters\n\nThe garden page shows tags grouped with their related tags. Two tags are \"related\" when they appear on the same post (co-occurrence). The more posts they share, the stronger the relationship.\n\nTags are sorted by post count (most used first), and related tags are listed by co-occurrence weight (highest first).\n\nThe default garden page also includes a graph preview that uses `graph.json` to show top tags, their strongest relationships, and (optionally) recent posts. Post templates can add a compact preview that focuses on a single post and its connections.\n\n### Post Graph Preview\n\nAdd the post-level graph component to show a small connections graph for the current entry. The component uses `graph_json` plus `post.href` to fetch and filter the node set down to direct connections (the post itself and its related tags/posts).\n\nIn your post template, include:\n\n```html\n{% include \"components/post_graph.html\" %}\n```\n\nThe preview automatically hides when the post is not present in `graph.json` or has no connections.\n\nWhen the preview is not rendered, its JavaScript is not loaded either, which keeps ordinary article pages lighter.\n\nWhen view transitions are enabled, the preview also re-initializes after client-side page swaps, so navigating between posts does not require a hard refresh to render the graph.\n\n## Filtering\n\nPosts are included in the garden graph only if all of the following are true:\n\n- `published` is `true`\n- `draft` is `false`\n- `private` is `false`\n- `skip` is `false`\n- None of the post's tags are in the `exclude_tags` list\n\n## Node Limit\n\nIf the total number of nodes exceeds `max_nodes`, the plugin removes the least-used tags first. Posts are never removed by the node limit. Edges referencing removed nodes are also pruned.\n\n## Excluding Tags\n\nUse `exclude_tags` to remove specific tags from the graph entirely. Posts with excluded tags are also excluded:\n\n```toml\n[markata-go.garden]\nexclude_tags = [\"draft-ideas\", \"internal\"]\n```\n\n## Custom Templates\n\nOverride the garden page by creating a `garden.html` in your templates directory. The template receives these context variables:\n\n| Variable       | Type          | Description                       |\n|----------------|---------------|-----------------------------------|\n| `title`        | string        | Page title                        |\n| `description`  | string        | Page description                  |\n| `graph_json`   | string        | URL path to graph.json            |\n| `tag_clusters` | []TagCluster  | Tag groups with related tags      |\n| `total_posts`  | int           | Number of post nodes in the graph |\n| `total_tags`   | int           | Number of tag nodes in the graph  |\n| `total_edges`  | int           | Number of edges in the graph      |\n\nEach `TagCluster` has:\n\n| Field     | Type          | Description                         |\n|-----------|---------------|-------------------------------------|\n| `Name`    | string        | Tag name                            |\n| `Count`   | int           | Number of posts with this tag       |\n| `Href`    | string        | URL to the tag listing page         |\n| `Related` | []TagRelation | Related tags with co-occurrence     |\n\nEach `TagRelation` has:\n\n| Field   | Type   | Description                                |\n|---------|--------|--------------------------------------------|\n| `Name`  | string | Related tag name                            |\n| `Count` | int    | Number of shared posts (edge weight)       |\n| `Href`  | string | URL to the related tag listing page        |\n\n## Using graph.json with Visualization Libraries\n\nThe graph.json file is designed to work with JavaScript graph visualization libraries. Here is an example using D3.js:\n\n```html\n\u003cscript src=\"https://d3js.org/d3.v7.min.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\nfetch('/garden/graph.json')\n  .then(r =\u003e r.json())\n  .then(data =\u003e {\n    // data.nodes and data.edges are ready for D3 force layout\n    const simulation = d3.forceSimulation(data.nodes)\n      .force('link', d3.forceLink(data.edges).id(d =\u003e d.id))\n      .force('charge', d3.forceManyBody())\n      .force('center', d3.forceCenter(width / 2, height / 2));\n  });\n\u003c/script\u003e\n```\n\n## Disabling the Garden\n\nTo disable the garden view entirely:\n\n```toml\n[markata-go.garden]\nenabled = false\n```\n\nTo keep the JSON export but skip the HTML page:\n\n```toml\n[markata-go.garden]\nrender_page = false\n```\n",
      "summary": "Explore your content as a knowledge graph with tag clusters and relationship visualization",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "garden",
        "knowledge-graph"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/frontmatter/",
      "url": "https://markata.dev/docs/guides/frontmatter/",
      "title": "Frontmatter Guide",
      "content_html": "\u003ch2 id=\"frontmatter\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFrontmatter\u003c/span\u003e \u003ca href=\"#frontmatter\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFrontmatter is the \u003cstrong\u003emetadata block\u003c/strong\u003e at the top of your Markdown files that tells markata-go how to process, display, and organize your content. This guide covers everything you need to know about using frontmatter effectively.\u003c/p\u003e\n\u003cp\u003eIn the workbench editor, press \u003cstrong\u003eCtrl+Space\u003c/strong\u003e to request metadata completion.\nKnown field values are suggested while editing scalar values and YAML list\nitems, including existing site tags.\u003c/p\u003e\n\u003ch2 id=\"table-of-contents\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTable of Contents\u003c/span\u003e \u003ca href=\"#table-of-contents\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#what-is-frontmatter\"\u003eWhat is Frontmatter?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#basic-frontmatter-fields\"\u003eBasic Frontmatter Fields\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#complete-field-reference\"\u003eComplete Field Reference\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#custom-fields-extra\"\u003eCustom Fields (Extra)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#examples\"\u003eExamples\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#common-patterns\"\u003eCommon Patterns\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#frontmatter-in-filtering\"\u003eFrontmatter in Filtering\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"what-is-frontmatter\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat is Frontmatter?\u003c/span\u003e \u003ca href=\"#what-is-frontmatter\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFrontmatter is \u003cstrong\u003eYAML metadata\u003c/strong\u003e placed at the very top of a Markdown file, enclosed between two lines of three dashes (\u003ccode\u003e---\u003c/code\u003e). It defines properties like the post\u0026rsquo;s title, date, tags, and any custom data you want to associate with the content.\u003c/p\u003e\n\u003ch3 id=\"visual-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVisual Example\u003c/span\u003e \u003ca href=\"#visual-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Getting Started with Go\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ego\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003etutorial\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ebeginners\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;A beginner-friendly introduction to Go programming.\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Welcome to Go!\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis is where your actual content begins...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"how-markata-go-parses-frontmatter\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow markata-go Parses Frontmatter\u003c/span\u003e \u003ca href=\"#how-markata-go-parses-frontmatter\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen markata-go processes your Markdown files, it:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eDetects the opening delimiter\u003c/strong\u003e - Looks for \u003ccode\u003e---\u003c/code\u003e at the very start of the file\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eExtracts the YAML block\u003c/strong\u003e - Reads everything until the closing \u003ccode\u003e---\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eParses the YAML\u003c/strong\u003e - Converts the metadata into structured data\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSeparates the content\u003c/strong\u003e - Everything after the second \u003ccode\u003e---\u003c/code\u003e becomes the post body\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eImportant notes:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe opening \u003ccode\u003e---\u003c/code\u003e must be on the very first line of the file\u003c/li\u003e\n\u003cli\u003eThe closing \u003ccode\u003e---\u003c/code\u003e must be on its own line\u003c/li\u003e\n\u003cli\u003eContent before the opening \u003ccode\u003e---\u003c/code\u003e or malformed delimiters will cause errors\u003c/li\u003e\n\u003cli\u003eFiles without frontmatter are valid - they\u0026rsquo;ll use default values\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"valid-frontmatter\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eValid Frontmatter\u003c/span\u003e \u003ca href=\"#valid-frontmatter\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eMy Post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent here\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"invalid-frontmatter-missing-closing-delimiter\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInvalid Frontmatter (Missing Closing Delimiter)\u003c/span\u003e \u003ca href=\"#invalid-frontmatter-missing-closing-delimiter\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etitle: My Post\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent here (ERROR: unclosed frontmatter)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"no-frontmatter-also-valid\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNo Frontmatter (Also Valid)\u003c/span\u003e \u003ca href=\"#no-frontmatter-also-valid\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# My Post\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent starts immediately - defaults will be used.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"basic-frontmatter-fields\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Frontmatter Fields\u003c/span\u003e \u003ca href=\"#basic-frontmatter-fields\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThese are the core fields that markata-go recognizes and uses directly.\u003c/p\u003e\n\u003ch3 id=\"title-string\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003etitle (string)\u003c/span\u003e \u003ca href=\"#title-string\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe display title of your post.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Understanding Goroutines\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eType:\u003c/strong\u003e string\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDefault:\u003c/strong\u003e None (derived from filename if not set)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUsed for:\u003c/strong\u003e Page title, \u003ccode\u003e\u0026lt;title\u0026gt;\u003c/code\u003e tag, feed listings, slug generation\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIf not provided, the slug is derived from the filename instead.\u003c/p\u003e\n\u003cp\u003eTitles also accept HTML character references. markata-go decodes references\nbefore rendering, so \u003ccode\u003eIt\u0026amp;rsquo;s just the Carpet\u0026amp;hellip;\u003c/code\u003e displays as\n\u003ccode\u003eIt’s just the Carpet…\u003c/code\u003e instead of showing the entity names. Use\n\u003ccode\u003etitle_text\u003c/code\u003e in custom templates when you need the plain-text title.\u003c/p\u003e\n\u003ch3 id=\"slug-string\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eslug (string)\u003c/span\u003e \u003ca href=\"#slug-string\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe URL-safe identifier for your post. Determines the URL path.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;understanding-goroutines\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eType:\u003c/strong\u003e string\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDefault:\u003c/strong\u003e Auto-generated from \u003ccode\u003etitle\u003c/code\u003e (or filename if no title)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUsed for:\u003c/strong\u003e URL path (\u003ccode\u003e/understanding-goroutines/\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eAuto-generation rules:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eConverts to lowercase\u003c/li\u003e\n\u003cli\u003eReplaces spaces with hyphens\u003c/li\u003e\n\u003cli\u003eRemoves special characters\u003c/li\u003e\n\u003cli\u003eCollapses multiple hyphens\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# These titles produce these slugs:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Hello World!\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c\"\u003e# slug: hello-world\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Go\u0026#39;s Best Features\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# slug: gos-best-features\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Part 1: The Basics\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# slug: part-1-the-basics\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"custom-slugs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Slugs\u003c/span\u003e \u003ca href=\"#custom-slugs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eYou can explicitly set any slug in frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Simple custom slug\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emy-custom-url\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Nested path (creates /docs/api/overview/)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edocs/api/overview\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Leading/trailing slashes are automatically stripped\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/about/           \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# becomes: about\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/docs/guides/     \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# becomes: docs/guides\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"homepage-from-custom-slug\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHomepage from Custom Slug\u003c/span\u003e \u003ca href=\"#homepage-from-custom-slug\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eAny post can become the homepage by setting an empty or slash slug:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Welcome to My Site\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e                    \u003c/span\u003e\u003cspan class=\"c\"\u003e# This post becomes the homepage at /\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003eWelcome to my site!\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr equivalently:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Welcome to My Site\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/                    \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Also becomes the homepage at /\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis is useful when you want a custom homepage from content in any directory, rather than using a feed or \u003ccode\u003eindex.md\u003c/code\u003e at the root.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eNote:\u003c/strong\u003e If multiple posts have the same slug (including empty slug for homepage), the build will fail with a path conflict error to prevent accidental overwrites.\u003c/p\u003e\n\u003ch4 id=\"special-case-index-md-files\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSpecial Case: \u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003eindex.md\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e Files\u003c/span\u003e \u003ca href=\"#special-case-index-md-files\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eFiles named \u003ccode\u003eindex.md\u003c/code\u003e automatically generate slugs based on their directory:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFile Path\u003c/th\u003e\n\u003cth\u003eAuto-Generated Slug\u003c/th\u003e\n\u003cth\u003eURL\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e./index.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e (empty)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/\u003c/code\u003e (homepage)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edocs/index.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edocs\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/docs/\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eblog/guides/index.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eblog/guides\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/blog/guides/\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThis allows directory-based URL structures without needing to set explicit slugs.\u003c/p\u003e\n\u003ch3 id=\"date-date\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003edate (date)\u003c/span\u003e \u003ca href=\"#date-date\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe publication date of the post.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eType:\u003c/strong\u003e date (YYYY-MM-DD format recommended)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDefault:\u003c/strong\u003e None\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUsed for:\u003c/strong\u003e Sorting, display, feeds, scheduled publishing\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eSupported date formats:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003emarkata-go supports a wide variety of date formats for maximum flexibility:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# ISO 8601 formats (recommended)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e                    \u003c/span\u003e\u003cspan class=\"c\"\u003e# Date only\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15T10:30:00\u003c/span\u003e\u003cspan class=\"w\"\u003e           \u003c/span\u003e\u003cspan class=\"c\"\u003e# With time\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15T10:30:00Z\u003c/span\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"c\"\u003e# With UTC timezone\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15T10:30:00\u003c/span\u003e\u003cspan class=\"m\"\u003e+05\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"m\"\u003e00\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"c\"\u003e# With timezone offset\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15 10:30:00\u003c/span\u003e\u003cspan class=\"w\"\u003e           \u003c/span\u003e\u003cspan class=\"c\"\u003e# With space separator\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"m\"\u003e30\u003c/span\u003e\u003cspan class=\"w\"\u003e              \u003c/span\u003e\u003cspan class=\"c\"\u003e# Without seconds\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Single-digit hours (automatically normalized)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"m\"\u003e30\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"m\"\u003e00\u003c/span\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c\"\u003e# 1am\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e9\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"m\"\u003e30\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"m\"\u003e00\u003c/span\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c\"\u003e# 9am\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Slash-separated dates\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e2024\u003c/span\u003e\u003cspan class=\"l\"\u003e/01/15                   \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# YYYY/MM/DD\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e2024\u003c/span\u003e\u003cspan class=\"l\"\u003e/01/15 10:30:00          \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# With time\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e01\u003c/span\u003e\u003cspan class=\"l\"\u003e/15/2024                   \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# MM/DD/YYYY (US format)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Named month formats\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eJanuary 15, 2024             \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Full month name\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eJan 15, 2024                 \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Abbreviated month\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e15\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eJanuary 2024              \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Day first\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e15\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eJan 2024                  \u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Day first, abbreviated\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# European format\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e15-01-2024\u003c/span\u003e\u003cspan class=\"w\"\u003e                    \u003c/span\u003e\u003cspan class=\"c\"\u003e# DD-MM-YYYY\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eNote:\u003c/strong\u003e Malformed time components are automatically corrected. For example, \u003ccode\u003e2024-01-15 8:011:00\u003c/code\u003e (typo) will be parsed as \u003ccode\u003e2024-01-15 08:11:00\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"published-boolean\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003epublished (boolean)\u003c/span\u003e \u003ca href=\"#published-boolean\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhether the post should be included in public feeds and listings.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eType:\u003c/strong\u003e boolean\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDefault:\u003c/strong\u003e \u003ccode\u003efalse\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUsed for:\u003c/strong\u003e Filtering posts in feeds, sitemaps, and RSS\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eShadow Pages:\u003c/strong\u003e Posts with \u003ccode\u003epublished: false\u003c/code\u003e are still rendered to HTML and accessible via direct URL. They become \u0026ldquo;shadow pages\u0026rdquo; - accessible but not discoverable through normal site navigation.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e\u003ccode\u003epublished\u003c/code\u003e\u003c/th\u003e\n\u003cth\u003eBehavior\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRendered + included in feeds, sitemaps, RSS\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRendered as \u0026ldquo;shadow page\u0026rdquo; + NOT in feeds, sitemaps, RSS\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eUse cases for shadow pages:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDraft content accessible to reviewers via direct URL\u003c/li\u003e\n\u003cli\u003ePrivate documentation not linked publicly\u003c/li\u003e\n\u003cli\u003eWork-in-progress content shared with specific people\u003c/li\u003e\n\u003cli\u003eAdmin pages or staging content\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eAccepted values:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# or: yes, on\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"c\"\u003e# or: no, off\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"draft-boolean\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003edraft (boolean)\u003c/span\u003e \u003ca href=\"#draft-boolean\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eMarks the post as a work-in-progress that should NOT be rendered at all.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edraft\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eType:\u003c/strong\u003e boolean\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDefault:\u003c/strong\u003e \u003ccode\u003efalse\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUsed for:\u003c/strong\u003e Truly private content that shouldn\u0026rsquo;t be accessible\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eImportant:\u003c/strong\u003e Posts with \u003ccode\u003edraft: true\u003c/code\u003e are \u003cstrong\u003enever rendered\u003c/strong\u003e to HTML. Use this for content you don\u0026rsquo;t want accessible at all, even via direct URL.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e\u003ccode\u003edraft\u003c/code\u003e\u003c/th\u003e\n\u003cth\u003eBehavior\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eContent is rendered (visibility depends on \u003ccode\u003epublished\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eContent is NOT rendered at all\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eComparison with \u003ccode\u003epublished\u003c/code\u003e:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eScenario\u003c/th\u003e\n\u003cth\u003e\u003ccode\u003epublished\u003c/code\u003e\u003c/th\u003e\n\u003cth\u003e\u003ccode\u003edraft\u003c/code\u003e\u003c/th\u003e\n\u003cth\u003eRendered?\u003c/th\u003e\n\u003cth\u003eIn Feeds?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003ePublic post\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eShadow page\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePrivate WIP\u003c/td\u003e\n\u003ctd\u003eany\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"tags-list\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003etags (list)\u003c/span\u003e \u003ca href=\"#tags-list\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eA list of tags for categorizing the post.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ego\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003econcurrency\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003etutorial\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr inline format:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003ego, concurrency, tutorial]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor compatibility with older content, \u003ccode\u003etags: go\u003c/code\u003e is also accepted as a single tag. Diagnostics still warns about scalar shorthand and recommends a list, which is the canonical form.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eType:\u003c/strong\u003e list of strings\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDefault:\u003c/strong\u003e \u003ccode\u003e[]\u003c/code\u003e (empty list)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUsed for:\u003c/strong\u003e Filtering, tag pages, SEO, organization\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"description-string\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003edescription (string)\u003c/span\u003e \u003ca href=\"#description-string\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eA brief summary of the post content.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Learn how to use goroutines for concurrent programming in Go.\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eType:\u003c/strong\u003e string\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDefault:\u003c/strong\u003e Auto-generated from first ~160 characters of content\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUsed for:\u003c/strong\u003e Meta description, SEO, social previews\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eNote:\u003c/strong\u003e The \u003ccode\u003edescription\u003c/code\u003e field is no longer used for article card excerpts in feeds. Excerpts are now auto-generated from your content (first 3 paragraphs or 1500 characters). However, \u003ccode\u003edescription\u003c/code\u003e may still be used for SEO meta tags and RSS feeds.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAuto-generation:\u003c/strong\u003e If not provided, markata-go extracts the first paragraph or ~160 characters from your content (with HTML tags stripped).\u003c/p\u003e\n\u003ch3 id=\"template-string\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003etemplate (string)\u003c/span\u003e \u003ca href=\"#template-string\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe HTML template file to use for rendering this post.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tutorial.html\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eType:\u003c/strong\u003e string\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDefault:\u003c/strong\u003e \u003ccode\u003e\u0026quot;post.html\u0026quot;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUsed for:\u003c/strong\u003e Custom layouts per post\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTemplates are looked up in:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003etemplates/\u003c/code\u003e directory in your project\u003c/li\u003e\n\u003cli\u003eTheme templates\u003c/li\u003e\n\u003cli\u003eDefault theme fallback\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eExample built-in template choices include \u003ccode\u003epost.html\u003c/code\u003e, \u003ccode\u003elanding.html\u003c/code\u003e, \u003ccode\u003edocs.html\u003c/code\u003e, and \u003ccode\u003eslides.html\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eslides.html\u003c/code\u003e is intended for presentation decks and pairs well with the shared assets system when you want to self-host Reveal.js.\u003c/p\u003e\n\u003ch3 id=\"content_width-string\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003econtent_width (string)\u003c/span\u003e \u003ca href=\"#content_width-string\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSet \u003ccode\u003econtent_width: wide\u003c/code\u003e to opt a default-theme \u003ccode\u003epost.html\u003c/code\u003e page into a wider\nstory frame, a larger balanced title, and a lead opening paragraph. It pairs\nwith \u003ccode\u003emd-section\u003c/code\u003e for sticky section heads and \u003ccode\u003emd-grid rail\u003c/code\u003e for overview\ncards. Unset or unknown values keep the normal layout. Custom templates must\nprovide their own support. See \u003ca href=\"/docs/guides/markdown-containers/#markdown-story-pages\"\u003eMarkdown story pages\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"complete-field-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComplete Field Reference\u003c/span\u003e \u003ca href=\"#complete-field-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eRequired\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eNone\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eDisplay title of the post\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eslug\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eAuto-generated\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eURL path identifier\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edate\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003edate\u003c/td\u003e\n\u003ctd\u003eNone\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003ePublication date (YYYY-MM-DD)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emodified\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003edate\u003c/td\u003e\n\u003ctd\u003eNone\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eLast modified date (YYYY-MM-DD)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epublished\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eWhether to include in public feeds\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edraft\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eWhether this is a work-in-progress\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eList of categorization tags\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edescription\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eAuto-generated\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eBrief summary for SEO/meta tags\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etemplate\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;post.html\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eTemplate file to use for rendering\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econtent_width\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eNormal theme width\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ewide\u003c/code\u003e opts a default-theme post into story layout\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eskip\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eSkip this file during processing entirely\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eauthors\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eList of author IDs (multi-author support)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eauthor\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eNone\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eLegacy single-author name or ID\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eby\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eNone\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eAlias for \u003ccode\u003eauthor\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewriter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eNone\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eAlias for \u003ccode\u003eauthor\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"date-field-aliases\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDate Field Aliases\u003c/span\u003e \u003ca href=\"#date-field-aliases\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor compatibility with other static site generators, markata-go supports multiple frontmatter keys:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePublication date aliases:\u003c/strong\u003e \u003ccode\u003epublishdate\u003c/code\u003e, \u003ccode\u003edate\u003c/code\u003e, \u003ccode\u003epubdate\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eModified date aliases:\u003c/strong\u003e \u003ccode\u003elastmod\u003c/code\u003e, \u003ccode\u003emodified\u003c/code\u003e, \u003ccode\u003eupdated\u003c/code\u003e, \u003ccode\u003eupdated_at\u003c/code\u003e, \u003ccode\u003elast_modified\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eWhen multiple aliases are provided, the \u003cstrong\u003efirst listed wins\u003c/strong\u003e. This precedence matches common SSG conventions.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# All of these set the publication date:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublishdate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epubdate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# All of these set the modified date:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003elastmod\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-02-20\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emodified\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-02-20\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eupdated\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-02-20\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eupdated_at\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-02-20\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003elast_modified\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-02-20\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"field-details\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eField Details\u003c/span\u003e \u003ca href=\"#field-details\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"skip\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eskip\u003c/span\u003e \u003ca href=\"#skip\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eCompletely exclude a file from processing:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eskip\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse this for files you want to keep in your content directory but never process (notes, drafts not ready for review, etc.).\u003c/p\u003e\n\u003ch4 id=\"authors\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eauthors\u003c/span\u003e \u003ca href=\"#authors\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eAssign one or more authors to a post by referencing author IDs defined in your site configuration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Collaborative Article\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ewaylon\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003eguest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEach author ID is resolved against the \u003ccode\u003e[markata-go.authors.authors]\u003c/code\u003e config map during the build. Resolved author objects (with name, avatar, role, bio, etc.) are available in templates as \u003ccode\u003epost.author_objects\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eYou can use the extended format to specify per-post roles and details for each author:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Collaborative Article\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewaylon\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erole\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eauthor\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edetails\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrote the introduction and conclusion\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecodex\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erole\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epair programmer\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edetails\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrote the code examples\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ekimmi\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erole\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eoutliner\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe \u003ccode\u003erole\u003c/code\u003e overrides the author\u0026rsquo;s config-level role for this post only. The \u003ccode\u003edetails\u003c/code\u003e field provides a short description of what the author did on this specific post, displayed as a tooltip when hovering over the author\u0026rsquo;s name in the byline. Both fields are optional and can be used independently.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eKey aliases:\u003c/strong\u003e For convenience, the extended format supports aliases so you can use whichever key name feels natural:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCanonical Key\u003c/th\u003e\n\u003cth\u003eAliases\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eid\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ename\u003c/code\u003e, \u003ccode\u003ehandle\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erole\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ejob\u003c/code\u003e, \u003ccode\u003eposition\u003c/code\u003e, \u003ccode\u003epart\u003c/code\u003e, \u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edetails\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edetail\u003c/code\u003e, \u003ccode\u003edescription\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eFor example, these are all equivalent:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewaylon\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emaintainer\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuilt the feature\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# same as:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewaylon\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erole\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emaintainer\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edetails\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuilt the feature\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe canonical key always takes precedence when both it and an alias are present.\u003c/p\u003e\n\u003cp\u003eYou can mix simple string IDs and extended format in the same array:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthors\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ewaylon\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecodex\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erole\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eeditor\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edetails\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ereviewed and edited the draft\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf no \u003ccode\u003eauthors\u003c/code\u003e or \u003ccode\u003eauthor\u003c/code\u003e field is set, the default author from config (the one with \u003ccode\u003edefault = true\u003c/code\u003e) is assigned automatically.\u003c/p\u003e\n\u003ch4 id=\"author\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eauthor\u003c/span\u003e \u003ca href=\"#author\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eLegacy single-author field. Use this for simple sites or backward compatibility:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Solo Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Jane Doe\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eAliases:\u003c/strong\u003e The \u003ccode\u003eby\u003c/code\u003e and \u003ccode\u003ewriter\u003c/code\u003e frontmatter fields are aliases for \u003ccode\u003eauthor\u003c/code\u003e. This allows more natural frontmatter syntax:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Solo Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eby\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Jane Doe\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Solo Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ewriter\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Jane Doe\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAll three (\u003ccode\u003eauthor\u003c/code\u003e, \u003ccode\u003eby\u003c/code\u003e, \u003ccode\u003ewriter\u003c/code\u003e) set the same author field. Priority order: \u003ccode\u003eauthors\u003c/code\u003e \u0026gt; \u003ccode\u003eauthor\u003c/code\u003e \u0026gt; \u003ccode\u003eby\u003c/code\u003e \u0026gt; \u003ccode\u003ewriter\u003c/code\u003e. Only the first match is used.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePriority:\u003c/strong\u003e If both \u003ccode\u003eauthors\u003c/code\u003e and \u003ccode\u003eauthor\u003c/code\u003e (or its aliases) are set on the same post, \u003ccode\u003eauthors\u003c/code\u003e takes precedence.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRelated:\u003c/strong\u003e See \u003ca href=\"configuration.md#authors-configuration\"\u003eAuthors Configuration\u003c/a\u003e for defining author profiles.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"custom-fields-extra\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Fields (Extra)\u003c/span\u003e \u003ca href=\"#custom-fields-extra\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAny frontmatter field that isn\u0026rsquo;t a built-in field is automatically stored in the \u003ccode\u003eExtra\u003c/code\u003e map. This allows you to add \u003cstrong\u003eany custom metadata\u003c/strong\u003e to your posts.\u003c/p\u003e\n\u003ch3 id=\"adding-custom-fields\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdding Custom Fields\u003c/span\u003e \u003ca href=\"#adding-custom-fields\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Building a REST API\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Custom fields - stored in Extra\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Jane Doe\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecategory\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Backend\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;API Development\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries_order\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003efeatured\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecover_image\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/images/api-cover.jpg\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edifficulty\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;intermediate\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ereading_time\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;8 min\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"accessing-custom-fields-in-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAccessing Custom Fields in Templates\u003c/span\u003e \u003ca href=\"#accessing-custom-fields-in-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCustom fields are available via \u003ccode\u003epost.Extra\u003c/code\u003e in templates:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.Extra.featured %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;badge\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eFeatured\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.Extra.author %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;author\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eBy {{ post.Extra.author }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.Extra.cover_image %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Extra.cover_image }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Title }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.Extra.series %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;series-info\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Part {{ post.Extra.series_order }} of {{ post.Extra.series }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"common-custom-field-use-cases\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Custom Field Use Cases\u003c/span\u003e \u003ca href=\"#common-custom-field-use-cases\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"author-information\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuthor Information\u003c/span\u003e \u003ca href=\"#author-information\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Jane Doe\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthor_email\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;jane@example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthor_url\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://janedoe.dev\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthor_avatar\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/images/avatars/jane.jpg\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"series-collections\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSeries/Collections\u003c/span\u003e \u003ca href=\"#series-collections\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Building a Blog with Go\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries_order\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries_total\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"visual-elements\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVisual Elements\u003c/span\u003e \u003ca href=\"#visual-elements\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecover_image\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/images/posts/my-cover.jpg\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ethumbnail\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/images/posts/my-thumb.jpg\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eog_image\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/images/social/my-post-og.jpg\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ehero_video\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://youtube.com/watch?v=...\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"content-metadata\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContent Metadata\u003c/span\u003e \u003ca href=\"#content-metadata\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edifficulty\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;beginner\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"c\"\u003e# beginner, intermediate, advanced\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ereading_time\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;5 min read\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eword_count\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1250\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003erevision\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eNote:\u003c/strong\u003e The \u003ccode\u003emodified\u003c/code\u003e date is now a first-class field (see above). Use \u003ccode\u003elastmod\u003c/code\u003e, \u003ccode\u003emodified\u003c/code\u003e, or \u003ccode\u003eupdated\u003c/code\u003e in frontmatter - they all set the same field. If multiple are present, the first listed alias wins.\u003c/p\u003e\n\u003ch4 id=\"categorization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCategorization\u003c/span\u003e \u003ca href=\"#categorization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecategory\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Tutorials\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003esubcategory\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Web Development\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etopic\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Go Programming\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"flags-and-features\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFlags and Features\u003c/span\u003e \u003ca href=\"#flags-and-features\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003efeatured\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epinned\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003esponsored\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecomments_enabled\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etoc\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e                       \u003c/span\u003e\u003cspan class=\"c\"\u003e# Enable table of contents\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e                      \u003c/span\u003e\u003cspan class=\"c\"\u003e# Enable math rendering\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emermaid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e                   \u003c/span\u003e\u003cspan class=\"c\"\u003e# Enable diagrams\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"external-links\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExternal Links\u003c/span\u003e \u003ca href=\"#external-links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecanonical_url\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/original-post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003egithub_repo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://github.com/user/project\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edemo_url\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://demo.example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"aliases-for-wikilinks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAliases (for Wikilinks)\u003c/span\u003e \u003ca href=\"#aliases-for-wikilinks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eDefine alternative names that can be used in wikilinks to link to this post:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ECMAScript Language Specification\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ecmascript\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ealiases\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ejs\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ejavascript\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003eJavaScript\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWith these aliases, any of the following wikilinks will resolve to this post:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e[[ecmascript]]\u003c/code\u003e - matches the slug\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e[[js]]\u003c/code\u003e - matches an alias\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e[[javascript]]\u003c/code\u003e - matches an alias\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e[[JavaScript]]\u003c/code\u003e - case-insensitive alias match\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eSlug Precedence\u003c/p\u003e\n\u003cp\u003eIf another post has \u003ccode\u003eslug: \u0026quot;javascript\u0026quot;\u003c/code\u003e, then \u003ccode\u003e[[javascript]]\u003c/code\u003e will link to\nthat post (slug match) rather than the post with the alias. Slugs always take\nprecedence over aliases.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003e\u003cstrong\u003eAlias field synonyms:\u003c/strong\u003e The frontmatter loader also accepts \u003ccode\u003ealias\u003c/code\u003e, \u003ccode\u003ehandle\u003c/code\u003e, and \u003ccode\u003ehandles\u003c/code\u003e and normalizes them into \u003ccode\u003ealiases\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAlias resolution is the same on cold, warm, and edited builds. Loading a post\nfrom cache does not change its alternative names or require clearing caches\nbefore a wikilink can resolve.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"minimal-frontmatter\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMinimal Frontmatter\u003c/span\u003e \u003ca href=\"#minimal-frontmatter\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe absolute minimum for a publishable post:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Hello World\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003eYour content here.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"full-frontmatter-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFull Frontmatter Example\u003c/span\u003e \u003ca href=\"#full-frontmatter-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eA comprehensive example using all built-in fields:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Complete Guide to Error Handling in Go\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;go-error-handling-guide\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edraft\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ego\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003eerror-handling\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ebest-practices\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003etutorial\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Master error handling in Go with this comprehensive guide covering best practices, custom errors, and common patterns.\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tutorial.html\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003eContent begins here...\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"blog-post-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBlog Post Example\u003c/span\u003e \u003ca href=\"#blog-post-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eA typical blog post with custom fields:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Why I Switched from Python to Go\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-15\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ego\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003epython\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003eopinion\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003eprogramming\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My journey from Python to Go and the lessons learned along the way.\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Custom fields\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eauthor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Alex Chen\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecategory\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Opinion\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003efeatured\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecover_image\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/images/python-to-go.jpg\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ereading_time\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;6 min read\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Why I Switched from Python to Go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003eAfter 5 years of Python development, I made the switch to Go...\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"documentation-page-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocumentation Page Example\u003c/span\u003e \u003ca href=\"#documentation-page-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor technical documentation:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Configuration Reference\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;docs/configuration\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003edocumentation\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ereference\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Complete reference for markata-go configuration options.\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;docs.html\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Custom fields\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Reference\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eorder\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e10\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etoc\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eprev_page\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/docs/getting-started/\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003enext_page\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/docs/plugins/\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Configuration Reference\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003eThis page documents all available configuration options...\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"landing-page-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLanding Page Example\u003c/span\u003e \u003ca href=\"#landing-page-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor standalone pages with custom layouts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Welcome to My Site\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;landing.html\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Custom fields\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ehero_title\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Build Faster with Go\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ehero_subtitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;A static site generator that respects your time\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecta_text\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Get Started\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecta_url\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/docs/getting-started/\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003efeatures\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Fast Builds\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Compile thousands of pages in seconds\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eicon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;lightning\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Plugin System\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Extend functionality with Go plugins\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eicon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;puzzle\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Feed Generation\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;RSS, Atom, and JSON feeds built-in\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eicon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;rss\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003eAdditional content for the landing page...\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"tutorial-with-series\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTutorial with Series\u003c/span\u003e \u003ca href=\"#tutorial-with-series\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor posts that are part of a series:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Building a CLI Tool - Part 2: Adding Commands\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-20\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ego\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003ecli\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"l\"\u003etutorial\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Learn how to add subcommands to your Go CLI application using cobra.\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tutorial.html\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Series information\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Building a CLI Tool in Go\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries_slug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;go-cli-tutorial\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries_order\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries_total\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Tutorial metadata\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edifficulty\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;intermediate\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eprerequisites\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;Basic Go knowledge\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;Part 1 of this series\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecode_repo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://github.com/example/go-cli-tutorial\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Adding Commands\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003eIn the previous part, we set up our project structure...\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"media-fields\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMedia Fields\u003c/span\u003e \u003ca href=\"#media-fields\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ccode\u003eimage\u003c/code\u003e and \u003ccode\u003evideo\u003c/code\u003e frontmatter fields can be used \u003cstrong\u003einterchangeably\u003c/strong\u003e in photo and video card templates. The system auto-detects whether a URL points to a video or image based on the file extension. The image library also indexes both fields; \u003ccode\u003eimage\u003c/code\u003e and \u003ccode\u003evideo\u003c/code\u003e are cover fallbacks when no explicit \u003ccode\u003ecover\u003c/code\u003e or \u003ccode\u003ecover_image\u003c/code\u003e is set.\u003c/p\u003e\n\u003ch3 id=\"recognized-video-extensions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRecognized Video Extensions\u003c/span\u003e \u003ca href=\"#recognized-video-extensions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003e.avi\u003c/code\u003e, \u003ccode\u003e.mkv\u003c/code\u003e, \u003ccode\u003e.mp4\u003c/code\u003e, \u003ccode\u003e.webm\u003c/code\u003e, \u003ccode\u003e.mov\u003c/code\u003e, \u003ccode\u003e.m4v\u003c/code\u003e, \u003ccode\u003e.ogv\u003c/code\u003e, \u003ccode\u003e.ogg\u003c/code\u003e (case-insensitive)\u003c/p\u003e\n\u003cp\u003eAny other extension (or no extension) is treated as an image.\u003c/p\u003e\n\u003ch3 id=\"how-it-works\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow It Works\u003c/span\u003e \u003ca href=\"#how-it-works\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCard templates use two filters to resolve media:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003emedia_url\u003c/code\u003e\u003c/strong\u003e \u0026ndash; picks the first non-empty value between \u003ccode\u003eimage\u003c/code\u003e and \u003ccode\u003evideo\u003c/code\u003e fields\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eis_video\u003c/code\u003e\u003c/strong\u003e \u0026ndash; checks the file extension to decide whether to render \u003ccode\u003e\u0026lt;video\u0026gt;\u003c/code\u003e or \u003ccode\u003e\u0026lt;img\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThis means all of the following work equally well for a photo card:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Option A: image field with a video file\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/media/demo.mp4\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Option B: video field with a video file\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evideo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/media/demo.mp4\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Option C: image field with an image file\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/photos/sunset.jpg\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Option D: both fields (image takes priority)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/photos/sunset.jpg\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evideo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/media/demo.mp4\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"using-media-fields-in-custom-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing Media Fields in Custom Templates\u003c/span\u003e \u003ca href=\"#using-media-fields-in-custom-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eYou can use the \u003ccode\u003eis_video\u003c/code\u003e and \u003ccode\u003emedia_url\u003c/code\u003e filters in your own templates:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% with post.image|media_url:post.video as media_src %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if media_src %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% if media_src|is_video %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003evideo\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ media_src }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eautoplay\u003c/span\u003e \u003cspan class=\"na\"\u003emuted\u003c/span\u003e \u003cspan class=\"na\"\u003eloop\u003c/span\u003e \u003cspan class=\"na\"\u003eplaysinline\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003evideo\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ media_src }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.title }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endwith %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"common-patterns\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Patterns\u003c/span\u003e \u003ca href=\"#common-patterns\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"draft-workflow\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDraft Workflow\u003c/span\u003e \u003ca href=\"#draft-workflow\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse \u003ccode\u003edraft\u003c/code\u003e and \u003ccode\u003epublished\u003c/code\u003e together for a clear workflow:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Work in progress - not visible anywhere\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Draft Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edraft\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Ready for review - still not public\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Draft Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edraft\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Published - visible to everyone\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Draft Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edraft\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eFeed filter for published only:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eFeed filter excluding drafts:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and draft == False\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"scheduled-publishing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eScheduled Publishing\u003c/span\u003e \u003ca href=\"#scheduled-publishing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCombine \u003ccode\u003edate\u003c/code\u003e with feed filters for scheduled publishing:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;New Year Announcement\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2025-01-01\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epublished\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eFeed filter for past/current dates only:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and date \u0026lt;= today\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePosts with future dates won\u0026rsquo;t appear until that date arrives. Rebuild your site daily (via CI/CD) to \u0026ldquo;publish\u0026rdquo; scheduled posts.\u003c/p\u003e\n\u003ch3 id=\"custom-templates-per-post\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Templates Per Post\u003c/span\u003e \u003ca href=\"#custom-templates-per-post\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse different layouts for different types of content:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Regular blog post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;post.html\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Tutorial with sidebar\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Go Tutorial\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tutorial.html\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Full-width landing page\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;About Me\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;landing.html\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Documentation with navigation\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;API Reference\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;docs.html\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"series-of-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSeries of Posts\u003c/span\u003e \u003ca href=\"#series-of-posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOrganize related posts into a series:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePost 1:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Web Scraping with Go - Part 1: Basics\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-10\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Web Scraping with Go\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries_order\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003ego, web-scraping, tutorial]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePost 2:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Web Scraping with Go - Part 2: Handling JavaScript\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2024-01-17\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Web Scraping with Go\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries_order\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003ego, web-scraping, tutorial]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eFilter for the series:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;series/web-scraping-go\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Web Scraping with Go\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Extra.series == \u0026#39;Web Scraping with Go\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Extra.series_order\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"canonical-urls-for-cross-posted-content\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCanonical URLs for Cross-Posted Content\u003c/span\u003e \u003ca href=\"#canonical-urls-for-cross-posted-content\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen you publish the same content elsewhere:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecanonical_url\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://dev.to/username/my-post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse in templates:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.Extra.canonical_url %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;canonical\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Extra.canonical_url }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;canonical\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ config.URL }}{{ post.Href }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"frontmatter-in-filtering\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFrontmatter in Filtering\u003c/span\u003e \u003ca href=\"#frontmatter-in-filtering\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFrontmatter fields power the feed filtering system. You can filter posts based on any frontmatter value.\u003c/p\u003e\n\u003ch3 id=\"filter-syntax\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFilter Syntax\u003c/span\u003e \u003ca href=\"#filter-syntax\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFilters use a Python-like expression syntax:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;tutorial\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date \u0026gt;= \u0026#39;2024-01-01\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"filtering-by-built-in-fields\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFiltering by Built-in Fields\u003c/span\u003e \u003ca href=\"#filtering-by-built-in-fields\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Published posts only\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Exclude drafts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;draft == False\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Posts with a specific tag\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;go\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Posts from 2024\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date \u0026gt;= \u0026#39;2024-01-01\u0026#39; and date \u0026lt; \u0026#39;2025-01-01\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Posts with a specific slug prefix\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;slug.startswith(\u0026#39;tutorials/\u0026#39;)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Posts using a specific template\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;template == \u0026#39;tutorial.html\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"filtering-by-custom-fields-extra\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFiltering by Custom Fields (Extra)\u003c/span\u003e \u003ca href=\"#filtering-by-custom-fields-extra\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAccess custom fields directly by name:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Featured posts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;featured == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Posts by specific author\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;author == \u0026#39;Jane Doe\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Posts in a specific category\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;category == \u0026#39;Tutorials\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Posts in a series\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;series == \u0026#39;Web Scraping with Go\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Intermediate difficulty tutorials\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;difficulty == \u0026#39;intermediate\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"combined-filters\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCombined Filters\u003c/span\u003e \u003ca href=\"#combined-filters\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse \u003ccode\u003eand\u003c/code\u003e, \u003ccode\u003eor\u003c/code\u003e, and parentheses for complex filters:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Published tutorials\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and \u0026#39;tutorial\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Featured posts from 2024\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and featured == True and date \u0026gt;= \u0026#39;2024-01-01\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Go or Python tutorials\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and (\u0026#39;go\u0026#39; in tags or \u0026#39;python\u0026#39; in tags)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Published, non-draft, with specific category\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and draft == False and category == \u0026#39;Backend\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"filtering-with-dates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFiltering with Dates\u003c/span\u003e \u003ca href=\"#filtering-with-dates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSpecial date values are available:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Posts up to today (no future posts)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date \u0026lt;= today\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Posts from the last 30 days\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date \u0026gt;= today - 30\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Recent posts (within current timestamp)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date \u0026lt;= now\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"filter-operators-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFilter Operators Reference\u003c/span\u003e \u003ca href=\"#filter-operators-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOperator\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e==\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEqual to\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epublished == True\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e!=\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNot equal to\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edraft != True\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGreater than\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edate \u0026gt; '2024-01-01'\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026gt;=\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGreater than or equal\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edate \u0026gt;= '2024-01-01'\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026lt;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLess than\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edate \u0026lt; '2025-01-01'\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026lt;=\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLess than or equal\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edate \u0026lt;= today\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ein\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eValue in collection\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e'go' in tags\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eand\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLogical AND\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epublished == True and featured == True\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eor\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLogical OR\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e'go' in tags or 'python' in tags\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enot\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLogical NOT\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003enot draft\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"string-methods-in-filters\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eString Methods in Filters\u003c/span\u003e \u003ca href=\"#string-methods-in-filters\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Slugs starting with a prefix\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;slug.startswith(\u0026#39;tutorials/\u0026#39;)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Slugs ending with a suffix\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;slug.endswith(\u0026#39;-guide\u0026#39;)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Slugs containing a substring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;slug.contains(\u0026#39;api\u0026#39;)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Case-insensitive comparison\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;title.lower().contains(\u0026#39;go\u0026#39;)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"complete-filter-examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComplete Filter Examples\u003c/span\u003e \u003ca href=\"#complete-filter-examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eHome page - recent published posts:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Recent Posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and date \u0026lt;= today\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eTutorials section:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and \u0026#39;tutorial\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eFeatured posts:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;featured\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Featured\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and featured == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eAuthor archive:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;authors/jane-doe\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Posts by Jane Doe\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and author == \u0026#39;Jane Doe\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eBeginner-friendly content:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;beginners\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Beginner Guides\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and difficulty == \u0026#39;beginner\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003chr\u003e\n\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext Steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow that you understand frontmatter, here are recommended next steps based on what you want to do:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOrganize your content with feeds:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/feeds/\"\u003eFeeds Guide\u003c/a\u003e - Learn how to create filtered, sorted collections using your frontmatter fields\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eCustomize how your content looks:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/templates/\"\u003eTemplates Guide\u003c/a\u003e - Use frontmatter values in your templates\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/themes/\"\u003eThemes Guide\u003c/a\u003e - Style your site with color palettes and custom CSS\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eLearn about Markdown features:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/markdown/\"\u003eMarkdown Guide\u003c/a\u003e - Advanced Markdown syntax and extensions\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/feeds/\"\u003eFeeds Guide\u003c/a\u003e - Complete guide to feed filtering and configuration\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/templates/\"\u003eTemplates Guide\u003c/a\u003e - Using frontmatter in templates\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfiguration Guide\u003c/a\u003e - Site-wide defaults and settings\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/quick-reference/\"\u003eQuick Reference\u003c/a\u003e - Frontmatter snippets and cheat sheets\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n## Frontmatter\n\nFrontmatter is the **metadata block** at the top of your Markdown files that tells markata-go how to process, display, and organize your content. This guide covers everything you need to know about using frontmatter effectively.\n\nIn the workbench editor, press **Ctrl+Space** to request metadata completion.\nKnown field values are suggested while editing scalar values and YAML list\nitems, including existing site tags.\n\n## Table of Contents\n\n- [What is Frontmatter?](#what-is-frontmatter)\n- [Basic Frontmatter Fields](#basic-frontmatter-fields)\n- [Complete Field Reference](#complete-field-reference)\n- [Custom Fields (Extra)](#custom-fields-extra)\n- [Examples](#examples)\n- [Common Patterns](#common-patterns)\n- [Frontmatter in Filtering](#frontmatter-in-filtering)\n\n---\n\n## What is Frontmatter?\n\nFrontmatter is **YAML metadata** placed at the very top of a Markdown file, enclosed between two lines of three dashes (`---`). It defines properties like the post's title, date, tags, and any custom data you want to associate with the content.\n\n### Visual Example\n\n```markdown\n---\ntitle: \"Getting Started with Go\"\ndate: 2024-01-15\npublished: true\ntags:\n  - go\n  - tutorial\n  - beginners\ndescription: \"A beginner-friendly introduction to Go programming.\"\n---\n\n# Welcome to Go!\n\nThis is where your actual content begins...\n```\n\n### How markata-go Parses Frontmatter\n\nWhen markata-go processes your Markdown files, it:\n\n1. **Detects the opening delimiter** - Looks for `---` at the very start of the file\n2. **Extracts the YAML block** - Reads everything until the closing `---`\n3. **Parses the YAML** - Converts the metadata into structured data\n4. **Separates the content** - Everything after the second `---` becomes the post body\n\n**Important notes:**\n\n- The opening `---` must be on the very first line of the file\n- The closing `---` must be on its own line\n- Content before the opening `---` or malformed delimiters will cause errors\n- Files without frontmatter are valid - they'll use default values\n\n### Valid Frontmatter\n\n```markdown\n---\ntitle: My Post\n---\nContent here\n```\n\n### Invalid Frontmatter (Missing Closing Delimiter)\n\n```markdown\n---\ntitle: My Post\n\nContent here (ERROR: unclosed frontmatter)\n```\n\n### No Frontmatter (Also Valid)\n\n```markdown\n# My Post\n\nContent starts immediately - defaults will be used.\n```\n\n---\n\n## Basic Frontmatter Fields\n\nThese are the core fields that markata-go recognizes and uses directly.\n\n### title (string)\n\nThe display title of your post.\n\n```yaml\ntitle: \"Understanding Goroutines\"\n```\n\n- **Type:** string\n- **Default:** None (derived from filename if not set)\n- **Used for:** Page title, `\u003ctitle\u003e` tag, feed listings, slug generation\n\nIf not provided, the slug is derived from the filename instead.\n\nTitles also accept HTML character references. markata-go decodes references\nbefore rendering, so `It\u0026rsquo;s just the Carpet\u0026hellip;` displays as\n`It’s just the Carpet…` instead of showing the entity names. Use\n`title_text` in custom templates when you need the plain-text title.\n\n### slug (string)\n\nThe URL-safe identifier for your post. Determines the URL path.\n\n```yaml\nslug: \"understanding-goroutines\"\n```\n\n- **Type:** string\n- **Default:** Auto-generated from `title` (or filename if no title)\n- **Used for:** URL path (`/understanding-goroutines/`)\n\n**Auto-generation rules:**\n- Converts to lowercase\n- Replaces spaces with hyphens\n- Removes special characters\n- Collapses multiple hyphens\n\n```yaml\n# These titles produce these slugs:\ntitle: \"Hello World!\"        # slug: hello-world\ntitle: \"Go's Best Features\"  # slug: gos-best-features\ntitle: \"Part 1: The Basics\"  # slug: part-1-the-basics\n```\n\n#### Custom Slugs\n\nYou can explicitly set any slug in frontmatter:\n\n```yaml\n# Simple custom slug\nslug: my-custom-url\n\n# Nested path (creates /docs/api/overview/)\nslug: docs/api/overview\n\n# Leading/trailing slashes are automatically stripped\nslug: /about/            # becomes: about\nslug: /docs/guides/      # becomes: docs/guides\n```\n\n#### Homepage from Custom Slug\n\nAny post can become the homepage by setting an empty or slash slug:\n\n```yaml\n---\ntitle: \"Welcome to My Site\"\nslug: \"\"                    # This post becomes the homepage at /\npublished: true\n---\n\nWelcome to my site!\n```\n\nOr equivalently:\n\n```yaml\n---\ntitle: \"Welcome to My Site\"\nslug: /                     # Also becomes the homepage at /\npublished: true\n---\n```\n\nThis is useful when you want a custom homepage from content in any directory, rather than using a feed or `index.md` at the root.\n\n**Note:** If multiple posts have the same slug (including empty slug for homepage), the build will fail with a path conflict error to prevent accidental overwrites.\n\n#### Special Case: `index.md` Files\n\nFiles named `index.md` automatically generate slugs based on their directory:\n\n| File Path | Auto-Generated Slug | URL |\n|-----------|---------------------|-----|\n| `./index.md` | `\"\"` (empty) | `/` (homepage) |\n| `docs/index.md` | `docs` | `/docs/` |\n| `blog/guides/index.md` | `blog/guides` | `/blog/guides/` |\n\nThis allows directory-based URL structures without needing to set explicit slugs.\n\n### date (date)\n\nThe publication date of the post.\n\n```yaml\ndate: 2024-01-15\n```\n\n- **Type:** date (YYYY-MM-DD format recommended)\n- **Default:** None\n- **Used for:** Sorting, display, feeds, scheduled publishing\n\n**Supported date formats:**\n\nmarkata-go supports a wide variety of date formats for maximum flexibility:\n\n```yaml\n# ISO 8601 formats (recommended)\ndate: 2024-01-15                    # Date only\ndate: 2024-01-15T10:30:00           # With time\ndate: 2024-01-15T10:30:00Z          # With UTC timezone\ndate: 2024-01-15T10:30:00+05:00     # With timezone offset\ndate: 2024-01-15 10:30:00           # With space separator\ndate: 2024-01-15 10:30              # Without seconds\n\n# Single-digit hours (automatically normalized)\ndate: 2024-01-15 1:30:00            # 1am\ndate: 2024-01-15 9:30:00            # 9am\n\n# Slash-separated dates\ndate: 2024/01/15                    # YYYY/MM/DD\ndate: 2024/01/15 10:30:00           # With time\ndate: 01/15/2024                    # MM/DD/YYYY (US format)\n\n# Named month formats\ndate: January 15, 2024              # Full month name\ndate: Jan 15, 2024                  # Abbreviated month\ndate: 15 January 2024               # Day first\ndate: 15 Jan 2024                   # Day first, abbreviated\n\n# European format\ndate: 15-01-2024                    # DD-MM-YYYY\n```\n\n**Note:** Malformed time components are automatically corrected. For example, `2024-01-15 8:011:00` (typo) will be parsed as `2024-01-15 08:11:00`.\n\n### published (boolean)\n\nWhether the post should be included in public feeds and listings.\n\n```yaml\npublished: true\n```\n\n- **Type:** boolean\n- **Default:** `false`\n- **Used for:** Filtering posts in feeds, sitemaps, and RSS\n\n**Shadow Pages:** Posts with `published: false` are still rendered to HTML and accessible via direct URL. They become \"shadow pages\" - accessible but not discoverable through normal site navigation.\n\n| `published` | Behavior |\n|-------------|----------|\n| `true` | Rendered + included in feeds, sitemaps, RSS |\n| `false` | Rendered as \"shadow page\" + NOT in feeds, sitemaps, RSS |\n\n**Use cases for shadow pages:**\n- Draft content accessible to reviewers via direct URL\n- Private documentation not linked publicly\n- Work-in-progress content shared with specific people\n- Admin pages or staging content\n\n**Accepted values:**\n\n```yaml\npublished: true    # or: yes, on\npublished: false   # or: no, off\n```\n\n### draft (boolean)\n\nMarks the post as a work-in-progress that should NOT be rendered at all.\n\n```yaml\ndraft: true\n```\n\n- **Type:** boolean\n- **Default:** `false`\n- **Used for:** Truly private content that shouldn't be accessible\n\n**Important:** Posts with `draft: true` are **never rendered** to HTML. Use this for content you don't want accessible at all, even via direct URL.\n\n| `draft` | Behavior |\n|---------|----------|\n| `false` | Content is rendered (visibility depends on `published`) |\n| `true` | Content is NOT rendered at all |\n\n**Comparison with `published`:**\n\n| Scenario | `published` | `draft` | Rendered? | In Feeds? |\n|----------|-------------|---------|-----------|-----------|\n| Public post | `true` | `false` | Yes | Yes |\n| Shadow page | `false` | `false` | Yes | No |\n| Private WIP | any | `true` | No | No |\n\n### tags (list)\n\nA list of tags for categorizing the post.\n\n```yaml\ntags:\n  - go\n  - concurrency\n  - tutorial\n```\n\nOr inline format:\n\n```yaml\ntags: [go, concurrency, tutorial]\n```\n\nFor compatibility with older content, `tags: go` is also accepted as a single tag. Diagnostics still warns about scalar shorthand and recommends a list, which is the canonical form.\n\n- **Type:** list of strings\n- **Default:** `[]` (empty list)\n- **Used for:** Filtering, tag pages, SEO, organization\n\n### description (string)\n\nA brief summary of the post content.\n\n```yaml\ndescription: \"Learn how to use goroutines for concurrent programming in Go.\"\n```\n\n- **Type:** string\n- **Default:** Auto-generated from first ~160 characters of content\n- **Used for:** Meta description, SEO, social previews\n\n**Note:** The `description` field is no longer used for article card excerpts in feeds. Excerpts are now auto-generated from your content (first 3 paragraphs or 1500 characters). However, `description` may still be used for SEO meta tags and RSS feeds.\n\n**Auto-generation:** If not provided, markata-go extracts the first paragraph or ~160 characters from your content (with HTML tags stripped).\n\n### template (string)\n\nThe HTML template file to use for rendering this post.\n\n```yaml\ntemplate: \"tutorial.html\"\n```\n\n- **Type:** string\n- **Default:** `\"post.html\"`\n- **Used for:** Custom layouts per post\n\nTemplates are looked up in:\n1. `templates/` directory in your project\n2. Theme templates\n3. Default theme fallback\n\nExample built-in template choices include `post.html`, `landing.html`, `docs.html`, and `slides.html`.\n\n`slides.html` is intended for presentation decks and pairs well with the shared assets system when you want to self-host Reveal.js.\n\n### content_width (string)\n\nSet `content_width: wide` to opt a default-theme `post.html` page into a wider\nstory frame, a larger balanced title, and a lead opening paragraph. It pairs\nwith `md-section` for sticky section heads and `md-grid rail` for overview\ncards. Unset or unknown values keep the normal layout. Custom templates must\nprovide their own support. See [Markdown story pages](/docs/guides/markdown-containers/#markdown-story-pages).\n\n---\n\n## Complete Field Reference\n\n| Field | Type | Default | Required | Description |\n|-------|------|---------|----------|-------------|\n| `title` | string | None | No | Display title of the post |\n| `slug` | string | Auto-generated | No | URL path identifier |\n| `date` | date | None | No | Publication date (YYYY-MM-DD) |\n| `modified` | date | None | No | Last modified date (YYYY-MM-DD) |\n| `published` | bool | `false` | No | Whether to include in public feeds |\n| `draft` | bool | `false` | No | Whether this is a work-in-progress |\n| `tags` | []string | `[]` | No | List of categorization tags |\n| `description` | string | Auto-generated | No | Brief summary for SEO/meta tags |\n| `template` | string | `\"post.html\"` | No | Template file to use for rendering |\n| `content_width` | string | Normal theme width | No | `wide` opts a default-theme post into story layout |\n| `skip` | bool | `false` | No | Skip this file during processing entirely |\n| `authors` | []string | `[]` | No | List of author IDs (multi-author support) |\n| `author` | string | None | No | Legacy single-author name or ID |\n| `by` | string | None | No | Alias for `author` |\n| `writer` | string | None | No | Alias for `author` |\n\n### Date Field Aliases\n\nFor compatibility with other static site generators, markata-go supports multiple frontmatter keys:\n\n**Publication date aliases:** `publishdate`, `date`, `pubdate`\n\n**Modified date aliases:** `lastmod`, `modified`, `updated`, `updated_at`, `last_modified`\n\nWhen multiple aliases are provided, the **first listed wins**. This precedence matches common SSG conventions.\n\n```yaml\n---\n# All of these set the publication date:\npublishdate: 2024-01-15\ndate: 2024-01-15\npubdate: 2024-01-15\n\n# All of these set the modified date:\nlastmod: 2024-02-20\nmodified: 2024-02-20\nupdated: 2024-02-20\nupdated_at: 2024-02-20\nlast_modified: 2024-02-20\n---\n```\n\n### Field Details\n\n#### skip\n\nCompletely exclude a file from processing:\n\n```yaml\nskip: true\n```\n\nUse this for files you want to keep in your content directory but never process (notes, drafts not ready for review, etc.).\n\n#### authors\n\nAssign one or more authors to a post by referencing author IDs defined in your site configuration:\n\n```yaml\n---\ntitle: \"Collaborative Article\"\nauthors:\n  - waylon\n  - guest\n---\n```\n\nEach author ID is resolved against the `[markata-go.authors.authors]` config map during the build. Resolved author objects (with name, avatar, role, bio, etc.) are available in templates as `post.author_objects`.\n\nYou can use the extended format to specify per-post roles and details for each author:\n\n```yaml\n---\ntitle: \"Collaborative Article\"\nauthors:\n  - id: waylon\n    role: author\n    details: wrote the introduction and conclusion\n  - id: codex\n    role: pair programmer\n    details: wrote the code examples\n  - id: kimmi\n    role: outliner\n---\n```\n\nThe `role` overrides the author's config-level role for this post only. The `details` field provides a short description of what the author did on this specific post, displayed as a tooltip when hovering over the author's name in the byline. Both fields are optional and can be used independently.\n\n**Key aliases:** For convenience, the extended format supports aliases so you can use whichever key name feels natural:\n\n| Canonical Key | Aliases |\n|---------------|---------|\n| `id` | `name`, `handle` |\n| `role` | `job`, `position`, `part`, `title` |\n| `details` | `detail`, `description` |\n\nFor example, these are all equivalent:\n\n```yaml\n---\nauthors:\n  - name: waylon\n    title: maintainer\n    description: built the feature\n  # same as:\n  - id: waylon\n    role: maintainer\n    details: built the feature\n---\n```\n\nThe canonical key always takes precedence when both it and an alias are present.\n\nYou can mix simple string IDs and extended format in the same array:\n\n```yaml\n---\nauthors:\n  - waylon\n  - id: codex\n    role: editor\n    details: reviewed and edited the draft\n---\n```\n\nIf no `authors` or `author` field is set, the default author from config (the one with `default = true`) is assigned automatically.\n\n#### author\n\nLegacy single-author field. Use this for simple sites or backward compatibility:\n\n```yaml\n---\ntitle: \"Solo Post\"\nauthor: \"Jane Doe\"\n---\n```\n\n**Aliases:** The `by` and `writer` frontmatter fields are aliases for `author`. This allows more natural frontmatter syntax:\n\n```yaml\n---\ntitle: \"Solo Post\"\nby: \"Jane Doe\"\n---\n```\n\n```yaml\n---\ntitle: \"Solo Post\"\nwriter: \"Jane Doe\"\n---\n```\n\nAll three (`author`, `by`, `writer`) set the same author field. Priority order: `authors` \u003e `author` \u003e `by` \u003e `writer`. Only the first match is used.\n\n**Priority:** If both `authors` and `author` (or its aliases) are set on the same post, `authors` takes precedence.\n\n**Related:** See [Authors Configuration](configuration.md#authors-configuration) for defining author profiles.\n\n---\n\n## Custom Fields (Extra)\n\nAny frontmatter field that isn't a built-in field is automatically stored in the `Extra` map. This allows you to add **any custom metadata** to your posts.\n\n### Adding Custom Fields\n\n```yaml\n---\ntitle: \"Building a REST API\"\ndate: 2024-01-15\npublished: true\n\n# Custom fields - stored in Extra\nauthor: \"Jane Doe\"\ncategory: \"Backend\"\nseries: \"API Development\"\nseries_order: 1\nfeatured: true\ncover_image: \"/images/api-cover.jpg\"\ndifficulty: \"intermediate\"\nreading_time: \"8 min\"\n---\n```\n\n### Accessing Custom Fields in Templates\n\nCustom fields are available via `post.Extra` in templates:\n\n```html\n{% if post.Extra.featured %}\n\u003cspan class=\"badge\"\u003eFeatured\u003c/span\u003e\n{% endif %}\n\n{% if post.Extra.author %}\n\u003cp class=\"author\"\u003eBy {{ post.Extra.author }}\u003c/p\u003e\n{% endif %}\n\n{% if post.Extra.cover_image %}\n\u003cimg src=\"{{ post.Extra.cover_image }}\" alt=\"{{ post.Title }}\"\u003e\n{% endif %}\n\n{% if post.Extra.series %}\n\u003cdiv class=\"series-info\"\u003e\n    Part {{ post.Extra.series_order }} of {{ post.Extra.series }}\n\u003c/div\u003e\n{% endif %}\n```\n\n### Common Custom Field Use Cases\n\n#### Author Information\n\n```yaml\nauthor: \"Jane Doe\"\nauthor_email: \"jane@example.com\"\nauthor_url: \"https://janedoe.dev\"\nauthor_avatar: \"/images/avatars/jane.jpg\"\n```\n\n#### Series/Collections\n\n```yaml\nseries: \"Building a Blog with Go\"\nseries_order: 3\nseries_total: 5\n```\n\n#### Visual Elements\n\n```yaml\ncover_image: \"/images/posts/my-cover.jpg\"\nthumbnail: \"/images/posts/my-thumb.jpg\"\nog_image: \"/images/social/my-post-og.jpg\"\nhero_video: \"https://youtube.com/watch?v=...\"\n```\n\n#### Content Metadata\n\n```yaml\ndifficulty: \"beginner\"          # beginner, intermediate, advanced\nreading_time: \"5 min read\"\nword_count: 1250\nrevision: 3\n```\n\n**Note:** The `modified` date is now a first-class field (see above). Use `lastmod`, `modified`, or `updated` in frontmatter - they all set the same field. If multiple are present, the first listed alias wins.\n\n#### Categorization\n\n```yaml\ncategory: \"Tutorials\"\nsubcategory: \"Web Development\"\ntopic: \"Go Programming\"\n```\n\n#### Flags and Features\n\n```yaml\nfeatured: true\npinned: true\nsponsored: false\ncomments_enabled: true\ntoc: true                       # Enable table of contents\nmath: true                      # Enable math rendering\nmermaid: true                   # Enable diagrams\n```\n\n#### External Links\n\n```yaml\ncanonical_url: \"https://example.com/original-post\"\ngithub_repo: \"https://github.com/user/project\"\ndemo_url: \"https://demo.example.com\"\n```\n\n#### Aliases (for Wikilinks)\n\nDefine alternative names that can be used in wikilinks to link to this post:\n\n```yaml\n---\ntitle: \"ECMAScript Language Specification\"\nslug: \"ecmascript\"\naliases:\n  - js\n  - javascript\n  - JavaScript\n---\n```\n\nWith these aliases, any of the following wikilinks will resolve to this post:\n\n- `[[ecmascript]]` - matches the slug\n- `[[js]]` - matches an alias\n- `[[javascript]]` - matches an alias\n- `[[JavaScript]]` - case-insensitive alias match\n\n!!! note \"Slug Precedence\"\n\n    If another post has `slug: \"javascript\"`, then `[[javascript]]` will link to\n    that post (slug match) rather than the post with the alias. Slugs always take\n    precedence over aliases.\n\n**Alias field synonyms:** The frontmatter loader also accepts `alias`, `handle`, and `handles` and normalizes them into `aliases`.\n\nAlias resolution is the same on cold, warm, and edited builds. Loading a post\nfrom cache does not change its alternative names or require clearing caches\nbefore a wikilink can resolve.\n\n---\n\n## Examples\n\n### Minimal Frontmatter\n\nThe absolute minimum for a publishable post:\n\n```yaml\n---\ntitle: \"Hello World\"\npublished: true\n---\n\nYour content here.\n```\n\n### Full Frontmatter Example\n\nA comprehensive example using all built-in fields:\n\n```yaml\n---\ntitle: \"Complete Guide to Error Handling in Go\"\nslug: \"go-error-handling-guide\"\ndate: 2024-01-15\npublished: true\ndraft: false\ntags:\n  - go\n  - error-handling\n  - best-practices\n  - tutorial\ndescription: \"Master error handling in Go with this comprehensive guide covering best practices, custom errors, and common patterns.\"\ntemplate: \"tutorial.html\"\n---\n\nContent begins here...\n```\n\n### Blog Post Example\n\nA typical blog post with custom fields:\n\n```yaml\n---\ntitle: \"Why I Switched from Python to Go\"\ndate: 2024-01-15\npublished: true\ntags:\n  - go\n  - python\n  - opinion\n  - programming\ndescription: \"My journey from Python to Go and the lessons learned along the way.\"\n\n# Custom fields\nauthor: \"Alex Chen\"\ncategory: \"Opinion\"\nfeatured: true\ncover_image: \"/images/python-to-go.jpg\"\nreading_time: \"6 min read\"\n---\n\n# Why I Switched from Python to Go\n\nAfter 5 years of Python development, I made the switch to Go...\n```\n\n### Documentation Page Example\n\nFor technical documentation:\n\n```yaml\n---\ntitle: \"Configuration Reference\"\nslug: \"docs/configuration\"\npublished: true\ntags:\n  - documentation\n  - reference\ndescription: \"Complete reference for markata-go configuration options.\"\ntemplate: \"docs.html\"\n\n# Custom fields\nsection: \"Reference\"\norder: 10\ntoc: true\nprev_page: \"/docs/getting-started/\"\nnext_page: \"/docs/plugins/\"\n---\n\n# Configuration Reference\n\nThis page documents all available configuration options...\n```\n\n### Landing Page Example\n\nFor standalone pages with custom layouts:\n\n```yaml\n---\ntitle: \"Welcome to My Site\"\nslug: \"\"\npublished: true\ntemplate: \"landing.html\"\n\n# Custom fields\nhero_title: \"Build Faster with Go\"\nhero_subtitle: \"A static site generator that respects your time\"\ncta_text: \"Get Started\"\ncta_url: \"/docs/getting-started/\"\nfeatures:\n  - title: \"Fast Builds\"\n    description: \"Compile thousands of pages in seconds\"\n    icon: \"lightning\"\n  - title: \"Plugin System\"\n    description: \"Extend functionality with Go plugins\"\n    icon: \"puzzle\"\n  - title: \"Feed Generation\"\n    description: \"RSS, Atom, and JSON feeds built-in\"\n    icon: \"rss\"\n---\n\nAdditional content for the landing page...\n```\n\n### Tutorial with Series\n\nFor posts that are part of a series:\n\n```yaml\n---\ntitle: \"Building a CLI Tool - Part 2: Adding Commands\"\ndate: 2024-01-20\npublished: true\ntags:\n  - go\n  - cli\n  - tutorial\ndescription: \"Learn how to add subcommands to your Go CLI application using cobra.\"\ntemplate: \"tutorial.html\"\n\n# Series information\nseries: \"Building a CLI Tool in Go\"\nseries_slug: \"go-cli-tutorial\"\nseries_order: 2\nseries_total: 5\n\n# Tutorial metadata\ndifficulty: \"intermediate\"\nprerequisites:\n  - \"Basic Go knowledge\"\n  - \"Part 1 of this series\"\ncode_repo: \"https://github.com/example/go-cli-tutorial\"\n---\n\n# Adding Commands\n\nIn the previous part, we set up our project structure...\n```\n\n---\n\n## Media Fields\n\nThe `image` and `video` frontmatter fields can be used **interchangeably** in photo and video card templates. The system auto-detects whether a URL points to a video or image based on the file extension. The image library also indexes both fields; `image` and `video` are cover fallbacks when no explicit `cover` or `cover_image` is set.\n\n### Recognized Video Extensions\n\n`.avi`, `.mkv`, `.mp4`, `.webm`, `.mov`, `.m4v`, `.ogv`, `.ogg` (case-insensitive)\n\nAny other extension (or no extension) is treated as an image.\n\n### How It Works\n\nCard templates use two filters to resolve media:\n\n1. **`media_url`** -- picks the first non-empty value between `image` and `video` fields\n2. **`is_video`** -- checks the file extension to decide whether to render `\u003cvideo\u003e` or `\u003cimg\u003e`\n\nThis means all of the following work equally well for a photo card:\n\n```yaml\n# Option A: image field with a video file\n---\nimage: \"/media/demo.mp4\"\n---\n\n# Option B: video field with a video file\n---\nvideo: \"/media/demo.mp4\"\n---\n\n# Option C: image field with an image file\n---\nimage: \"/photos/sunset.jpg\"\n---\n\n# Option D: both fields (image takes priority)\n---\nimage: \"/photos/sunset.jpg\"\nvideo: \"/media/demo.mp4\"\n---\n```\n\n### Using Media Fields in Custom Templates\n\nYou can use the `is_video` and `media_url` filters in your own templates:\n\n```html\n{% with post.image|media_url:post.video as media_src %}\n{% if media_src %}\n  {% if media_src|is_video %}\n  \u003cvideo src=\"{{ media_src }}\" autoplay muted loop playsinline\u003e\u003c/video\u003e\n  {% else %}\n  \u003cimg src=\"{{ media_src }}\" alt=\"{{ post.title }}\"\u003e\n  {% endif %}\n{% endif %}\n{% endwith %}\n```\n\n---\n\n## Common Patterns\n\n### Draft Workflow\n\nUse `draft` and `published` together for a clear workflow:\n\n```yaml\n# Work in progress - not visible anywhere\n---\ntitle: \"My Draft Post\"\ndraft: true\npublished: false\n---\n\n# Ready for review - still not public\n---\ntitle: \"My Draft Post\"\ndraft: true\npublished: false\n---\n\n# Published - visible to everyone\n---\ntitle: \"My Draft Post\"\ndraft: false\npublished: true\n---\n```\n\n**Feed filter for published only:**\n\n```toml\n[[markata-go.feeds]]\nslug = \"blog\"\nfilter = \"published == True\"\n```\n\n**Feed filter excluding drafts:**\n\n```toml\n[[markata-go.feeds]]\nslug = \"blog\"\nfilter = \"published == True and draft == False\"\n```\n\n### Scheduled Publishing\n\nCombine `date` with feed filters for scheduled publishing:\n\n```yaml\n---\ntitle: \"New Year Announcement\"\ndate: 2025-01-01\npublished: true\n---\n```\n\n**Feed filter for past/current dates only:**\n\n```toml\n[[markata-go.feeds]]\nslug = \"blog\"\nfilter = \"published == True and date \u003c= today\"\n```\n\nPosts with future dates won't appear until that date arrives. Rebuild your site daily (via CI/CD) to \"publish\" scheduled posts.\n\n### Custom Templates Per Post\n\nUse different layouts for different types of content:\n\n```yaml\n# Regular blog post\n---\ntitle: \"My Post\"\ntemplate: \"post.html\"\n---\n\n# Tutorial with sidebar\n---\ntitle: \"Go Tutorial\"\ntemplate: \"tutorial.html\"\n---\n\n# Full-width landing page\n---\ntitle: \"About Me\"\ntemplate: \"landing.html\"\n---\n\n# Documentation with navigation\n---\ntitle: \"API Reference\"\ntemplate: \"docs.html\"\n---\n```\n\n### Series of Posts\n\nOrganize related posts into a series:\n\n**Post 1:**\n```yaml\n---\ntitle: \"Web Scraping with Go - Part 1: Basics\"\ndate: 2024-01-10\nseries: \"Web Scraping with Go\"\nseries_order: 1\ntags: [go, web-scraping, tutorial]\n---\n```\n\n**Post 2:**\n```yaml\n---\ntitle: \"Web Scraping with Go - Part 2: Handling JavaScript\"\ndate: 2024-01-17\nseries: \"Web Scraping with Go\"\nseries_order: 2\ntags: [go, web-scraping, tutorial]\n---\n```\n\n**Filter for the series:**\n```toml\n[[markata-go.feeds]]\nslug = \"series/web-scraping-go\"\ntitle = \"Web Scraping with Go\"\nfilter = \"Extra.series == 'Web Scraping with Go'\"\nsort = \"Extra.series_order\"\nreverse = false\n```\n\n### Canonical URLs for Cross-Posted Content\n\nWhen you publish the same content elsewhere:\n\n```yaml\n---\ntitle: \"My Post\"\ncanonical_url: \"https://dev.to/username/my-post\"\n---\n```\n\nUse in templates:\n\n```html\n{% if post.Extra.canonical_url %}\n\u003clink rel=\"canonical\" href=\"{{ post.Extra.canonical_url }}\"\u003e\n{% else %}\n\u003clink rel=\"canonical\" href=\"{{ config.URL }}{{ post.Href }}\"\u003e\n{% endif %}\n```\n\n---\n\n## Frontmatter in Filtering\n\nFrontmatter fields power the feed filtering system. You can filter posts based on any frontmatter value.\n\n### Filter Syntax\n\nFilters use a Python-like expression syntax:\n\n```toml\nfilter = \"published == True\"\nfilter = \"'tutorial' in tags\"\nfilter = \"date \u003e= '2024-01-01'\"\n```\n\n### Filtering by Built-in Fields\n\n```toml\n# Published posts only\nfilter = \"published == True\"\n\n# Exclude drafts\nfilter = \"draft == False\"\n\n# Posts with a specific tag\nfilter = \"'go' in tags\"\n\n# Posts from 2024\nfilter = \"date \u003e= '2024-01-01' and date \u003c '2025-01-01'\"\n\n# Posts with a specific slug prefix\nfilter = \"slug.startswith('tutorials/')\"\n\n# Posts using a specific template\nfilter = \"template == 'tutorial.html'\"\n```\n\n### Filtering by Custom Fields (Extra)\n\nAccess custom fields directly by name:\n\n```toml\n# Featured posts\nfilter = \"featured == True\"\n\n# Posts by specific author\nfilter = \"author == 'Jane Doe'\"\n\n# Posts in a specific category\nfilter = \"category == 'Tutorials'\"\n\n# Posts in a series\nfilter = \"series == 'Web Scraping with Go'\"\n\n# Intermediate difficulty tutorials\nfilter = \"difficulty == 'intermediate'\"\n```\n\n### Combined Filters\n\nUse `and`, `or`, and parentheses for complex filters:\n\n```toml\n# Published tutorials\nfilter = \"published == True and 'tutorial' in tags\"\n\n# Featured posts from 2024\nfilter = \"published == True and featured == True and date \u003e= '2024-01-01'\"\n\n# Go or Python tutorials\nfilter = \"published == True and ('go' in tags or 'python' in tags)\"\n\n# Published, non-draft, with specific category\nfilter = \"published == True and draft == False and category == 'Backend'\"\n```\n\n### Filtering with Dates\n\nSpecial date values are available:\n\n```toml\n# Posts up to today (no future posts)\nfilter = \"date \u003c= today\"\n\n# Posts from the last 30 days\nfilter = \"date \u003e= today - 30\"\n\n# Recent posts (within current timestamp)\nfilter = \"date \u003c= now\"\n```\n\n### Filter Operators Reference\n\n| Operator | Description | Example |\n|----------|-------------|---------|\n| `==` | Equal to | `published == True` |\n| `!=` | Not equal to | `draft != True` |\n| `\u003e` | Greater than | `date \u003e '2024-01-01'` |\n| `\u003e=` | Greater than or equal | `date \u003e= '2024-01-01'` |\n| `\u003c` | Less than | `date \u003c '2025-01-01'` |\n| `\u003c=` | Less than or equal | `date \u003c= today` |\n| `in` | Value in collection | `'go' in tags` |\n| `and` | Logical AND | `published == True and featured == True` |\n| `or` | Logical OR | `'go' in tags or 'python' in tags` |\n| `not` | Logical NOT | `not draft` |\n\n### String Methods in Filters\n\n```toml\n# Slugs starting with a prefix\nfilter = \"slug.startswith('tutorials/')\"\n\n# Slugs ending with a suffix\nfilter = \"slug.endswith('-guide')\"\n\n# Slugs containing a substring\nfilter = \"slug.contains('api')\"\n\n# Case-insensitive comparison\nfilter = \"title.lower().contains('go')\"\n```\n\n### Complete Filter Examples\n\n**Home page - recent published posts:**\n```toml\n[[markata-go.feeds]]\nslug = \"\"\ntitle = \"Recent Posts\"\nfilter = \"published == True and date \u003c= today\"\nsort = \"date\"\nreverse = true\nitems_per_page = 5\n```\n\n**Tutorials section:**\n```toml\n[[markata-go.feeds]]\nslug = \"tutorials\"\ntitle = \"Tutorials\"\nfilter = \"published == True and 'tutorial' in tags\"\nsort = \"date\"\nreverse = true\n```\n\n**Featured posts:**\n```toml\n[[markata-go.feeds]]\nslug = \"featured\"\ntitle = \"Featured\"\nfilter = \"published == True and featured == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 6\n```\n\n**Author archive:**\n```toml\n[[markata-go.feeds]]\nslug = \"authors/jane-doe\"\ntitle = \"Posts by Jane Doe\"\nfilter = \"published == True and author == 'Jane Doe'\"\nsort = \"date\"\nreverse = true\n```\n\n**Beginner-friendly content:**\n```toml\n[[markata-go.feeds]]\nslug = \"beginners\"\ntitle = \"Beginner Guides\"\nfilter = \"published == True and difficulty == 'beginner'\"\nsort = \"date\"\nreverse = true\n```\n\n---\n\n---\n\n## Next Steps\n\nNow that you understand frontmatter, here are recommended next steps based on what you want to do:\n\n**Organize your content with feeds:**\n- [Feeds Guide](/docs/guides/feeds/) - Learn how to create filtered, sorted collections using your frontmatter fields\n\n**Customize how your content looks:**\n- [Templates Guide](/docs/guides/templates/) - Use frontmatter values in your templates\n- [Themes Guide](/docs/guides/themes/) - Style your site with color palettes and custom CSS\n\n**Learn about Markdown features:**\n- [Markdown Guide](/docs/guides/markdown/) - Advanced Markdown syntax and extensions\n\n---\n\n## See Also\n\n- [Feeds Guide](/docs/guides/feeds/) - Complete guide to feed filtering and configuration\n- [Templates Guide](/docs/guides/templates/) - Using frontmatter in templates\n- [Configuration Guide](/docs/guides/configuration/) - Site-wide defaults and settings\n- [Quick Reference](/docs/guides/quick-reference/) - Frontmatter snippets and cheat sheets\n",
      "summary": "Complete guide to post metadata, built-in fields, and custom frontmatter in markata-go",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "frontmatter",
        "content"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/feeds/",
      "url": "https://markata.dev/docs/guides/feeds/",
      "title": "Feeds Guide",
      "content_html": "\u003ch2 id=\"feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeeds\u003c/span\u003e \u003ca href=\"#feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor a photo-first shots archive, set \u003ccode\u003ehtml = \u0026quot;feed-photo-grid.html\u0026quot;\u003c/code\u003e under the feed\u0026rsquo;s \u003ccode\u003e[markata-go.feeds.templates]\u003c/code\u003e table. See the \u003ca href=\"/docs/guides/galleries/\"\u003ephoto galleries guide\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eEditorial feed cards keep thumbnails lazy loaded, including featured weekly\nleads. Use eager loading and high fetch priority only when a page\u0026rsquo;s actual\nabove-the-fold image is likely to be its Largest Contentful Paint element.\u003c/p\u003e\n\u003cp\u003eFeeds are the core differentiator of markata-go. A feed is a \u003cstrong\u003efiltered, sorted, paginated collection of posts\u003c/strong\u003e that can output to \u003cstrong\u003emultiple formats\u003c/strong\u003e simultaneously from a single definition.\u003c/p\u003e\n\u003cp\u003eFeeds only include posts that produced renderable page output. If a page is skipped, remains a draft, or has no rendered HTML because its content is empty, markata-go omits it from feed pages and syndication outputs instead of publishing a broken entry.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003ePrerequisites:\u003c/strong\u003e Before diving into feeds, you should understand:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/frontmatter/\"\u003eFrontmatter Guide\u003c/a\u003e - How post metadata works (feeds filter based on frontmatter)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfiguration Guide\u003c/a\u003e - Basic config file structure\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"why-feeds-matter\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhy Feeds Matter\u003c/span\u003e \u003ca href=\"#why-feeds-matter\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFeeds solve a common problem in static site generation: you need the same collection of posts in different formats for different consumers.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e                         FEED DEFINITION\n  filter: \u0026quot;published == True and 'python' in tags\u0026quot;\n  sort: \u0026quot;date\u0026quot;\n  reverse: true\n  items_per_page: 10\n                              |\n                              v\n                        OUTPUT FORMATS\n  +-------+--------+-------+-------+-------+----------+------+---------+\n  | HTML  | Simple |  RSS  | Atom  | JSON  | Markdown | Text | Sitemap |\n  | index |  list  | feed  | feed  |  API  |   list   | list |   XML   |\n  +-------+--------+-------+-------+-------+----------+------+---------+\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eBenefits:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eOne definition, many outputs\u003c/strong\u003e - Define a collection once, get HTML pages, a simple list view, RSS, Atom, JSON API, sitemap, etc.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eComposable\u003c/strong\u003e - Feeds can share filters or inherit from defaults\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFlexible\u003c/strong\u003e - Every \u0026ldquo;index page\u0026rdquo; is a feed: home, archives, tags, categories, search indexes\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFamiliar\u003c/strong\u003e - Mirrors how content platforms work (RSS readers, APIs, syndication)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"embedding-feeds-in-content\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEmbedding Feeds in Content\u003c/span\u003e \u003ca href=\"#embedding-feeds-in-content\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ccode\u003ejinja_md\u003c/code\u003e plugin and page templates expose two helpers that surface feed data without littering Markdown with raw HTML.\u003c/p\u003e\n\u003ch3 id=\"render_feed-snippet-helper\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003erender_feed\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e snippet helper\u003c/span\u003e \u003ca href=\"#render_feed-snippet-helper\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003erender_feed\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;card\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003eRenders the latest posts for a feed slug using the default partial \u003ccode\u003epartials/feed_preview.html\u003c/code\u003e. The \u003ccode\u003ecard\u003c/code\u003e layout now includes \u003ccode\u003epartials/cards/card-router.html\u003c/code\u003e, so each post renders with the card for its template (article, note, photo, etc.) and photo/shot cards display their media inside a \u003ccode\u003e\u0026lt;figure\u0026gt;\u003c/code\u003e plus \u003ccode\u003e\u0026lt;figcaption\u0026gt;\u003c/code\u003e caption. \u003ccode\u003evariant\u003c/code\u003e accepts \u003ccode\u003ecard\u003c/code\u003e or \u003ccode\u003elist\u003c/code\u003e and defaults to \u003ccode\u003ecard\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elimit\u003c/code\u003e truncates the rendered posts even if the feed definition includes more items. The helper gracefully falls back to a simple \u003ccode\u003e\u0026lt;section\u0026gt;\u003c/code\u003e if the template or engine is unavailable.\u003c/li\u003e\n\u003cli\u003eYou can pass options as positional args (\u003ccode\u003elimit\u003c/code\u003e, \u003ccode\u003evariant\u003c/code\u003e) in markdown/Jinja content, or with an options map in full templates. The template override key remains \u003ccode\u003etemplate\u003c/code\u003e (for example, \u003ccode\u003e{\u0026quot;template\u0026quot;: \u0026quot;partials/custom-feed.html\u0026quot;}\u003c/code\u003e in template files).\u003c/li\u003e\n\u003cli\u003eThe rendered HTML is emitted as a single block with no blank lines, so Markdown never re-parses card text as lists, marks or code. Card excerpts use the \u003ccode\u003esummary\u003c/code\u003e filter for the same reason.\u003c/li\u003e\n\u003cli\u003eAn unknown feed slug renders nothing and logs a \u003ccode\u003ejinja_md\u003c/code\u003e warning naming the slug — check the build output if a section comes up empty.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"last-5-blog-shot-ping-thought-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLast 5 blog/shot/ping/thought example\u003c/span\u003e \u003ca href=\"#last-5-blog-shot-ping-thought-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003erender_feed\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;card\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003erender_feed\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;shot\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;list\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003erender_feed\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ping\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;card\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003erender_feed\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;thought\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;card\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEach \u003ccode\u003erender_feed\u003c/code\u003e call delimits the latest posts for that feed slug. The default partial already styles cards and lists, letting Markdown stay declarative.\u003c/p\u003e\n\u003ch3 id=\"feed_posts-data-helper\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003efeed_posts\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e data helper\u003c/span\u003e \u003ca href=\"#feed_posts-data-helper\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen you need total control over markup (e.g., a custom grid or table), use \u003ccode\u003efeed_posts\u003c/code\u003e to iterate over post maps.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eset\u003c/span\u003e \u003cspan class=\"nv\"\u003elatest_blog\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003efeed_posts\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;limit\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e\u003cspan class=\"o\"\u003e})\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e\u0026lt;ul class=\u0026#34;latest-blog\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e  \u003c/span\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"nv\"\u003epost\u003c/span\u003e \u003cspan class=\"k\"\u003ein\u003c/span\u003e \u003cspan class=\"nv\"\u003elatest_blog\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e  \u0026lt;li\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e    \u0026lt;a href=\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.href\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\u0026#34;\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.title\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\u0026lt;/a\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e    \u003c/span\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.date\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e    \u0026lt;time datetime=\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.date\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"nf\"\u003eatom_date\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\u0026#34;\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.date\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"nf\"\u003edate\u003c/span\u003e\u003cspan class=\"s2\"\u003e:\u0026#34;Jan 2, 2006\u0026#34;\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\u0026lt;/time\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e    \u003c/span\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eendif\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e  \u0026lt;/li\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e  \u003c/span\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eendfor\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"x\"\u003e\u0026lt;/ul\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003efeed_posts\u003c/code\u003e returns the same map shape that templates receive (\u003ccode\u003ehref\u003c/code\u003e, \u003ccode\u003etitle\u003c/code\u003e, \u003ccode\u003edescription\u003c/code\u003e, \u003ccode\u003edate\u003c/code\u003e, \u003ccode\u003etags\u003c/code\u003e, etc.), making it ideal for layouts that differ from the default card/list styling.\u003c/p\u003e\n\u003ch2 id=\"basic-feed-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Feed Configuration\u003c/span\u003e \u003ca href=\"#basic-feed-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA feed is defined in your \u003ccode\u003emarkata-go.toml\u003c/code\u003e using the \u003ccode\u003e[[markata-go.feeds]]\u003c/code\u003e array:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis creates a feed at \u003ccode\u003e/blog/\u003c/code\u003e with:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAll published posts\u003c/li\u003e\n\u003cli\u003eSorted by date (newest first)\u003c/li\u003e\n\u003cli\u003eHTML, simple HTML, RSS, Atom, JSON, and sitemap output (default formats)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"minimal-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMinimal Example\u003c/span\u003e \u003ca href=\"#minimal-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;All Posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf you use the default config, markata-go already includes an archive feed at \u003ccode\u003e/archive/\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"split-feeds-across-config-files\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSplit Feeds Across Config Files\u003c/span\u003e \u003ca href=\"#split-feeds-across-config-files\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eLarge sites often keep each feed in its own file.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# markata-go.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;config/feeds/*.toml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# config/feeds/blog.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou can also split one feed across multiple files:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# markata-go.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;config/feeds/blog.toml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;config/feeds/blog.outputs.toml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# config/feeds/blog.outputs.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e15\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFeeds merge by \u003ccode\u003eslug\u003c/code\u003e, so both fragments resolve to one \u003ccode\u003eblog\u003c/code\u003e feed.\u003c/p\u003e\n\u003ch3 id=\"full-configuration-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFull Configuration Example\u003c/span\u003e \u003ca href=\"#full-configuration-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Identity\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e                      \u003cspan class=\"c\"\u003e# URL path: /blog/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;All Posts\u0026#34;\u003c/span\u003e                \u003cspan class=\"c\"\u003e# Display title\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Latest blog posts\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Meta description\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Content Selection\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and date \u0026lt;= today\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                     \u003cspan class=\"c\"\u003e# Newest first\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_private\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e            \u003cspan class=\"c\"\u003e# Include private posts (default: false)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Pagination\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e                \u003cspan class=\"c\"\u003e# 0 = no pagination (all on one page)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eorphan_threshold\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e               \u003cspan class=\"c\"\u003e# If last page has \u0026lt;=3 items, merge with previous\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Limit/Offset\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elimit\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e                          \u003cspan class=\"c\"\u003e# Hard cap on total items (0 = unlimited)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoffset\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e                         \u003cspan class=\"c\"\u003e# Skip the first N items (0 = none)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Output Formats\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                        \u003cspan class=\"c\"\u003e# /blog/index.html, /blog/page/2/index.html\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esimple_html\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# /blog/simple/index.html\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                         \u003cspan class=\"c\"\u003e# /blog/rss.xml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                        \u003cspan class=\"c\"\u003e# /blog/atom.xml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                        \u003cspan class=\"c\"\u003e# /blog/feed.json\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esitemap\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                     \u003cspan class=\"c\"\u003e# /blog/sitemap.xml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e                   \u003cspan class=\"c\"\u003e# /blog.md\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e                       \u003cspan class=\"c\"\u003e# /blog.txt\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Custom Templates\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;feed.html\u0026#34;\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# Template for HTML pages\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecard\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;partials/card.html\u0026#34;\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Template for post cards in list\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;rss.xml\u0026#34;\u003c/span\u003e                    \u003cspan class=\"c\"\u003e# Template for RSS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;atom.xml\u0026#34;\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# Template for Atom\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;feed.json\u0026#34;\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# Template for JSON\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePrivate posts are excluded unless a feed explicitly sets \u003ccode\u003einclude_private = true\u003c/code\u003e. The compatibility setting \u003ccode\u003eprivate = true\u003c/code\u003e has the same effect. An\nopted-in feed may show safe post metadata and encrypted article HTML, but it\nnever publishes raw Markdown, unencrypted content, encryption key names,\ncontent-derived descriptions, or private media references. Private feed\ndefinitions are hidden from \u003ccode\u003e/feeds/\u003c/code\u003e unless \u003ccode\u003efeeds_page.show_private_feeds\u003c/code\u003e\nlists them.\u003c/p\u003e\n\u003ch2 id=\"filtering-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFiltering Posts\u003c/span\u003e \u003ca href=\"#filtering-posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ccode\u003efilter\u003c/code\u003e field uses a Python-like expression syntax to select which posts appear in a feed.\u003c/p\u003e\n\u003cp\u003eFor template-based filters, \u003ccode\u003etemplate\u003c/code\u003e and \u003ccode\u003etemplateKey\u003c/code\u003e are interchangeable. Equality checks also respect built-in template aliases, so \u003ccode\u003etemplateKey == \u0026quot;shots\u0026quot;\u003c/code\u003e matches posts using \u003ccode\u003eshot\u003c/code\u003e, \u003ccode\u003eshots\u003c/code\u003e, or \u003ccode\u003ephoto\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"filter-operators\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFilter Operators\u003c/span\u003e \u003ca href=\"#filter-operators\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOperator\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e==\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEqual\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epublished == True\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e!=\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNot equal\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edraft != True\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026gt;\u003c/code\u003e, \u003ccode\u003e\u0026gt;=\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGreater than\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edate \u0026gt;= '2024-01-01'\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026lt;\u003c/code\u003e, \u003ccode\u003e\u0026lt;=\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLess than\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edate \u0026lt; '2025-01-01'\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ein\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eContains (tags)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e'python' in tags\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econtains\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eString contains\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etags contains 'python'\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eand\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLogical AND\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epublished == True and featured == True\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eor\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLogical OR\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e'python' in tags or 'go' in tags\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enot\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLogical NOT\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003enot draft\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"filter-examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFilter Examples\u003c/span\u003e \u003ca href=\"#filter-examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Published posts only\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Exclude drafts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;draft == False\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Posts with a specific tag\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;tutorial\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Multiple tags (OR)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;python\u0026#39; in tags or \u0026#39;go\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Combined conditions\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and featured == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Date range\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date \u0026gt;= \u0026#39;2024-01-01\u0026#39; and date \u0026lt; \u0026#39;2025-01-01\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# By slug\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;slug != \u0026#39;about\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Template aliases\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;templateKey == \u0026#39;shots\u0026#39; and \u0026#39;family\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Complex filter\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and (\u0026#39;python\u0026#39; in tags or \u0026#39;go\u0026#39; in tags) and featured == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"sorting-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSorting Posts\u003c/span\u003e \u003ca href=\"#sorting-posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eControl the order of posts with \u003ccode\u003esort\u003c/code\u003e and \u003ccode\u003ereverse\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Field to sort by\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e       \u003cspan class=\"c\"\u003e# true = descending (newest first)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"sort-fields\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSort Fields\u003c/span\u003e \u003ca href=\"#sort-fields\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eYou can sort by any post field:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edate\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePublication date (most common)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAlphabetical by title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eslug\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAlphabetical by slug\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ereading_time\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBy reading time\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAny frontmatter\u003c/td\u003e\n\u003ctd\u003eSort by custom fields\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"sort-examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSort Examples\u003c/span\u003e \u003ca href=\"#sort-examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Newest first (most common)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Oldest first (chronological)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Alphabetical by title\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Custom field (priority)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;priority\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"pagination\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePagination\u003c/span\u003e \u003ca href=\"#pagination\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFeeds support three pagination strategies for different use cases.\u003c/p\u003e\n\u003cp\u003eThe feed sidebar lists posts on the current page. Use the feed pagination\ncontrols to reach older and newer pages; the sidebar does not repeat every\npost in a long feed.\u003c/p\u003e\n\u003ch3 id=\"pagination-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePagination Configuration\u003c/span\u003e \u003ca href=\"#pagination-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e           \u003cspan class=\"c\"\u003e# Posts per page (0 = all on one page)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eorphan_threshold\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Merge last page if \u0026lt;= N items\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epagination_type\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;manual\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Pagination strategy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"limit-offset\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLimit + Offset\u003c/span\u003e \u003ca href=\"#limit-offset\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse \u003ccode\u003elimit\u003c/code\u003e and \u003ccode\u003eoffset\u003c/code\u003e to hard-cap a feed before pagination. This is useful for\n\u0026ldquo;latest N\u0026rdquo; lists or skipping a fixed number of entries.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elimit\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Only include 3 posts total\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eoffset\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e     \u003cspan class=\"c\"\u003e# Skip the newest post\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"feed-timestamps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Timestamps\u003c/span\u003e \u003ca href=\"#feed-timestamps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFeed timestamps are deterministic and based on content, not build time:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAtom \u003ccode\u003e\u0026lt;updated\u0026gt;\u003c/code\u003e and RSS \u003ccode\u003e\u0026lt;lastBuildDate\u0026gt;\u003c/code\u003e use the most recent post date in the feed.\u003c/li\u003e\n\u003cli\u003eIf no posts have dates, these fields are omitted.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThis avoids no-change incremental builds rewriting feeds.\u003c/p\u003e\n\u003ch3 id=\"pagination-types\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePagination Types\u003c/span\u003e \u003ca href=\"#pagination-types\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eUse Case\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emanual\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTraditional page links\u003c/td\u003e\n\u003ctd\u003eSEO-friendly, works without JavaScript\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehtmx\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAJAX-based loading via HTMX\u003c/td\u003e\n\u003ctd\u003eModern, seamless UX without full page reloads\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ejs\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCustom JavaScript pagination\u003c/td\u003e\n\u003ctd\u003eFull control over pagination behavior\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"manual-pagination-default\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eManual Pagination (Default)\u003c/span\u003e \u003ca href=\"#manual-pagination-default\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eStandard pagination with full page reloads:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epagination_type\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;manual\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eGenerates:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e/blog/index.html           # Page 1\n/blog/page/2/index.html    # Page 2\n/blog/page/3/index.html    # Page 3\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"htmx-pagination\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHTMX Pagination\u003c/span\u003e \u003ca href=\"#htmx-pagination\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eHTMX pagination provides seamless content loading without full page reloads:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtmx_version\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2.0.8\u0026#34;\u003c/span\u003e             \u003cspan class=\"c\"\u003e# HTMX version to use\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epagination_type\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;htmx\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etemplate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;feed.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epartial_template\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;feed_partial.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eHow it works:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eUser clicks \u0026ldquo;Next\u0026rdquo; or page number\u003c/li\u003e\n\u003cli\u003eHTMX intercepts click, sends GET request\u003c/li\u003e\n\u003cli\u003eServer returns partial HTML (just the posts list)\u003c/li\u003e\n\u003cli\u003eHTMX swaps new content into existing container\u003c/li\u003e\n\u003cli\u003eURL updates via pushState (browser history works)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eOutput structure:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e/blog/\n  index.html                 # Full page (page 1)\n  partial/\n    index.html               # Partial content (page 1)\n  page/\n    2/\n      index.html             # Full page (page 2)\n      partial/\n        index.html           # Partial content (page 2)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eHTMX template example:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- feed.html (full page) --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;feed-content\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehx-swap-oob\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% include \u0026#34;feed_partial.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;pagination\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% if pagination.has_prev %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.slug }}/page/{{ pagination.prev_page }}/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"na\"\u003ehx-get\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.slug }}/page/{{ pagination.prev_page }}/partial/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"na\"\u003ehx-target\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#feed-content\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"na\"\u003ehx-push-url\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Previous\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% if pagination.has_next %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.slug }}/page/{{ pagination.next_page }}/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"na\"\u003ehx-get\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.slug }}/page/{{ pagination.next_page }}/partial/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"na\"\u003ehx-target\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#feed-content\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"na\"\u003ehx-push-url\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Next\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"javascript-pagination\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJavaScript Pagination\u003c/span\u003e \u003ca href=\"#javascript-pagination\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor custom JavaScript implementations:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epagination_type\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;js\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eGenerates a configuration file at \u003ccode\u003e/static/js/pagination-config.js\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epaginationData\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;enabled\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;page\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;totalPages\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;totalPosts\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e47\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;itemsShown\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;feedName\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;hasNext\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"orphan-threshold\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOrphan Threshold\u003c/span\u003e \u003ca href=\"#orphan-threshold\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe \u003ccode\u003eorphan_threshold\u003c/code\u003e prevents tiny last pages:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eorphan_threshold\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e    \u003cspan class=\"c\"\u003e# If last page has \u0026lt;=3 items, merge with previous\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWith 23 posts and \u003ccode\u003eitems_per_page = 10\u003c/code\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWithout threshold: Page 1 (10), Page 2 (10), Page 3 (3)\u003c/li\u003e\n\u003cli\u003eWith threshold: Page 1 (10), Page 2 (13)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"output-formats\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOutput Formats\u003c/span\u003e \u003ca href=\"#output-formats\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEach feed can generate multiple output formats simultaneously.\u003c/p\u003e\n\u003ch3 id=\"html\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHTML\u003c/span\u003e \u003ca href=\"#html\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePaginated HTML index pages.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e/blog/index.html           # Page 1\n/blog/page/2/index.html    # Page 2\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"simple-html\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSimple HTML\u003c/span\u003e \u003ca href=\"#simple-html\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eA compact, dense list view of posts designed to fit many entries on screen. Each post renders as a single line with title (as a link), date, and reading time. The simple feed is generated alongside the standard HTML feed automatically.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esimple_html\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e/blog/simple/index.html           # Page 1\n/blog/simple/page/2/index.html    # Page 2\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe simple feed page includes a navigation switcher to toggle between the full (rich card) view and the simple list view. Each entry uses \u003ca href=\"http://microformats.org/wiki/h-entry\"\u003emicroformats2\u003c/a\u003e markup (\u003ccode\u003eh-entry\u003c/code\u003e, \u003ccode\u003ep-name\u003c/code\u003e, \u003ccode\u003edt-published\u003c/code\u003e).\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhen to use the simple format:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eDense archives\u003c/strong\u003e \u0026ndash; Show many posts at a glance without scrolling through large cards\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eQuick scanning\u003c/strong\u003e \u0026ndash; Readers who know what they\u0026rsquo;re looking for can scan titles and dates rapidly\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLow-bandwidth\u003c/strong\u003e \u0026ndash; Minimal HTML and no images, loads fast on slow connections\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePrint-friendly\u003c/strong\u003e \u0026ndash; Styled for clean printing via \u003ccode\u003e@media print\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eDisabling the simple format\u003c/strong\u003e for a specific feed:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;api/posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003esimple_html\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"rss-2-0\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRSS 2.0\u003c/span\u003e \u003ca href=\"#rss-2-0\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eRSS feed for feed readers.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e \u003ccode\u003e/blog/rss.xml\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;rss\u003c/span\u003e \u003cspan class=\"na\"\u003eversion=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;2.0\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003exmlns:atom=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;http://www.w3.org/2005/Atom\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;channel\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003eBlog\u003cspan class=\"nt\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;link\u0026gt;\u003c/span\u003ehttps://example.com/blog/\u003cspan class=\"nt\"\u003e\u0026lt;/link\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;description\u0026gt;\u003c/span\u003eLatest blog posts\u003cspan class=\"nt\"\u003e\u0026lt;/description\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;lastBuildDate\u0026gt;\u003c/span\u003eMon, 15 Jan 2024 12:00:00 +0000\u003cspan class=\"nt\"\u003e\u0026lt;/lastBuildDate\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;atom:link\u003c/span\u003e \u003cspan class=\"na\"\u003ehref=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com/blog/rss.xml\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;self\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/rss+xml\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;item\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003eMy Post\u003cspan class=\"nt\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026lt;link\u0026gt;\u003c/span\u003ehttps://example.com/my-post/\u003cspan class=\"nt\"\u003e\u0026lt;/link\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026lt;guid\u003c/span\u003e \u003cspan class=\"na\"\u003eisPermaLink=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003ehttps://example.com/my-post/\u003cspan class=\"nt\"\u003e\u0026lt;/guid\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026lt;pubDate\u0026gt;\u003c/span\u003eMon, 15 Jan 2024 12:00:00 +0000\u003cspan class=\"nt\"\u003e\u0026lt;/pubDate\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026lt;description\u0026gt;\u003c/span\u003ePost description...\u003cspan class=\"nt\"\u003e\u0026lt;/description\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;/item\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;/channel\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;/rss\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"atom\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAtom\u003c/span\u003e \u003ca href=\"#atom\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAtom feed (RFC 4287).\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e \u003ccode\u003e/blog/atom.xml\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;feed\u003c/span\u003e \u003cspan class=\"na\"\u003exmlns=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;http://www.w3.org/2005/Atom\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003eBlog\u003cspan class=\"nt\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;link\u003c/span\u003e \u003cspan class=\"na\"\u003ehref=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com/blog/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;link\u003c/span\u003e \u003cspan class=\"na\"\u003ehref=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com/blog/atom.xml\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;self\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;id\u0026gt;\u003c/span\u003ehttps://example.com/blog/\u003cspan class=\"nt\"\u003e\u0026lt;/id\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;updated\u0026gt;\u003c/span\u003e2024-01-15T12:00:00Z\u003cspan class=\"nt\"\u003e\u0026lt;/updated\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;entry\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003eMy Post\u003cspan class=\"nt\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;link\u003c/span\u003e \u003cspan class=\"na\"\u003ehref=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://example.com/my-post/\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;id\u0026gt;\u003c/span\u003ehttps://example.com/my-post/\u003cspan class=\"nt\"\u003e\u0026lt;/id\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;published\u0026gt;\u003c/span\u003e2024-01-15T12:00:00Z\u003cspan class=\"nt\"\u003e\u0026lt;/published\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;updated\u0026gt;\u003c/span\u003e2024-01-15T12:00:00Z\u003cspan class=\"nt\"\u003e\u0026lt;/updated\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;summary\u0026gt;\u003c/span\u003ePost description...\u003cspan class=\"nt\"\u003e\u0026lt;/summary\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;/entry\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;/feed\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"styled-rss-and-atom-pages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStyled RSS and Atom Pages\u003c/span\u003e \u003ca href=\"#styled-rss-and-atom-pages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eRSS and Atom feeds link to \u003ccode\u003e/rss.xsl\u003c/code\u003e and \u003ccode\u003e/atom.xsl\u003c/code\u003e, so a browser shows a readable page instead of raw XML. Both pages use your site\u0026rsquo;s theme: the same palette, light or dark mode, fontpack, text size, and aesthetic. They also follow the visitor\u0026rsquo;s own theme picker choices. When you change the theme, the feed pages change with it.\u003c/p\u003e\n\u003cp\u003eThe browser view identifies itself as a feed, explains how to subscribe, and presents entries in a numbered reading list. Feed readers still receive the original RSS or Atom XML; the stylesheet only changes how a browser displays it. The same stylesheet supports either format, so custom views can keep their visual treatment consistent.\u003c/p\u003e\n\u003cp\u003eTo customize a feed page, copy \u003ccode\u003erss.xsl\u003c/code\u003e or \u003ccode\u003eatom.xsl\u003c/code\u003e into your \u003ccode\u003etemplates/\u003c/code\u003e directory. Keep this block inside \u003ccode\u003e\u0026lt;head\u0026gt;\u003c/code\u003e to keep the site theme; markata-go replaces it with the theme\u0026rsquo;s styles and scripts when it builds:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- markata:theme-head --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;link\u003c/span\u003e \u003cspan class=\"na\"\u003erel=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;stylesheet\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/css/variables.css\u0026#34;\u003c/span\u003e \u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;link\u003c/span\u003e \u003cspan class=\"na\"\u003erel=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;stylesheet\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/css/main.css\u0026#34;\u003c/span\u003e \u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- /markata:theme-head --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eA custom stylesheet without this block is copied as-is. To change what is injected, override \u003ccode\u003epartials/feed-xsl-head.html\u003c/code\u003e in your templates.\u003c/p\u003e\n\u003ch3 id=\"json-feed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJSON Feed\u003c/span\u003e \u003ca href=\"#json-feed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eJSON Feed (version 1.1) for modern feed readers and APIs.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e \u003ccode\u003e/blog/feed.json\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://jsonfeed.org/version/1.1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;home_page_url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;feed_url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/blog/feed.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Latest blog posts\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;items\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/my-post/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/my-post/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;content_html\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026lt;p\u0026gt;Post content...\u0026lt;/p\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;summary\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Post description...\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;date_published\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2024-01-15T12:00:00Z\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;tags\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorial\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"markdown\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMarkdown\u003c/span\u003e \u003ca href=\"#markdown\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eMarkdown list of posts (useful for READMEs, documentation).\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e \u003ccode\u003e/blog.md\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Blog\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLatest blog posts\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eMy Post\u003c/span\u003e](\u003cspan class=\"na\"\u003e/my-post/\u003c/span\u003e) - 2024-01-15\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eAnother Post\u003c/span\u003e](\u003cspan class=\"na\"\u003e/another-post/\u003c/span\u003e) - 2024-01-10\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"plain-text\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlain Text\u003c/span\u003e \u003ca href=\"#plain-text\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSimple text list (useful for APIs, scripts, minimal readers).\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e \u003ccode\u003e/blog.txt\u003c/code\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eBlog\n====\n\nLatest blog posts\n\n2024-01-15 - My Post\n  /my-post/\n\n2024-01-10 - Another Post\n  /another-post/\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eText output always produces clean plain text \u0026ndash; HTML entities are decoded to their literal characters and no HTML tags appear in the output. Links from HTML content are converted to footnote-style references. See the \u003ca href=\"/docs/guides/templates/#text-templates\"\u003eTemplates Guide\u003c/a\u003e for details on using the \u003ccode\u003eplaintext\u003c/code\u003e filter.\u003c/p\u003e\n\u003ch3 id=\"sitemap\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSitemap\u003c/span\u003e \u003ca href=\"#sitemap\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eXML sitemap for search engines.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esitemap\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e \u003ccode\u003e/blog/sitemap.xml\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;urlset\u003c/span\u003e \u003cspan class=\"na\"\u003exmlns=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;http://www.sitemaps.org/schemas/sitemap/0.9\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;url\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;loc\u0026gt;\u003c/span\u003ehttps://example.com/my-post/\u003cspan class=\"nt\"\u003e\u0026lt;/loc\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;lastmod\u0026gt;\u003c/span\u003e2024-01-15\u003cspan class=\"nt\"\u003e\u0026lt;/lastmod\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;changefreq\u0026gt;\u003c/span\u003eweekly\u003cspan class=\"nt\"\u003e\u0026lt;/changefreq\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;priority\u0026gt;\u003c/span\u003e0.5\u003cspan class=\"nt\"\u003e\u0026lt;/priority\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;/url\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;/urlset\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"auto-generated-tag-feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuto-Generated Tag Feeds\u003c/span\u003e \u003ca href=\"#auto-generated-tag-feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go can automatically create feeds for each unique tag in your posts.\u003c/p\u003e\n\u003cp\u003eAutomatic and configured feeds refresh selection diagnostics on every Collect,\nincluding exclusions and feeds whose output publishing is skipped. Selection\nscratch is reused only within that invocation, not cached between builds.\nPrivacy choices, preset series order, duplicate source occurrences, and\noffset/limit exclusion reasons remain unchanged. For timing, inspect the bounded\n\u003ccode\u003eauto_feeds\u003c/code\u003e collection debug record described in the \u003ca href=\"performance.md\"\u003eperformance guide\u003c/a\u003e;\nit separates generation, filtering/sorting, diagnostic selection recording, and\npagination/preparation without logging post paths or feed names.\u003c/p\u003e\n\u003ch3 id=\"enable-auto-tags\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnable Auto Tags\u003c/span\u003e \u003ca href=\"#enable-auto-tags\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauto_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug_prefix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tags\u0026#34;\u003c/span\u003e               \u003cspan class=\"c\"\u003e# /tags/python/, /tags/go/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauto_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"generated-output\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGenerated Output\u003c/span\u003e \u003ca href=\"#generated-output\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf your posts have tags \u003ccode\u003epython\u003c/code\u003e, \u003ccode\u003ego\u003c/code\u003e, and \u003ccode\u003etutorial\u003c/code\u003e:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e/tags/\n  python/\n    index.html\n    rss.xml\n  go/\n    index.html\n    rss.xml\n  tutorial/\n    index.html\n    rss.xml\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"auto-categories\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuto Categories\u003c/span\u003e \u003ca href=\"#auto-categories\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSimilar to tags, but for the \u003ccode\u003ecategory\u003c/code\u003e frontmatter field:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauto_categories\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug_prefix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;categories\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauto_categories\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"auto-archives\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuto Archives\u003c/span\u003e \u003ca href=\"#auto-archives\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAutomatic date-based archive feeds:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauto_archives\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug_prefix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;archive\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eyearly_feeds\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e               \u003cspan class=\"c\"\u003e# /archive/2024/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emonthly_feeds\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e              \u003cspan class=\"c\"\u003e# /archive/2024/01/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauto_archives\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"feed-defaults-and-inheritance\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Defaults and Inheritance\u003c/span\u003e \u003ca href=\"#feed-defaults-and-inheritance\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eConfigure defaults that apply to all feeds, then override as needed.\u003c/p\u003e\n\u003ch3 id=\"global-defaults\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGlobal Defaults\u003c/span\u003e \u003ca href=\"#global-defaults\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Default values for ALL feeds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefaults\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eorphan_threshold\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;feed.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecard\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;partials/card.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;rss.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;atom.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;feed.json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Syndication settings (RSS/Atom/JSON limits)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esyndication\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_items\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\u003c/span\u003e                     \u003cspan class=\"c\"\u003e# Max items in RSS/Atom feeds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_content\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e            \u003cspan class=\"c\"\u003e# Include full content or just summary\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"inheritance-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInheritance Example\u003c/span\u003e \u003ca href=\"#inheritance-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Global defaults\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefaults\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Home page - override items_per_page and formats\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Home\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# Override: fewer items\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Override: no RSS for home\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Blog - inherits all defaults\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Inherits: items_per_page=10, html=true, rss=true\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# API endpoint - completely different formats\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;api/posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Posts API\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# Override: no pagination\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Override: JSON only\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"format-override-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFormat Override Behavior\u003c/span\u003e \u003ca href=\"#format-override-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen overriding formats:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Defaults: html=true, rss=true, atom=false, json=false\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Add to defaults (merge)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Result: html=true, rss=true, atom=true, json=false\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Disable specific format\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Result: html=true, rss=false, atom=false, json=false\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Complete replacement\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Result: json only\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"common-patterns\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Patterns\u003c/span\u003e \u003ca href=\"#common-patterns\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"home-page-feed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHome Page Feed\u003c/span\u003e \u003ca href=\"#home-page-feed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe home page is a feed with an empty slug:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e                          \u003cspan class=\"c\"\u003e# Outputs to /index.html\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Recent Posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e                        \u003cspan class=\"c\"\u003e# Usually no RSS on home page\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"archive-all-posts-no-pagination\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eArchive (All Posts, No Pagination)\u003c/span\u003e \u003ca href=\"#archive-all-posts-no-pagination\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;archive\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;All Posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# No pagination - all posts on one page\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"private-archive-including-private-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrivate Archive (Including Private Posts)\u003c/span\u003e \u003ca href=\"#private-archive-including-private-posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf you want a feed that includes private posts (useful for personal archives or admin pages):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;private-archive\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Private Archive\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_private\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e             \u003cspan class=\"c\"\u003e# Include private posts in this feed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e                        \u003cspan class=\"c\"\u003e# Usually don\u0026#39;t syndicate private posts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf RSS, Atom, or JSON Feed is enabled for this feed, private entries contain\nonly the encrypted article wrapper and safe metadata. The feed wrapper omits\nthe encryption key name, so entries decrypt individually and do not share\nsession storage. Public feeds continue to exclude private posts.\u003c/p\u003e\n\u003ch3 id=\"tag-pages-manual\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTag Pages (Manual)\u003c/span\u003e \u003ca href=\"#tag-pages-manual\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf you don\u0026rsquo;t want auto-generated tag feeds:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tags/python\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Python Posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and \u0026#39;python\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"featured-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeatured Posts\u003c/span\u003e \u003ca href=\"#featured-posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;featured\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Featured\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Hand-picked articles\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and featured == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"json-api-endpoint\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJSON API Endpoint\u003c/span\u003e \u003ca href=\"#json-api-endpoint\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;api/posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Posts API\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# All posts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                        \u003cspan class=\"c\"\u003e# JSON only\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"search-index\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSearch Index\u003c/span\u003e \u003ca href=\"#search-index\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGenerate a JSON index for client-side search:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;search\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Search Index\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;search-index.json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCustom template (\u003ccode\u003etemplates/search-index.json\u003c/code\u003e):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;posts\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e \u003cspan class=\"err\"\u003efor\u003c/span\u003e \u003cspan class=\"err\"\u003epost\u003c/span\u003e \u003cspan class=\"err\"\u003ein\u003c/span\u003e \u003cspan class=\"err\"\u003efeed.posts\u003c/span\u003e \u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e \u003cspan class=\"err\"\u003epost.title\u003c/span\u003e \u003cspan class=\"err\"\u003e|\u003c/span\u003e \u003cspan class=\"err\"\u003etojson\u003c/span\u003e \u003cspan class=\"p\"\u003e}},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;href\u0026#34;\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e \u003cspan class=\"err\"\u003epost.href\u003c/span\u003e \u003cspan class=\"err\"\u003e|\u003c/span\u003e \u003cspan class=\"err\"\u003etojson\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;content\u0026#34;\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e \u003cspan class=\"err\"\u003epost.content\u003c/span\u003e \u003cspan class=\"err\"\u003e|\u003c/span\u003e \u003cspan class=\"err\"\u003estriptags\u003c/span\u003e \u003cspan class=\"err\"\u003e|\u003c/span\u003e \u003cspan class=\"err\"\u003etruncate:500\u003c/span\u003e \u003cspan class=\"err\"\u003e|\u003c/span\u003e \u003cspan class=\"err\"\u003etojson\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;tags\u0026#34;\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e \u003cspan class=\"err\"\u003epost.tags\u003c/span\u003e \u003cspan class=\"err\"\u003e|\u003c/span\u003e \u003cspan class=\"err\"\u003etojson\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e \u003cspan class=\"err\"\u003eif\u003c/span\u003e \u003cspan class=\"err\"\u003enot\u003c/span\u003e \u003cspan class=\"err\"\u003eloop.last\u003c/span\u003e \u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e},{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e \u003cspan class=\"err\"\u003eendif\u003c/span\u003e \u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e \u003cspan class=\"err\"\u003eendfor\u003c/span\u003e \u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"global-sitemap\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGlobal Sitemap\u003c/span\u003e \u003ca href=\"#global-sitemap\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eRoot sitemap with all posts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e                          \u003cspan class=\"c\"\u003e# Root\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Sitemap\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e                       \u003cspan class=\"c\"\u003e# No HTML\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esitemap\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                     \u003cspan class=\"c\"\u003e# Sitemap only\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOutputs \u003ccode\u003e/sitemap.xml\u003c/code\u003e at the root.\u003c/p\u003e\n\u003ch3 id=\"tutorials-section\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTutorials Section\u003c/span\u003e \u003ca href=\"#tutorials-section\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Step-by-step guides\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and \u0026#39;tutorial\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"template-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Variables\u003c/span\u003e \u003ca href=\"#template-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen rendering feed templates, these variables are available:\u003c/p\u003e\n\u003ch3 id=\"feed-context-feed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Context (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003efeed\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#feed-context-feed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeed.slug\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eURL-safe identifier\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeed.title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eDisplay title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeed.description\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eFeed description\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeed.href\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eBase URL path (\u003ccode\u003e/blog/\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeed.posts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]Post\u003c/td\u003e\n\u003ctd\u003eAll matching posts (pre-pagination)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"pagination-context-pagination\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePagination Context (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003epagination\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#pagination-context-pagination\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epagination.current_page\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eCurrent page number (1-indexed)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epagination.total_pages\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eTotal number of pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epagination.total_items\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eTotal posts in feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epagination.items_per_page\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003ePosts per page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epagination.has_prev\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eHas previous page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epagination.has_next\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eHas next page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epagination.prev_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eURL to previous page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epagination.next_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eURL to next page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epagination.prev_page\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003ePrevious page number\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epagination.next_page\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eNext page number\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epagination.page_urls\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003eURLs for all pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"page-context-page\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePage Context (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003epage\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#page-context-page\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epage.number\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003ePage number\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epage.posts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]Post\u003c/td\u003e\n\u003ctd\u003ePosts on this page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epage.has_prev\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eHas previous page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epage.has_next\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eHas next page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epage.prev_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003ePrevious page URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epage.next_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eNext page URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"post-fields\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePost Fields\u003c/span\u003e \u003ca href=\"#post-fields\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEach post in \u003ccode\u003efeed.posts\u003c/code\u003e or \u003ccode\u003epage.posts\u003c/code\u003e has:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003ePost title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Slug\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eURL slug\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Href\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRelative URL (\u003ccode\u003e/my-post/\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Date\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003etime\u003c/td\u003e\n\u003ctd\u003ePublication date\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Published\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eWhether published\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Tags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003eList of tags\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Description\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003ePost description\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Content\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRaw markdown\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.ArticleHTML\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRendered HTML\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Extra\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003emap\u003c/td\u003e\n\u003ctd\u003eAdditional frontmatter\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"template-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Example\u003c/span\u003e \u003ca href=\"#template-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% extends \u0026#34;base.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ feed.title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% if feed.description %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ feed.description }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;posts\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% for post in page.posts %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Href }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e \u003cspan class=\"na\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Date|atom_date }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {{ post.Date|date_format:\u0026#34;January 2, 2006\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {% if post.Description %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Description }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;pagination\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if page.has_prev %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ page.prev_url }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;prev\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ePrevious\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ePage {{ pagination.current_page }} of {{ pagination.total_pages }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if page.has_next %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ page.next_url }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;next\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eNext\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"template-filters-for-feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Filters for Feeds\u003c/span\u003e \u003ca href=\"#template-filters-for-feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFilter\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erss_date\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFormat as RSS date\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ date|rss_date }}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eatom_date\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFormat as Atom/ISO date\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ date|atom_date }}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edate_format\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCustom date format\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ date|date_format:\u0026quot;2006-01-02\u0026quot; }}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etojson\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConvert to JSON\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ tags|tojson }}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eabsolute_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAdd base URL\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ href|absolute_url:config.URL }}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estriptags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRemove HTML tags\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ html|striptags }}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etruncate\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTruncate to length\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ text|truncate:100 }}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"built-in-feed-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuilt-In Feed Templates\u003c/span\u003e \u003ca href=\"#built-in-feed-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFeeds can opt into a different built-in HTML layout without copying templates into the site.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;shots\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Shots\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;templateKey == \\\u0026#34;shots\\\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;feed-photo-grid.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003efeed-photo-grid.html\u003c/code\u003e is a photo-grid archive designed for image-heavy feeds. It renders:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ea tight multi-column grid\u003c/li\u003e\n\u003cli\u003esquare cards by default\u003c/li\u003e\n\u003cli\u003etitle and description overlays on hover and keyboard focus\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epost.card_classes\u003c/code\u003e span hooks such as \u003ccode\u003ecol-span-2\u003c/code\u003e, \u003ccode\u003erow-span-2\u003c/code\u003e, and \u003ccode\u003ecol-span-4\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThat makes it a good fit for shots, screenshots, or gallery-style feeds where individual items should sometimes break out of the default square rhythm.\u003c/p\u003e\n\u003ch2 id=\"feed-discovery\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Discovery\u003c/span\u003e \u003ca href=\"#feed-discovery\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go provides automatic feed discovery so visitors and feed readers can find the right feed for each page.\u003c/p\u003e\n\u003ch3 id=\"how-it-works\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow It Works\u003c/span\u003e \u003ca href=\"#how-it-works\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEvery page automatically includes \u003ccode\u003e\u0026lt;link rel=\u0026quot;alternate\u0026quot;\u0026gt;\u003c/code\u003e tags in the \u003ccode\u003e\u0026lt;head\u0026gt;\u003c/code\u003e for feed discovery. The feed advertised depends on the page:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003ePosts with a sidebar feed\u003c/strong\u003e - If a post participates in a feed sidebar (e.g., a series or guide), the discovery links point to that feed.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOther pages\u003c/strong\u003e - All other pages advertise the site\u0026rsquo;s default subscription feeds (\u003ccode\u003e/rss.xml\u003c/code\u003e, \u003ccode\u003e/atom.xml\u003c/code\u003e).\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThis ensures readers always discover the most relevant feed for the content they\u0026rsquo;re viewing.\u003c/p\u003e\n\u003ch3 id=\"template-context\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Context\u003c/span\u003e \u003ca href=\"#template-context\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen rendering pages, markata-go injects a \u003ccode\u003ediscovery_feed\u003c/code\u003e variable into the template context:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ediscovery_feed.title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eFeed title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ediscovery_feed.has_rss\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eRSS format available\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ediscovery_feed.has_atom\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eAtom format available\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ediscovery_feed.has_json\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eJSON format available\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ediscovery_feed.rss_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRSS feed URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ediscovery_feed.atom_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eAtom feed URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ediscovery_feed.json_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eJSON feed URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"default-template-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDefault Template Behavior\u003c/span\u003e \u003ca href=\"#default-template-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe default \u003ccode\u003ebase.html\u003c/code\u003e template handles discovery automatically:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% if config.head.alternate_feeds %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {# Explicit override - user-configured feeds take precedence #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% for feed in config.head.alternate_feeds %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.type }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.title }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.href }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% elif discovery_feed %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {# Automatic per-page discovery #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if discovery_feed.has_rss %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/rss+xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ discovery_feed.title }} (RSS)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ discovery_feed.rss_url }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if discovery_feed.has_atom %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/atom+xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ discovery_feed.title }} (Atom)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ discovery_feed.atom_url }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if discovery_feed.has_json %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/feed+json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ discovery_feed.title }} (JSON)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ discovery_feed.json_url }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {# Fallback #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/rss+xml\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;RSS Feed\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/rss.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"override-with-head-alternate_feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOverride with \u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003ehead.alternate_feeds\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#override-with-head-alternate_feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf you need full control over discovery links, configure \u003ccode\u003ehead.alternate_feeds\u003c/code\u003e explicitly:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ealternate_feeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;application/rss+xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Custom Feed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehref\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/custom/rss.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen \u003ccode\u003ehead.alternate_feeds\u003c/code\u003e is set, it completely overrides the automatic discovery behavior.\u003c/p\u003e\n\u003ch2 id=\"built-in-subscription-feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuilt-in Subscription Feeds\u003c/span\u003e \u003ca href=\"#built-in-subscription-feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go automatically creates site-wide subscription feeds so visitors always have a way to subscribe.\u003c/p\u003e\n\u003ch3 id=\"generated-feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGenerated Feeds\u003c/span\u003e \u003ca href=\"#generated-feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBy default, these feeds are created automatically:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePath\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/rss.xml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite RSS feed (all published posts)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/atom.xml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSite Atom feed (all published posts)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/archive/rss.xml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eArchive RSS feed (same content as root)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/archive/atom.xml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eArchive Atom feed (same content as root)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"how-it-works-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow It Works\u003c/span\u003e \u003ca href=\"#how-it-works-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe \u003ccode\u003esubscription_feeds\u003c/code\u003e plugin creates two internal feeds:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eRoot feed\u003c/strong\u003e (\u003ccode\u003eslug = \u0026quot;\u0026quot;\u003c/code\u003e) - Generates \u003ccode\u003e/rss.xml\u003c/code\u003e and \u003ccode\u003e/atom.xml\u003c/code\u003e (no HTML to avoid overwriting your home page)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eArchive feed\u003c/strong\u003e (\u003ccode\u003eslug = \u0026quot;archive\u0026quot;\u003c/code\u003e) - Generates \u003ccode\u003e/archive/rss.xml\u003c/code\u003e and \u003ccode\u003e/archive/atom.xml\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eBoth feeds contain the same items: all published posts sorted by date (newest first).\u003c/p\u003e\n\u003ch3 id=\"customizing-subscription-feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustomizing Subscription Feeds\u003c/span\u003e \u003ca href=\"#customizing-subscription-feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe built-in feeds use sensible defaults, but you can override them by defining your own feeds with the same slugs:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Override the root subscription feed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and featured == True\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Only featured posts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Still no HTML (don\u0026#39;t overwrite home page)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"why-both-root-and-archive\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhy Both Root and Archive?\u003c/span\u003e \u003ca href=\"#why-both-root-and-archive\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRoot feeds\u003c/strong\u003e (\u003ccode\u003e/rss.xml\u003c/code\u003e, \u003ccode\u003e/atom.xml\u003c/code\u003e) - The standard location feed readers check first\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eArchive feeds\u003c/strong\u003e (\u003ccode\u003e/archive/...\u003c/code\u003e) - Alternative paths for services that expect feeds in subdirectories\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBoth contain identical content, ensuring maximum compatibility with feed readers and syndication services.\u003c/p\u003e\n\u003ch2 id=\"manual-feed-discovery-links\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eManual Feed Discovery Links\u003c/span\u003e \u003ca href=\"#manual-feed-discovery-links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf you need to add discovery links manually in a custom template:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c\"\u003e\u0026lt;!-- RSS Feed --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/rss+xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.title }} (RSS)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.href }}rss.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c\"\u003e\u0026lt;!-- Atom Feed --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/atom+xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.title }} (Atom)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.href }}atom.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c\"\u003e\u0026lt;!-- JSON Feed --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;application/feed+json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.title }} (JSON)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.href }}feed.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"websub-discovery\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWebSub Discovery\u003c/span\u003e \u003ca href=\"#websub-discovery\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf you enable WebSub, markata-go also emits hub discovery links:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hub\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://hub.example.com/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRSS/Atom feeds include \u003ccode\u003erel=\u0026quot;hub\u0026quot;\u003c/code\u003e and \u003ccode\u003erel=\u0026quot;self\u0026quot;\u003c/code\u003e links when WebSub is enabled.\u003c/p\u003e\n\u003ch2 id=\"configuration-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration Reference\u003c/span\u003e \u003ca href=\"#configuration-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"feed-config-fields\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Config Fields\u003c/span\u003e \u003ca href=\"#feed-config-fields\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eslug\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRequired\u003c/td\u003e\n\u003ctd\u003eURL path (\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e for root)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRequired\u003c/td\u003e\n\u003ctd\u003eDisplay title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edescription\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFeed description\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efilter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFilter expression\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esort\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;date\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSort field\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ereverse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSort direction (true=descending)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einclude_private\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInclude private posts in feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eitems_per_page\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e10\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePosts per page (0=no pagination)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eorphan_threshold\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e3\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMin items for separate page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epagination_type\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;manual\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emanual\u003c/code\u003e, \u003ccode\u003ehtmx\u003c/code\u003e, or \u003ccode\u003ejs\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elimit\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e0\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHard cap on total items (0 = unlimited)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e0\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSkip the first N items (0 = none)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eformats\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003eOutput formats\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etemplates\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003eCustom templates\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"feed-formats\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Formats\u003c/span\u003e \u003ca href=\"#feed-formats\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehtml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate HTML pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esimple_html\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate simple list HTML pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erss\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate RSS feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eatom\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate Atom feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ejson\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate JSON feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkdown\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate Markdown file\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etext\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate text file\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esitemap\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate sitemap\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"feed-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Templates\u003c/span\u003e \u003ca href=\"#feed-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehtml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;feed.html\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHTML template\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esimple_html\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;simple-feed.html\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSimple list HTML template\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecard\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;card.html\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePost card template\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erss\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;feed.xml\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRSS template\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eatom\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;atom.xml\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAtom template\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ejson\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;feed.json\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eJSON template\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"feed-defaults\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Defaults\u003c/span\u003e \u003ca href=\"#feed-defaults\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eitems_per_page\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e10\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault posts per page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eorphan_threshold\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e3\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault orphan threshold\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eformats\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003eDefault formats\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etemplates\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003eDefault templates\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"syndication-settings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSyndication Settings\u003c/span\u003e \u003ca href=\"#syndication-settings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emax_items\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e20\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMax items in RSS/Atom\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einclude_content\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInclude full content\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"auto-tags-config\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuto Tags Config\u003c/span\u003e \u003ca href=\"#auto-tags-config\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable auto tag feeds\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eslug_prefix\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;tags\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eURL prefix\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eformats\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003eOutput formats\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"auto-archives-config\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAuto Archives Config\u003c/span\u003e \u003ca href=\"#auto-archives-config\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable auto archives\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eslug_prefix\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;archive\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eURL prefix\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eyearly_feeds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate yearly feeds\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emonthly_feeds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGenerate monthly feeds\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eformats\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003eOutput formats\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"complete-example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComplete Example\u003c/span\u003e \u003ca href=\"#complete-example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://myblog.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauthor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Jane Doe\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# FEED DEFAULTS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefaults\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eorphan_threshold\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;feed.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecard\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;partials/card.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esyndication\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_items\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003einclude_content\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# INDIVIDUAL FEEDS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Home page\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Recent Posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Main blog feed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;All blog posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Tutorials\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and \u0026#39;tutorial\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Archive (no pagination)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;archive\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Archive\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# JSON API\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;api/posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Posts API\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# AUTO-GENERATED FEEDS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauto_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug_prefix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauto_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eGenerated output:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epublic/\n  index.html                     # Home (5 posts)\n  blog/\n    index.html                   # Blog page 1\n    page/2/index.html            # Blog page 2\n    simple/\n      index.html                 # Simple list page 1\n      page/2/index.html          # Simple list page 2\n    rss.xml\n    atom.xml\n  tutorials/\n    index.html\n    simple/\n      index.html\n    rss.xml\n    atom.xml\n  archive/\n    index.html                   # All posts, no pagination\n    simple/\n      index.html\n  api/\n    posts/\n      feed.json                  # JSON API\n  tags/\n    python/\n      index.html\n      rss.xml\n    go/\n      index.html\n      rss.xml\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext Steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow that you understand feeds, here are recommended next steps:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCustomize feed appearance:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/templates/\"\u003eTemplates Guide\u003c/a\u003e - Customize how feeds and cards are rendered\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eAdd syndication and discovery:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/syndication/\"\u003eSyndication Guide\u003c/a\u003e - Share your feeds on Mastodon, Twitter, and other platforms\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eDeploy your site:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/deployment/\"\u003eDeployment Guide\u003c/a\u003e - Deploy to production with CI/CD\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"calendar-view\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCalendar View\u003c/span\u003e \u003ca href=\"#calendar-view\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOpen Calendar from a built-in feed\u0026rsquo;s view controls to browse publishing activity\none year at a time. The newest year with posts appears first. Use the older/newer\nbuttons or year selector to jump between populated years; empty years are skipped.\nBrowser Back and Forward restore your selection.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/blog/?view=calendar\u0026amp;year=2024\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eMonths use the available calendar width, with larger day targets and fewer\ncolumns in narrow containers. The selected year shows its post count and number\nof publishing days. Day previews still open on hover, focus, or activation.\u003c/p\u003e\n\u003cp\u003eCalendar grids are built only when Calendar is opened, and only twelve months\nare built at once. On regular feeds, compact full-history metadata comes from a\nJSON sidecar fetched only when Calendar is opened. The initial feed HTML keeps\nthe current page\u0026rsquo;s posts without duplicating every calendar entry. With\nJavaScript disabled, the ordinary paginated feed list remains available.\nDedicated calendar-first feeds keep their visible dated list as a fallback.\nOrdinary feed pagination does not truncate the years available in Calendar.\u003c/p\u003e\n\u003cp\u003eFor a calendar-first feed, set \u003ccode\u003etemplates.html = \u0026quot;calendar-feed.html\u0026quot;\u003c/code\u003e on the\nfeed. The same annual navigation applies, using \u003ccode\u003e?year=2024\u003c/code\u003e on its URL.\u003c/p\u003e\n\u003cp\u003eCalendar panels and the year selector follow the active theme surface and text colors. On wide calendar pages, twelve months form four columns and three rows; smaller containers keep fewer, readable columns.\u003c/p\u003e\n\u003ch2 id=\"publishing-rhythm-charts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePublishing Rhythm Charts\u003c/span\u003e \u003ca href=\"#publishing-rhythm-charts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe built-in \u003ccode\u003e/feeds/\u003c/code\u003e directory can show a compact monthly publishing-rhythm chart\nfor each feed. Hover over a chart to read a month\u0026rsquo;s post count. Keyboard users can\nfocus a chart and use the left and right arrow keys to move between months; Home and\nEnd jump to the first and latest month. The chart\u0026rsquo;s line and overall appearance stay\nthe same while its month details are available on demand.\u003c/p\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfiguration Guide\u003c/a\u003e - Full configuration reference\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/templates/\"\u003eTemplates Guide\u003c/a\u003e - Template system documentation\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/frontmatter/\"\u003eFrontmatter Guide\u003c/a\u003e - Post metadata for filtering\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/quick-reference/\"\u003eQuick Reference\u003c/a\u003e - Filter expression cheat sheet\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"editorial-loading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEditorial loading\u003c/span\u003e \u003ca href=\"#editorial-loading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEditorial archives render the visible cards immediately and let the browser\ndefer layout for offscreen cards and later weeks until they approach the\nviewport. All posts are still in the HTML, including when JavaScript is\ndisabled. Browser find and printing keep access to the complete page. Browsers\nwithout content visibility support render the complete page normally.\u003c/p\u003e\n\u003cp\u003eKeyboard navigation setup does not download the next archive page. Link hover,\nfocus, and explicit feed cycling can still prepare the next navigation.\u003c/p\u003e\n\u003cp\u003eCalendar feeds reserve their full list width before optional calendar styles\narrive. Navbar search also reserves its final width before search hydration,\nso opening an archive does not move the content as those styles finish loading.\u003c/p\u003e\n\u003cp\u003eEditorial weeks below the first viewport reserve space according to the number\nof items they contain. This keeps unrendered weeks from crowding following\nsections. The browser remembers their actual height after revealing them.\u003c/p\u003e\n",
      "content_text": "\n## Feeds\n\nFor a photo-first shots archive, set `html = \"feed-photo-grid.html\"` under the feed's `[markata-go.feeds.templates]` table. See the [photo galleries guide](/docs/guides/galleries/).\n\nEditorial feed cards keep thumbnails lazy loaded, including featured weekly\nleads. Use eager loading and high fetch priority only when a page's actual\nabove-the-fold image is likely to be its Largest Contentful Paint element.\n\nFeeds are the core differentiator of markata-go. A feed is a **filtered, sorted, paginated collection of posts** that can output to **multiple formats** simultaneously from a single definition.\n\nFeeds only include posts that produced renderable page output. If a page is skipped, remains a draft, or has no rendered HTML because its content is empty, markata-go omits it from feed pages and syndication outputs instead of publishing a broken entry.\n\n\u003e **Prerequisites:** Before diving into feeds, you should understand:\n\u003e - [Frontmatter Guide](/docs/guides/frontmatter/) - How post metadata works (feeds filter based on frontmatter)\n\u003e - [Configuration Guide](/docs/guides/configuration/) - Basic config file structure\n\n## Why Feeds Matter\n\nFeeds solve a common problem in static site generation: you need the same collection of posts in different formats for different consumers.\n\n```\n                         FEED DEFINITION\n  filter: \"published == True and 'python' in tags\"\n  sort: \"date\"\n  reverse: true\n  items_per_page: 10\n                              |\n                              v\n                        OUTPUT FORMATS\n  +-------+--------+-------+-------+-------+----------+------+---------+\n  | HTML  | Simple |  RSS  | Atom  | JSON  | Markdown | Text | Sitemap |\n  | index |  list  | feed  | feed  |  API  |   list   | list |   XML   |\n  +-------+--------+-------+-------+-------+----------+------+---------+\n```\n\n**Benefits:**\n\n1. **One definition, many outputs** - Define a collection once, get HTML pages, a simple list view, RSS, Atom, JSON API, sitemap, etc.\n2. **Composable** - Feeds can share filters or inherit from defaults\n3. **Flexible** - Every \"index page\" is a feed: home, archives, tags, categories, search indexes\n4. **Familiar** - Mirrors how content platforms work (RSS readers, APIs, syndication)\n\n## Embedding Feeds in Content\n\nThe `jinja_md` plugin and page templates expose two helpers that surface feed data without littering Markdown with raw HTML.\n\n### `render_feed` snippet helper\n\n```jinja\n{{ render_feed(\"blog\", 5, \"card\") }}\n```\n\n- Renders the latest posts for a feed slug using the default partial `partials/feed_preview.html`. The `card` layout now includes `partials/cards/card-router.html`, so each post renders with the card for its template (article, note, photo, etc.) and photo/shot cards display their media inside a `\u003cfigure\u003e` plus `\u003cfigcaption\u003e` caption. `variant` accepts `card` or `list` and defaults to `card`.\n- `limit` truncates the rendered posts even if the feed definition includes more items. The helper gracefully falls back to a simple `\u003csection\u003e` if the template or engine is unavailable.\n- You can pass options as positional args (`limit`, `variant`) in markdown/Jinja content, or with an options map in full templates. The template override key remains `template` (for example, `{\"template\": \"partials/custom-feed.html\"}` in template files).\n- The rendered HTML is emitted as a single block with no blank lines, so Markdown never re-parses card text as lists, marks or code. Card excerpts use the `summary` filter for the same reason.\n- An unknown feed slug renders nothing and logs a `jinja_md` warning naming the slug — check the build output if a section comes up empty.\n\n#### Last 5 blog/shot/ping/thought example\n\n```jinja\n{{ render_feed(\"blog\", 5, \"card\") }}\n{{ render_feed(\"shot\", 5, \"list\") }}\n{{ render_feed(\"ping\", 5, \"card\") }}\n{{ render_feed(\"thought\", 5, \"card\") }}\n```\n\nEach `render_feed` call delimits the latest posts for that feed slug. The default partial already styles cards and lists, letting Markdown stay declarative.\n\n### `feed_posts` data helper\n\nWhen you need total control over markup (e.g., a custom grid or table), use `feed_posts` to iterate over post maps.\n\n```jinja\n{% set latest_blog = feed_posts(\"blog\", {\"limit\": 3}) %}\n\u003cul class=\"latest-blog\"\u003e\n  {% for post in latest_blog %}\n  \u003cli\u003e\n    \u003ca href=\"{{ post.href }}\"\u003e{{ post.title }}\u003c/a\u003e\n    {% if post.date %}\n    \u003ctime datetime=\"{{ post.date | atom_date }}\"\u003e{{ post.date | date:\"Jan 2, 2006\" }}\u003c/time\u003e\n    {% endif %}\n  \u003c/li\u003e\n  {% endfor %}\n\u003c/ul\u003e\n```\n\n`feed_posts` returns the same map shape that templates receive (`href`, `title`, `description`, `date`, `tags`, etc.), making it ideal for layouts that differ from the default card/list styling.\n\n## Basic Feed Configuration\n\nA feed is defined in your `markata-go.toml` using the `[[markata-go.feeds]]` array:\n\n```toml\n[[markata-go.feeds]]\nslug = \"blog\"\ntitle = \"Blog\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\n```\n\nThis creates a feed at `/blog/` with:\n- All published posts\n- Sorted by date (newest first)\n- HTML, simple HTML, RSS, Atom, JSON, and sitemap output (default formats)\n\n### Minimal Example\n\n```toml\n[[markata-go.feeds]]\nslug = \"posts\"\ntitle = \"All Posts\"\nfilter = \"published == True\"\n```\n\nIf you use the default config, markata-go already includes an archive feed at `/archive/`.\n\n## Split Feeds Across Config Files\n\nLarge sites often keep each feed in its own file.\n\n```toml\n# markata-go.toml\n[markata-go]\ninclude = [\"config/feeds/*.toml\"]\n```\n\n```toml\n# config/feeds/blog.toml\n[[markata-go.feeds]]\nslug = \"blog\"\ntitle = \"Blog\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\n```\n\nYou can also split one feed across multiple files:\n\n```toml\n# markata-go.toml\n[markata-go]\ninclude = [\"config/feeds/blog.toml\", \"config/feeds/blog.outputs.toml\"]\n```\n\n```toml\n# config/feeds/blog.outputs.toml\n[[markata-go.feeds]]\nslug = \"blog\"\nitems_per_page = 15\n\n[markata-go.feeds.formats]\nrss = true\natom = true\njson = false\n```\n\nFeeds merge by `slug`, so both fragments resolve to one `blog` feed.\n\n### Full Configuration Example\n\n```toml\n[[markata-go.feeds]]\n# Identity\nslug = \"blog\"                      # URL path: /blog/\ntitle = \"All Posts\"                # Display title\ndescription = \"Latest blog posts\"  # Meta description\n\n# Content Selection\nfilter = \"published == True and date \u003c= today\"\nsort = \"date\"\nreverse = true                     # Newest first\ninclude_private = false            # Include private posts (default: false)\n\n# Pagination\nitems_per_page = 10                # 0 = no pagination (all on one page)\norphan_threshold = 3               # If last page has \u003c=3 items, merge with previous\n\n# Limit/Offset\nlimit = 0                          # Hard cap on total items (0 = unlimited)\noffset = 0                         # Skip the first N items (0 = none)\n\n# Output Formats\n[markata-go.feeds.formats]\nhtml = true                        # /blog/index.html, /blog/page/2/index.html\nsimple_html = true                 # /blog/simple/index.html\nrss = true                         # /blog/rss.xml\natom = true                        # /blog/atom.xml\njson = true                        # /blog/feed.json\nsitemap = true                     # /blog/sitemap.xml\nmarkdown = false                   # /blog.md\ntext = false                       # /blog.txt\n\n# Custom Templates\n[markata-go.feeds.templates]\nhtml = \"feed.html\"                 # Template for HTML pages\ncard = \"partials/card.html\"        # Template for post cards in list\nrss = \"rss.xml\"                    # Template for RSS\natom = \"atom.xml\"                  # Template for Atom\njson = \"feed.json\"                 # Template for JSON\n```\n\nPrivate posts are excluded unless a feed explicitly sets `include_private =\ntrue`. The compatibility setting `private = true` has the same effect. An\nopted-in feed may show safe post metadata and encrypted article HTML, but it\nnever publishes raw Markdown, unencrypted content, encryption key names,\ncontent-derived descriptions, or private media references. Private feed\ndefinitions are hidden from `/feeds/` unless `feeds_page.show_private_feeds`\nlists them.\n\n## Filtering Posts\n\nThe `filter` field uses a Python-like expression syntax to select which posts appear in a feed.\n\nFor template-based filters, `template` and `templateKey` are interchangeable. Equality checks also respect built-in template aliases, so `templateKey == \"shots\"` matches posts using `shot`, `shots`, or `photo`.\n\n### Filter Operators\n\n| Operator | Description | Example |\n|----------|-------------|---------|\n| `==` | Equal | `published == True` |\n| `!=` | Not equal | `draft != True` |\n| `\u003e`, `\u003e=` | Greater than | `date \u003e= '2024-01-01'` |\n| `\u003c`, `\u003c=` | Less than | `date \u003c '2025-01-01'` |\n| `in` | Contains (tags) | `'python' in tags` |\n| `contains` | String contains | `tags contains 'python'` |\n| `and` | Logical AND | `published == True and featured == True` |\n| `or` | Logical OR | `'python' in tags or 'go' in tags` |\n| `not` | Logical NOT | `not draft` |\n\n### Filter Examples\n\n```toml\n# Published posts only\nfilter = \"published == True\"\n\n# Exclude drafts\nfilter = \"draft == False\"\n\n# Posts with a specific tag\nfilter = \"'tutorial' in tags\"\n\n# Multiple tags (OR)\nfilter = \"'python' in tags or 'go' in tags\"\n\n# Combined conditions\nfilter = \"published == True and featured == True\"\n\n# Date range\nfilter = \"date \u003e= '2024-01-01' and date \u003c '2025-01-01'\"\n\n# By slug\nfilter = \"slug != 'about'\"\n\n# Template aliases\nfilter = \"templateKey == 'shots' and 'family' in tags\"\n\n# Complex filter\nfilter = \"published == True and ('python' in tags or 'go' in tags) and featured == True\"\n```\n\n## Sorting Posts\n\nControl the order of posts with `sort` and `reverse`:\n\n```toml\n[[markata-go.feeds]]\nslug = \"blog\"\nsort = \"date\"        # Field to sort by\nreverse = true       # true = descending (newest first)\n```\n\n### Sort Fields\n\nYou can sort by any post field:\n\n| Field | Description |\n|-------|-------------|\n| `date` | Publication date (most common) |\n| `title` | Alphabetical by title |\n| `slug` | Alphabetical by slug |\n| `reading_time` | By reading time |\n| Any frontmatter | Sort by custom fields |\n\n### Sort Examples\n\n```toml\n# Newest first (most common)\nsort = \"date\"\nreverse = true\n\n# Oldest first (chronological)\nsort = \"date\"\nreverse = false\n\n# Alphabetical by title\nsort = \"title\"\nreverse = false\n\n# Custom field (priority)\nsort = \"priority\"\nreverse = true\n```\n\n## Pagination\n\nFeeds support three pagination strategies for different use cases.\n\nThe feed sidebar lists posts on the current page. Use the feed pagination\ncontrols to reach older and newer pages; the sidebar does not repeat every\npost in a long feed.\n\n### Pagination Configuration\n\n```toml\n[[markata-go.feeds]]\nslug = \"blog\"\nitems_per_page = 10           # Posts per page (0 = all on one page)\norphan_threshold = 3          # Merge last page if \u003c= N items\npagination_type = \"manual\"    # Pagination strategy\n```\n\n## Limit + Offset\n\nUse `limit` and `offset` to hard-cap a feed before pagination. This is useful for\n\"latest N\" lists or skipping a fixed number of entries.\n\n```toml\n[[markata-go.feeds]]\nslug = \"blog\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\nlimit = 3      # Only include 3 posts total\noffset = 1     # Skip the newest post\n```\n\n## Feed Timestamps\n\nFeed timestamps are deterministic and based on content, not build time:\n\n- Atom `\u003cupdated\u003e` and RSS `\u003clastBuildDate\u003e` use the most recent post date in the feed.\n- If no posts have dates, these fields are omitted.\n\nThis avoids no-change incremental builds rewriting feeds.\n\n### Pagination Types\n\n| Type | Description | Use Case |\n|------|-------------|----------|\n| `manual` | Traditional page links | SEO-friendly, works without JavaScript |\n| `htmx` | AJAX-based loading via HTMX | Modern, seamless UX without full page reloads |\n| `js` | Custom JavaScript pagination | Full control over pagination behavior |\n\n### Manual Pagination (Default)\n\nStandard pagination with full page reloads:\n\n```toml\n[[markata-go.feeds]]\nslug = \"blog\"\nitems_per_page = 10\npagination_type = \"manual\"\n```\n\nGenerates:\n```\n/blog/index.html           # Page 1\n/blog/page/2/index.html    # Page 2\n/blog/page/3/index.html    # Page 3\n```\n\n### HTMX Pagination\n\nHTMX pagination provides seamless content loading without full page reloads:\n\n```toml\n[markata-go]\nhtmx_version = \"2.0.8\"             # HTMX version to use\n\n[[markata-go.feeds]]\nslug = \"blog\"\nitems_per_page = 10\npagination_type = \"htmx\"\ntemplate = \"feed.html\"\npartial_template = \"feed_partial.html\"\n```\n\n**How it works:**\n1. User clicks \"Next\" or page number\n2. HTMX intercepts click, sends GET request\n3. Server returns partial HTML (just the posts list)\n4. HTMX swaps new content into existing container\n5. URL updates via pushState (browser history works)\n\n**Output structure:**\n```\n/blog/\n  index.html                 # Full page (page 1)\n  partial/\n    index.html               # Partial content (page 1)\n  page/\n    2/\n      index.html             # Full page (page 2)\n      partial/\n        index.html           # Partial content (page 2)\n```\n\n**HTMX template example:**\n\n```html\n\u003c!-- feed.html (full page) --\u003e\n\u003cdiv id=\"feed-content\" hx-swap-oob=\"true\"\u003e\n  {% include \"feed_partial.html\" %}\n\u003c/div\u003e\n\n\u003cnav class=\"pagination\"\u003e\n  {% if pagination.has_prev %}\n  \u003ca href=\"{{ feed.slug }}/page/{{ pagination.prev_page }}/\"\n     hx-get=\"{{ feed.slug }}/page/{{ pagination.prev_page }}/partial/\"\n     hx-target=\"#feed-content\"\n     hx-push-url=\"true\"\u003e\n    Previous\n  \u003c/a\u003e\n  {% endif %}\n\n  {% if pagination.has_next %}\n  \u003ca href=\"{{ feed.slug }}/page/{{ pagination.next_page }}/\"\n     hx-get=\"{{ feed.slug }}/page/{{ pagination.next_page }}/partial/\"\n     hx-target=\"#feed-content\"\n     hx-push-url=\"true\"\u003e\n    Next\n  \u003c/a\u003e\n  {% endif %}\n\u003c/nav\u003e\n```\n\n### JavaScript Pagination\n\nFor custom JavaScript implementations:\n\n```toml\n[[markata-go.feeds]]\nslug = \"blog\"\nitems_per_page = 10\npagination_type = \"js\"\n```\n\nGenerates a configuration file at `/static/js/pagination-config.js`:\n\n```javascript\nwindow.paginationData = {\n  \"enabled\": true,\n  \"type\": \"js\",\n  \"page\": 1,\n  \"totalPages\": 5,\n  \"totalPosts\": 47,\n  \"itemsShown\": 10,\n  \"feedName\": \"blog\",\n  \"hasNext\": true\n};\n```\n\n### Orphan Threshold\n\nThe `orphan_threshold` prevents tiny last pages:\n\n```toml\n[[markata-go.feeds]]\nslug = \"blog\"\nitems_per_page = 10\norphan_threshold = 3    # If last page has \u003c=3 items, merge with previous\n```\n\nWith 23 posts and `items_per_page = 10`:\n- Without threshold: Page 1 (10), Page 2 (10), Page 3 (3)\n- With threshold: Page 1 (10), Page 2 (13)\n\n## Output Formats\n\nEach feed can generate multiple output formats simultaneously.\n\n### HTML\n\nPaginated HTML index pages.\n\n```toml\n[markata-go.feeds.formats]\nhtml = true\n```\n\n**Output:**\n```\n/blog/index.html           # Page 1\n/blog/page/2/index.html    # Page 2\n```\n\n### Simple HTML\n\nA compact, dense list view of posts designed to fit many entries on screen. Each post renders as a single line with title (as a link), date, and reading time. The simple feed is generated alongside the standard HTML feed automatically.\n\n```toml\n[markata-go.feeds.formats]\nsimple_html = true\n```\n\n**Output:**\n```\n/blog/simple/index.html           # Page 1\n/blog/simple/page/2/index.html    # Page 2\n```\n\nThe simple feed page includes a navigation switcher to toggle between the full (rich card) view and the simple list view. Each entry uses [microformats2](http://microformats.org/wiki/h-entry) markup (`h-entry`, `p-name`, `dt-published`).\n\n**When to use the simple format:**\n\n- **Dense archives** -- Show many posts at a glance without scrolling through large cards\n- **Quick scanning** -- Readers who know what they're looking for can scan titles and dates rapidly\n- **Low-bandwidth** -- Minimal HTML and no images, loads fast on slow connections\n- **Print-friendly** -- Styled for clean printing via `@media print`\n\n**Disabling the simple format** for a specific feed:\n\n```toml\n[[markata-go.feeds]]\nslug = \"api/posts\"\nformats = { simple_html = false }\n```\n\n### RSS 2.0\n\nRSS feed for feed readers.\n\n```toml\n[markata-go.feeds.formats]\nrss = true\n```\n\n**Output:** `/blog/rss.xml`\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003crss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\"\u003e\n  \u003cchannel\u003e\n    \u003ctitle\u003eBlog\u003c/title\u003e\n    \u003clink\u003ehttps://example.com/blog/\u003c/link\u003e\n    \u003cdescription\u003eLatest blog posts\u003c/description\u003e\n    \u003clastBuildDate\u003eMon, 15 Jan 2024 12:00:00 +0000\u003c/lastBuildDate\u003e\n    \u003catom:link href=\"https://example.com/blog/rss.xml\" rel=\"self\" type=\"application/rss+xml\"/\u003e\n\n    \u003citem\u003e\n      \u003ctitle\u003eMy Post\u003c/title\u003e\n      \u003clink\u003ehttps://example.com/my-post/\u003c/link\u003e\n      \u003cguid isPermaLink=\"true\"\u003ehttps://example.com/my-post/\u003c/guid\u003e\n      \u003cpubDate\u003eMon, 15 Jan 2024 12:00:00 +0000\u003c/pubDate\u003e\n      \u003cdescription\u003ePost description...\u003c/description\u003e\n    \u003c/item\u003e\n  \u003c/channel\u003e\n\u003c/rss\u003e\n```\n\n### Atom\n\nAtom feed (RFC 4287).\n\n```toml\n[markata-go.feeds.formats]\natom = true\n```\n\n**Output:** `/blog/atom.xml`\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cfeed xmlns=\"http://www.w3.org/2005/Atom\"\u003e\n  \u003ctitle\u003eBlog\u003c/title\u003e\n  \u003clink href=\"https://example.com/blog/\" rel=\"alternate\"/\u003e\n  \u003clink href=\"https://example.com/blog/atom.xml\" rel=\"self\"/\u003e\n  \u003cid\u003ehttps://example.com/blog/\u003c/id\u003e\n  \u003cupdated\u003e2024-01-15T12:00:00Z\u003c/updated\u003e\n\n  \u003centry\u003e\n    \u003ctitle\u003eMy Post\u003c/title\u003e\n    \u003clink href=\"https://example.com/my-post/\" rel=\"alternate\"/\u003e\n    \u003cid\u003ehttps://example.com/my-post/\u003c/id\u003e\n    \u003cpublished\u003e2024-01-15T12:00:00Z\u003c/published\u003e\n    \u003cupdated\u003e2024-01-15T12:00:00Z\u003c/updated\u003e\n    \u003csummary\u003ePost description...\u003c/summary\u003e\n  \u003c/entry\u003e\n\u003c/feed\u003e\n```\n\n### Styled RSS and Atom Pages\n\nRSS and Atom feeds link to `/rss.xsl` and `/atom.xsl`, so a browser shows a readable page instead of raw XML. Both pages use your site's theme: the same palette, light or dark mode, fontpack, text size, and aesthetic. They also follow the visitor's own theme picker choices. When you change the theme, the feed pages change with it.\n\nThe browser view identifies itself as a feed, explains how to subscribe, and presents entries in a numbered reading list. Feed readers still receive the original RSS or Atom XML; the stylesheet only changes how a browser displays it. The same stylesheet supports either format, so custom views can keep their visual treatment consistent.\n\nTo customize a feed page, copy `rss.xsl` or `atom.xsl` into your `templates/` directory. Keep this block inside `\u003chead\u003e` to keep the site theme; markata-go replaces it with the theme's styles and scripts when it builds:\n\n```xml\n\u003c!-- markata:theme-head --\u003e\n\u003clink rel=\"stylesheet\" href=\"/css/variables.css\" /\u003e\n\u003clink rel=\"stylesheet\" href=\"/css/main.css\" /\u003e\n\u003c!-- /markata:theme-head --\u003e\n```\n\nA custom stylesheet without this block is copied as-is. To change what is injected, override `partials/feed-xsl-head.html` in your templates.\n\n### JSON Feed\n\nJSON Feed (version 1.1) for modern feed readers and APIs.\n\n```toml\n[markata-go.feeds.formats]\njson = true\n```\n\n**Output:** `/blog/feed.json`\n\n```json\n{\n  \"version\": \"https://jsonfeed.org/version/1.1\",\n  \"title\": \"Blog\",\n  \"home_page_url\": \"https://example.com\",\n  \"feed_url\": \"https://example.com/blog/feed.json\",\n  \"description\": \"Latest blog posts\",\n  \"items\": [\n    {\n      \"id\": \"https://example.com/my-post/\",\n      \"url\": \"https://example.com/my-post/\",\n      \"title\": \"My Post\",\n      \"content_html\": \"\u003cp\u003ePost content...\u003c/p\u003e\",\n      \"summary\": \"Post description...\",\n      \"date_published\": \"2024-01-15T12:00:00Z\",\n      \"tags\": [\"go\", \"tutorial\"]\n    }\n  ]\n}\n```\n\n### Markdown\n\nMarkdown list of posts (useful for READMEs, documentation).\n\n```toml\n[markata-go.feeds.formats]\nmarkdown = true\n```\n\n**Output:** `/blog.md`\n\n```markdown\n# Blog\n\nLatest blog posts\n\n- [My Post](/my-post/) - 2024-01-15\n- [Another Post](/another-post/) - 2024-01-10\n```\n\n### Plain Text\n\nSimple text list (useful for APIs, scripts, minimal readers).\n\n```toml\n[markata-go.feeds.formats]\ntext = true\n```\n\n**Output:** `/blog.txt`\n\n```\nBlog\n====\n\nLatest blog posts\n\n2024-01-15 - My Post\n  /my-post/\n\n2024-01-10 - Another Post\n  /another-post/\n```\n\nText output always produces clean plain text -- HTML entities are decoded to their literal characters and no HTML tags appear in the output. Links from HTML content are converted to footnote-style references. See the [Templates Guide](/docs/guides/templates/#text-templates) for details on using the `plaintext` filter.\n\n### Sitemap\n\nXML sitemap for search engines.\n\n```toml\n[markata-go.feeds.formats]\nsitemap = true\n```\n\n**Output:** `/blog/sitemap.xml`\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003curlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\u003e\n  \u003curl\u003e\n    \u003cloc\u003ehttps://example.com/my-post/\u003c/loc\u003e\n    \u003clastmod\u003e2024-01-15\u003c/lastmod\u003e\n    \u003cchangefreq\u003eweekly\u003c/changefreq\u003e\n    \u003cpriority\u003e0.5\u003c/priority\u003e\n  \u003c/url\u003e\n\u003c/urlset\u003e\n```\n\n## Auto-Generated Tag Feeds\n\nmarkata-go can automatically create feeds for each unique tag in your posts.\n\nAutomatic and configured feeds refresh selection diagnostics on every Collect,\nincluding exclusions and feeds whose output publishing is skipped. Selection\nscratch is reused only within that invocation, not cached between builds.\nPrivacy choices, preset series order, duplicate source occurrences, and\noffset/limit exclusion reasons remain unchanged. For timing, inspect the bounded\n`auto_feeds` collection debug record described in the [performance guide](performance.md);\nit separates generation, filtering/sorting, diagnostic selection recording, and\npagination/preparation without logging post paths or feed names.\n\n### Enable Auto Tags\n\n```toml\n[markata-go.feeds.auto_tags]\nenabled = true\nslug_prefix = \"tags\"               # /tags/python/, /tags/go/\n\n[markata-go.feeds.auto_tags.formats]\nhtml = true\nrss = true\n```\n\n### Generated Output\n\nIf your posts have tags `python`, `go`, and `tutorial`:\n\n```\n/tags/\n  python/\n    index.html\n    rss.xml\n  go/\n    index.html\n    rss.xml\n  tutorial/\n    index.html\n    rss.xml\n```\n\n### Auto Categories\n\nSimilar to tags, but for the `category` frontmatter field:\n\n```toml\n[markata-go.feeds.auto_categories]\nenabled = true\nslug_prefix = \"categories\"\n\n[markata-go.feeds.auto_categories.formats]\nhtml = true\nrss = true\n```\n\n### Auto Archives\n\nAutomatic date-based archive feeds:\n\n```toml\n[markata-go.feeds.auto_archives]\nenabled = true\nslug_prefix = \"archive\"\nyearly_feeds = true               # /archive/2024/\nmonthly_feeds = true              # /archive/2024/01/\n\n[markata-go.feeds.auto_archives.formats]\nhtml = true\n```\n\n## Feed Defaults and Inheritance\n\nConfigure defaults that apply to all feeds, then override as needed.\n\n### Global Defaults\n\n```toml\n# Default values for ALL feeds\n[markata-go.feeds.defaults]\nitems_per_page = 10\norphan_threshold = 3\n\n[markata-go.feeds.defaults.formats]\nhtml = true\nrss = true\natom = false\njson = false\nmarkdown = false\ntext = false\n\n[markata-go.feeds.defaults.templates]\nhtml = \"feed.html\"\ncard = \"partials/card.html\"\nrss = \"rss.xml\"\natom = \"atom.xml\"\njson = \"feed.json\"\n\n# Syndication settings (RSS/Atom/JSON limits)\n[markata-go.feeds.syndication]\nmax_items = 20                     # Max items in RSS/Atom feeds\ninclude_content = false            # Include full content or just summary\n```\n\n### Inheritance Example\n\n```toml\n# Global defaults\n[markata-go.feeds.defaults]\nitems_per_page = 10\n\n[markata-go.feeds.defaults.formats]\nhtml = true\nrss = true\natom = false\njson = false\n\n# Home page - override items_per_page and formats\n[[markata-go.feeds]]\nslug = \"\"\ntitle = \"Home\"\nfilter = \"published == True\"\nitems_per_page = 5                 # Override: fewer items\nformats = { rss = false }          # Override: no RSS for home\n\n# Blog - inherits all defaults\n[[markata-go.feeds]]\nslug = \"blog\"\ntitle = \"Blog\"\nfilter = \"published == True\"\n# Inherits: items_per_page=10, html=true, rss=true\n\n# API endpoint - completely different formats\n[[markata-go.feeds]]\nslug = \"api/posts\"\ntitle = \"Posts API\"\nfilter = \"published == True\"\nitems_per_page = 0                 # Override: no pagination\nformats = { html = false, rss = false, json = true }  # Override: JSON only\n```\n\n### Format Override Behavior\n\nWhen overriding formats:\n\n```toml\n# Defaults: html=true, rss=true, atom=false, json=false\n\n# Add to defaults (merge)\nformats = { atom = true }\n# Result: html=true, rss=true, atom=true, json=false\n\n# Disable specific format\nformats = { rss = false }\n# Result: html=true, rss=false, atom=false, json=false\n\n# Complete replacement\nformats = { html = false, rss = false, atom = false, json = true }\n# Result: json only\n```\n\n## Common Patterns\n\n### Home Page Feed\n\nThe home page is a feed with an empty slug:\n\n```toml\n[[markata-go.feeds]]\nslug = \"\"                          # Outputs to /index.html\ntitle = \"Recent Posts\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 5\n\n[markata-go.feeds.formats]\nhtml = true\nrss = false                        # Usually no RSS on home page\n```\n\n### Archive (All Posts, No Pagination)\n\n```toml\n[[markata-go.feeds]]\nslug = \"archive\"\ntitle = \"All Posts\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 0                 # No pagination - all posts on one page\n\n[markata-go.feeds.formats]\nhtml = true\nrss = false\n```\n\n### Private Archive (Including Private Posts)\n\nIf you want a feed that includes private posts (useful for personal archives or admin pages):\n\n```toml\n[[markata-go.feeds]]\nslug = \"private-archive\"\ntitle = \"Private Archive\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\ninclude_private = true             # Include private posts in this feed\n\n[markata-go.feeds.formats]\nhtml = true\nrss = false                        # Usually don't syndicate private posts\n```\n\nIf RSS, Atom, or JSON Feed is enabled for this feed, private entries contain\nonly the encrypted article wrapper and safe metadata. The feed wrapper omits\nthe encryption key name, so entries decrypt individually and do not share\nsession storage. Public feeds continue to exclude private posts.\n\n### Tag Pages (Manual)\n\nIf you don't want auto-generated tag feeds:\n\n```toml\n[[markata-go.feeds]]\nslug = \"tags/python\"\ntitle = \"Python Posts\"\nfilter = \"published == True and 'python' in tags\"\nsort = \"date\"\nreverse = true\n```\n\n### Featured Posts\n\n```toml\n[[markata-go.feeds]]\nslug = \"featured\"\ntitle = \"Featured\"\ndescription = \"Hand-picked articles\"\nfilter = \"published == True and featured == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 6\n```\n\n### JSON API Endpoint\n\n```toml\n[[markata-go.feeds]]\nslug = \"api/posts\"\ntitle = \"Posts API\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 0                 # All posts\n\n[markata-go.feeds.formats]\nhtml = false\nrss = false\njson = true                        # JSON only\n```\n\n### Search Index\n\nGenerate a JSON index for client-side search:\n\n```toml\n[[markata-go.feeds]]\nslug = \"search\"\ntitle = \"Search Index\"\nfilter = \"published == True\"\n\n[markata-go.feeds.formats]\njson = true\n\n[markata-go.feeds.templates]\njson = \"search-index.json\"\n```\n\nCustom template (`templates/search-index.json`):\n\n```json\n{\n  \"posts\": [\n    {% for post in feed.posts %}\n    {\n      \"title\": {{ post.title | tojson }},\n      \"href\": {{ post.href | tojson }},\n      \"content\": {{ post.content | striptags | truncate:500 | tojson }},\n      \"tags\": {{ post.tags | tojson }}\n    }{% if not loop.last %},{% endif %}\n    {% endfor %}\n  ]\n}\n```\n\n### Global Sitemap\n\nRoot sitemap with all posts:\n\n```toml\n[[markata-go.feeds]]\nslug = \"\"                          # Root\ntitle = \"Sitemap\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\n\n[markata-go.feeds.formats]\nhtml = false                       # No HTML\nsitemap = true                     # Sitemap only\n```\n\nOutputs `/sitemap.xml` at the root.\n\n### Tutorials Section\n\n```toml\n[[markata-go.feeds]]\nslug = \"tutorials\"\ntitle = \"Tutorials\"\ndescription = \"Step-by-step guides\"\nfilter = \"published == True and 'tutorial' in tags\"\nsort = \"date\"\nreverse = true\nitems_per_page = 10\n\n[markata-go.feeds.formats]\nhtml = true\nrss = true\natom = true\njson = true\n```\n\n## Template Variables\n\nWhen rendering feed templates, these variables are available:\n\n### Feed Context (`feed`)\n\n| Variable | Type | Description |\n|----------|------|-------------|\n| `feed.slug` | string | URL-safe identifier |\n| `feed.title` | string | Display title |\n| `feed.description` | string | Feed description |\n| `feed.href` | string | Base URL path (`/blog/`) |\n| `feed.posts` | []Post | All matching posts (pre-pagination) |\n\n### Pagination Context (`pagination`)\n\n| Variable | Type | Description |\n|----------|------|-------------|\n| `pagination.current_page` | int | Current page number (1-indexed) |\n| `pagination.total_pages` | int | Total number of pages |\n| `pagination.total_items` | int | Total posts in feed |\n| `pagination.items_per_page` | int | Posts per page |\n| `pagination.has_prev` | bool | Has previous page |\n| `pagination.has_next` | bool | Has next page |\n| `pagination.prev_url` | string | URL to previous page |\n| `pagination.next_url` | string | URL to next page |\n| `pagination.prev_page` | int | Previous page number |\n| `pagination.next_page` | int | Next page number |\n| `pagination.page_urls` | []string | URLs for all pages |\n\n### Page Context (`page`)\n\n| Variable | Type | Description |\n|----------|------|-------------|\n| `page.number` | int | Page number |\n| `page.posts` | []Post | Posts on this page |\n| `page.has_prev` | bool | Has previous page |\n| `page.has_next` | bool | Has next page |\n| `page.prev_url` | string | Previous page URL |\n| `page.next_url` | string | Next page URL |\n\n### Post Fields\n\nEach post in `feed.posts` or `page.posts` has:\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `post.Title` | string | Post title |\n| `post.Slug` | string | URL slug |\n| `post.Href` | string | Relative URL (`/my-post/`) |\n| `post.Date` | time | Publication date |\n| `post.Published` | bool | Whether published |\n| `post.Tags` | []string | List of tags |\n| `post.Description` | string | Post description |\n| `post.Content` | string | Raw markdown |\n| `post.ArticleHTML` | string | Rendered HTML |\n| `post.Extra` | map | Additional frontmatter |\n\n### Template Example\n\n```html\n{% extends \"base.html\" %}\n\n{% block content %}\n\u003cmain\u003e\n  \u003ch1\u003e{{ feed.title }}\u003c/h1\u003e\n  {% if feed.description %}\n  \u003cp class=\"description\"\u003e{{ feed.description }}\u003c/p\u003e\n  {% endif %}\n\n  \u003cul class=\"posts\"\u003e\n  {% for post in page.posts %}\n    \u003cli class=\"post\"\u003e\n      \u003ca href=\"{{ post.Href }}\"\u003e\n        \u003ch2\u003e{{ post.Title }}\u003c/h2\u003e\n      \u003c/a\u003e\n      \u003ctime datetime=\"{{ post.Date|atom_date }}\"\u003e\n        {{ post.Date|date_format:\"January 2, 2006\" }}\n      \u003c/time\u003e\n      {% if post.Description %}\n      \u003cp\u003e{{ post.Description }}\u003c/p\u003e\n      {% endif %}\n    \u003c/li\u003e\n  {% endfor %}\n  \u003c/ul\u003e\n\n  \u003cnav class=\"pagination\"\u003e\n    {% if page.has_prev %}\n    \u003ca href=\"{{ page.prev_url }}\" rel=\"prev\"\u003ePrevious\u003c/a\u003e\n    {% endif %}\n\n    \u003cspan\u003ePage {{ pagination.current_page }} of {{ pagination.total_pages }}\u003c/span\u003e\n\n    {% if page.has_next %}\n    \u003ca href=\"{{ page.next_url }}\" rel=\"next\"\u003eNext\u003c/a\u003e\n    {% endif %}\n  \u003c/nav\u003e\n\u003c/main\u003e\n{% endblock %}\n```\n\n## Template Filters for Feeds\n\n| Filter | Description | Example |\n|--------|-------------|---------|\n| `rss_date` | Format as RSS date | `{{ date\\|rss_date }}` |\n| `atom_date` | Format as Atom/ISO date | `{{ date\\|atom_date }}` |\n| `date_format` | Custom date format | `{{ date\\|date_format:\"2006-01-02\" }}` |\n| `tojson` | Convert to JSON | `{{ tags\\|tojson }}` |\n| `absolute_url` | Add base URL | `{{ href\\|absolute_url:config.URL }}` |\n| `striptags` | Remove HTML tags | `{{ html\\|striptags }}` |\n| `truncate` | Truncate to length | `{{ text\\|truncate:100 }}` |\n\n## Built-In Feed Templates\n\nFeeds can opt into a different built-in HTML layout without copying templates into the site.\n\n```toml\n[[markata-go.feeds]]\nslug = \"shots\"\ntitle = \"Shots\"\nfilter = \"templateKey == \\\"shots\\\"\"\n\n[markata-go.feeds.templates]\nhtml = \"feed-photo-grid.html\"\n```\n\n`feed-photo-grid.html` is a photo-grid archive designed for image-heavy feeds. It renders:\n\n- a tight multi-column grid\n- square cards by default\n- title and description overlays on hover and keyboard focus\n- `post.card_classes` span hooks such as `col-span-2`, `row-span-2`, and `col-span-4`\n\nThat makes it a good fit for shots, screenshots, or gallery-style feeds where individual items should sometimes break out of the default square rhythm.\n\n## Feed Discovery\n\nmarkata-go provides automatic feed discovery so visitors and feed readers can find the right feed for each page.\n\n### How It Works\n\nEvery page automatically includes `\u003clink rel=\"alternate\"\u003e` tags in the `\u003chead\u003e` for feed discovery. The feed advertised depends on the page:\n\n1. **Posts with a sidebar feed** - If a post participates in a feed sidebar (e.g., a series or guide), the discovery links point to that feed.\n2. **Other pages** - All other pages advertise the site's default subscription feeds (`/rss.xml`, `/atom.xml`).\n\nThis ensures readers always discover the most relevant feed for the content they're viewing.\n\n### Template Context\n\nWhen rendering pages, markata-go injects a `discovery_feed` variable into the template context:\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `discovery_feed.title` | string | Feed title |\n| `discovery_feed.has_rss` | bool | RSS format available |\n| `discovery_feed.has_atom` | bool | Atom format available |\n| `discovery_feed.has_json` | bool | JSON format available |\n| `discovery_feed.rss_url` | string | RSS feed URL |\n| `discovery_feed.atom_url` | string | Atom feed URL |\n| `discovery_feed.json_url` | string | JSON feed URL |\n\n### Default Template Behavior\n\nThe default `base.html` template handles discovery automatically:\n\n```html\n\u003chead\u003e\n  {% if config.head.alternate_feeds %}\n    {# Explicit override - user-configured feeds take precedence #}\n    {% for feed in config.head.alternate_feeds %}\n    \u003clink rel=\"alternate\" type=\"{{ feed.type }}\" title=\"{{ feed.title }}\" href=\"{{ feed.href }}\"\u003e\n    {% endfor %}\n  {% elif discovery_feed %}\n    {# Automatic per-page discovery #}\n    {% if discovery_feed.has_rss %}\n    \u003clink rel=\"alternate\" type=\"application/rss+xml\"\n          title=\"{{ discovery_feed.title }} (RSS)\"\n          href=\"{{ discovery_feed.rss_url }}\"\u003e\n    {% endif %}\n    {% if discovery_feed.has_atom %}\n    \u003clink rel=\"alternate\" type=\"application/atom+xml\"\n          title=\"{{ discovery_feed.title }} (Atom)\"\n          href=\"{{ discovery_feed.atom_url }}\"\u003e\n    {% endif %}\n    {% if discovery_feed.has_json %}\n    \u003clink rel=\"alternate\" type=\"application/feed+json\"\n          title=\"{{ discovery_feed.title }} (JSON)\"\n          href=\"{{ discovery_feed.json_url }}\"\u003e\n    {% endif %}\n  {% else %}\n    {# Fallback #}\n    \u003clink rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS Feed\" href=\"/rss.xml\"\u003e\n  {% endif %}\n\u003c/head\u003e\n```\n\n### Override with `head.alternate_feeds`\n\nIf you need full control over discovery links, configure `head.alternate_feeds` explicitly:\n\n```toml\n[[markata-go.head.alternate_feeds]]\ntype = \"application/rss+xml\"\ntitle = \"My Custom Feed\"\nhref = \"/custom/rss.xml\"\n```\n\nWhen `head.alternate_feeds` is set, it completely overrides the automatic discovery behavior.\n\n## Built-in Subscription Feeds\n\nmarkata-go automatically creates site-wide subscription feeds so visitors always have a way to subscribe.\n\n### Generated Feeds\n\nBy default, these feeds are created automatically:\n\n| Path | Description |\n|------|-------------|\n| `/rss.xml` | Site RSS feed (all published posts) |\n| `/atom.xml` | Site Atom feed (all published posts) |\n| `/archive/rss.xml` | Archive RSS feed (same content as root) |\n| `/archive/atom.xml` | Archive Atom feed (same content as root) |\n\n### How It Works\n\nThe `subscription_feeds` plugin creates two internal feeds:\n\n1. **Root feed** (`slug = \"\"`) - Generates `/rss.xml` and `/atom.xml` (no HTML to avoid overwriting your home page)\n2. **Archive feed** (`slug = \"archive\"`) - Generates `/archive/rss.xml` and `/archive/atom.xml`\n\nBoth feeds contain the same items: all published posts sorted by date (newest first).\n\n### Customizing Subscription Feeds\n\nThe built-in feeds use sensible defaults, but you can override them by defining your own feeds with the same slugs:\n\n```toml\n# Override the root subscription feed\n[[markata-go.feeds]]\nslug = \"\"\ntitle = \"My Site\"\nfilter = \"published == True and featured == True\"  # Only featured posts\nsort = \"date\"\nreverse = true\n\n[markata-go.feeds.formats]\nhtml = false      # Still no HTML (don't overwrite home page)\nrss = true\natom = true\n```\n\n### Why Both Root and Archive?\n\n- **Root feeds** (`/rss.xml`, `/atom.xml`) - The standard location feed readers check first\n- **Archive feeds** (`/archive/...`) - Alternative paths for services that expect feeds in subdirectories\n\nBoth contain identical content, ensuring maximum compatibility with feed readers and syndication services.\n\n## Manual Feed Discovery Links\n\nIf you need to add discovery links manually in a custom template:\n\n```html\n\u003chead\u003e\n  \u003c!-- RSS Feed --\u003e\n  \u003clink rel=\"alternate\" type=\"application/rss+xml\"\n        title=\"{{ feed.title }} (RSS)\"\n        href=\"{{ feed.href }}rss.xml\"\u003e\n\n  \u003c!-- Atom Feed --\u003e\n  \u003clink rel=\"alternate\" type=\"application/atom+xml\"\n        title=\"{{ feed.title }} (Atom)\"\n        href=\"{{ feed.href }}atom.xml\"\u003e\n\n  \u003c!-- JSON Feed --\u003e\n  \u003clink rel=\"alternate\" type=\"application/feed+json\"\n        title=\"{{ feed.title }} (JSON)\"\n        href=\"{{ feed.href }}feed.json\"\u003e\n\u003c/head\u003e\n```\n\n### WebSub Discovery\n\nIf you enable WebSub, markata-go also emits hub discovery links:\n\n```html\n\u003chead\u003e\n  \u003clink rel=\"hub\" href=\"https://hub.example.com/\"\u003e\n\u003c/head\u003e\n```\n\nRSS/Atom feeds include `rel=\"hub\"` and `rel=\"self\"` links when WebSub is enabled.\n\n## Configuration Reference\n\n### Feed Config Fields\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `slug` | string | Required | URL path (`\"\"` for root) |\n| `title` | string | Required | Display title |\n| `description` | string | `\"\"` | Feed description |\n| `filter` | string | `\"\"` | Filter expression |\n| `sort` | string | `\"date\"` | Sort field |\n| `reverse` | bool | `true` | Sort direction (true=descending) |\n| `include_private` | bool | `false` | Include private posts in feed |\n| `items_per_page` | int | `10` | Posts per page (0=no pagination) |\n| `orphan_threshold` | int | `3` | Min items for separate page |\n| `pagination_type` | string | `\"manual\"` | `manual`, `htmx`, or `js` |\n| `limit` | int | `0` | Hard cap on total items (0 = unlimited) |\n| `offset` | int | `0` | Skip the first N items (0 = none) |\n| `formats` | object | - | Output formats |\n| `templates` | object | - | Custom templates |\n\n### Feed Formats\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `html` | bool | `true` | Generate HTML pages |\n| `simple_html` | bool | `true` | Generate simple list HTML pages |\n| `rss` | bool | `true` | Generate RSS feed |\n| `atom` | bool | `false` | Generate Atom feed |\n| `json` | bool | `false` | Generate JSON feed |\n| `markdown` | bool | `false` | Generate Markdown file |\n| `text` | bool | `false` | Generate text file |\n| `sitemap` | bool | `false` | Generate sitemap |\n\n### Feed Templates\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `html` | string | `\"feed.html\"` | HTML template |\n| `simple_html` | string | `\"simple-feed.html\"` | Simple list HTML template |\n| `card` | string | `\"card.html\"` | Post card template |\n| `rss` | string | `\"feed.xml\"` | RSS template |\n| `atom` | string | `\"atom.xml\"` | Atom template |\n| `json` | string | `\"feed.json\"` | JSON template |\n\n### Feed Defaults\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `items_per_page` | int | `10` | Default posts per page |\n| `orphan_threshold` | int | `3` | Default orphan threshold |\n| `formats` | object | - | Default formats |\n| `templates` | object | - | Default templates |\n\n### Syndication Settings\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `max_items` | int | `20` | Max items in RSS/Atom |\n| `include_content` | bool | `false` | Include full content |\n\n### Auto Tags Config\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `false` | Enable auto tag feeds |\n| `slug_prefix` | string | `\"tags\"` | URL prefix |\n| `formats` | object | - | Output formats |\n\n### Auto Archives Config\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `false` | Enable auto archives |\n| `slug_prefix` | string | `\"archive\"` | URL prefix |\n| `yearly_feeds` | bool | `true` | Generate yearly feeds |\n| `monthly_feeds` | bool | `false` | Generate monthly feeds |\n| `formats` | object | - | Output formats |\n\n## Complete Example\n\n```toml\n[markata-go]\ntitle = \"My Blog\"\nurl = \"https://myblog.com\"\nauthor = \"Jane Doe\"\n\n# =============================================================================\n# FEED DEFAULTS\n# =============================================================================\n[markata-go.feeds.defaults]\nitems_per_page = 10\norphan_threshold = 3\n\n[markata-go.feeds.defaults.formats]\nhtml = true\nrss = true\natom = true\njson = false\n\n[markata-go.feeds.defaults.templates]\nhtml = \"feed.html\"\ncard = \"partials/card.html\"\n\n[markata-go.feeds.syndication]\nmax_items = 20\ninclude_content = false\n\n# =============================================================================\n# INDIVIDUAL FEEDS\n# =============================================================================\n\n# Home page\n[[markata-go.feeds]]\nslug = \"\"\ntitle = \"Recent Posts\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 5\nformats = { rss = false, atom = false }\n\n# Main blog feed\n[[markata-go.feeds]]\nslug = \"blog\"\ntitle = \"Blog\"\ndescription = \"All blog posts\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\n\n# Tutorials\n[[markata-go.feeds]]\nslug = \"tutorials\"\ntitle = \"Tutorials\"\nfilter = \"published == True and 'tutorial' in tags\"\nsort = \"date\"\nreverse = true\n\n# Archive (no pagination)\n[[markata-go.feeds]]\nslug = \"archive\"\ntitle = \"Archive\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 0\nformats = { rss = false, atom = false }\n\n# JSON API\n[[markata-go.feeds]]\nslug = \"api/posts\"\ntitle = \"Posts API\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 0\nformats = { html = false, rss = false, atom = false, json = true }\n\n# =============================================================================\n# AUTO-GENERATED FEEDS\n# =============================================================================\n\n[markata-go.feeds.auto_tags]\nenabled = true\nslug_prefix = \"tags\"\n\n[markata-go.feeds.auto_tags.formats]\nhtml = true\nrss = true\n```\n\n**Generated output:**\n\n```\npublic/\n  index.html                     # Home (5 posts)\n  blog/\n    index.html                   # Blog page 1\n    page/2/index.html            # Blog page 2\n    simple/\n      index.html                 # Simple list page 1\n      page/2/index.html          # Simple list page 2\n    rss.xml\n    atom.xml\n  tutorials/\n    index.html\n    simple/\n      index.html\n    rss.xml\n    atom.xml\n  archive/\n    index.html                   # All posts, no pagination\n    simple/\n      index.html\n  api/\n    posts/\n      feed.json                  # JSON API\n  tags/\n    python/\n      index.html\n      rss.xml\n    go/\n      index.html\n      rss.xml\n```\n\n---\n\n## Next Steps\n\nNow that you understand feeds, here are recommended next steps:\n\n**Customize feed appearance:**\n- [Templates Guide](/docs/guides/templates/) - Customize how feeds and cards are rendered\n\n**Add syndication and discovery:**\n- [Syndication Guide](/docs/guides/syndication/) - Share your feeds on Mastodon, Twitter, and other platforms\n\n**Deploy your site:**\n- [Deployment Guide](/docs/guides/deployment/) - Deploy to production with CI/CD\n\n---\n\n## Calendar View\n\nOpen Calendar from a built-in feed's view controls to browse publishing activity\none year at a time. The newest year with posts appears first. Use the older/newer\nbuttons or year selector to jump between populated years; empty years are skipped.\nBrowser Back and Forward restore your selection.\n\n```text\n/blog/?view=calendar\u0026year=2024\n```\n\nMonths use the available calendar width, with larger day targets and fewer\ncolumns in narrow containers. The selected year shows its post count and number\nof publishing days. Day previews still open on hover, focus, or activation.\n\nCalendar grids are built only when Calendar is opened, and only twelve months\nare built at once. On regular feeds, compact full-history metadata comes from a\nJSON sidecar fetched only when Calendar is opened. The initial feed HTML keeps\nthe current page's posts without duplicating every calendar entry. With\nJavaScript disabled, the ordinary paginated feed list remains available.\nDedicated calendar-first feeds keep their visible dated list as a fallback.\nOrdinary feed pagination does not truncate the years available in Calendar.\n\nFor a calendar-first feed, set `templates.html = \"calendar-feed.html\"` on the\nfeed. The same annual navigation applies, using `?year=2024` on its URL.\n\nCalendar panels and the year selector follow the active theme surface and text colors. On wide calendar pages, twelve months form four columns and three rows; smaller containers keep fewer, readable columns.\n\n## Publishing Rhythm Charts\n\nThe built-in `/feeds/` directory can show a compact monthly publishing-rhythm chart\nfor each feed. Hover over a chart to read a month's post count. Keyboard users can\nfocus a chart and use the left and right arrow keys to move between months; Home and\nEnd jump to the first and latest month. The chart's line and overall appearance stay\nthe same while its month details are available on demand.\n\n## See Also\n\n- [Configuration Guide](/docs/guides/configuration/) - Full configuration reference\n- [Templates Guide](/docs/guides/templates/) - Template system documentation\n- [Frontmatter Guide](/docs/guides/frontmatter/) - Post metadata for filtering\n- [Quick Reference](/docs/guides/quick-reference/) - Filter expression cheat sheet\n\n### Editorial loading\n\nEditorial archives render the visible cards immediately and let the browser\ndefer layout for offscreen cards and later weeks until they approach the\nviewport. All posts are still in the HTML, including when JavaScript is\ndisabled. Browser find and printing keep access to the complete page. Browsers\nwithout content visibility support render the complete page normally.\n\nKeyboard navigation setup does not download the next archive page. Link hover,\nfocus, and explicit feed cycling can still prepare the next navigation.\n\nCalendar feeds reserve their full list width before optional calendar styles\narrive. Navbar search also reserves its final width before search hydration,\nso opening an archive does not move the content as those styles finish loading.\n\nEditorial weeks below the first viewport reserve space according to the number\nof items they contain. This keeps unrendered weeks from crowding following\nsections. The browser remembers their actual height after revealing them.\n",
      "summary": "Deep dive into markata-go's powerful feed system for creating filtered, sorted, paginated collections",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "feeds"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/encryption/",
      "url": "https://markata.dev/docs/guides/encryption/",
      "title": "Encryption and Private Posts",
      "content_html": "\u003cp\u003emarkata-go can encrypt post content so that only visitors with the correct password can read it. Encryption uses AES-256-GCM and runs entirely client-side \u0026ndash; your server never sees the decrypted content.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eKey principle:\u003c/strong\u003e Private posts are \u003cstrong\u003enever published in plaintext\u003c/strong\u003e. If the encryption key is missing, the build fails rather than exposing your content.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eCreate a \u003ccode\u003e.env\u003c/code\u003e file in your project root:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_KEY_DEFAULT\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003eyour-secret-password\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003col start=\"2\"\u003e\n\u003cli\u003eMark a post as private in its frontmatter:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eMy Private Post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eprivate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003eYour secret content here.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003col start=\"3\"\u003e\n\u003cli\u003eBuild your site:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe post\u0026rsquo;s HTML content is replaced with an encrypted blob and a password prompt. Visitors enter the password in their browser to decrypt and view the content.\u003c/p\u003e\n\u003ch2 id=\"how-it-works\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow It Works\u003c/span\u003e \u003ca href=\"#how-it-works\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eDuring the build, the encryption plugin finds all posts with \u003ccode\u003eprivate: true\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eIt encrypts the rendered HTML using AES-256-GCM with a password derived via PBKDF2\u003c/li\u003e\n\u003cli\u003eThe encrypted content is embedded as a base64 string in a \u003ccode\u003edata-encrypted\u003c/code\u003e attribute\u003c/li\u003e\n\u003cli\u003eA password form is rendered in place of the content\u003c/li\u003e\n\u003cli\u003eClient-side JavaScript uses the Web Crypto API to decrypt on password entry\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eThe build fails if any private post cannot be encrypted.\u003c/strong\u003e This prevents accidentally publishing sensitive content.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEncryption is \u003cstrong\u003eenabled by default\u003c/strong\u003e with \u003ccode\u003edefault_key = \u0026quot;default\u0026quot;\u003c/code\u003e. You only need to set the environment variable.\u003c/p\u003e\n\u003ch3 id=\"config-file-options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfig File Options\u003c/span\u003e \u003ca href=\"#config-file-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eencryption\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                           \u003cspan class=\"c\"\u003e# default: true\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault_key\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# default: \u0026#34;default\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenforce_strength\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# default: true\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emin_estimated_crack_time\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;10y\u0026#34;\u003c/span\u003e        \u003cspan class=\"c\"\u003e# default: \u0026#34;10y\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emin_password_length\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e14\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# default: 14\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edecryption_hint\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;DM me for access\u0026#34;\u003c/span\u003e     \u003cspan class=\"c\"\u003e# optional hint shown to visitors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eencryption\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprivate_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ediary\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;personal\u0026#34;\u003c/span\u003e                       \u003cspan class=\"c\"\u003e# tag \u0026#34;diary\u0026#34; encrypts with key \u0026#34;personal\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edraft-ideas\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# tag \u0026#34;draft-ideas\u0026#34; encrypts with key \u0026#34;default\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable/disable encryption processing\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edefault_key\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;default\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eKey name used when a post doesn\u0026rsquo;t specify one\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edecryption_hint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHelp text shown next to the password prompt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eprivate_tags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003emap\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMaps tag names to encryption key names\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenforce_strength\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRequire keys to meet the configured strength policy before encrypting private posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emin_estimated_crack_time\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;10y\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMinimum estimated crack time for each key (supports \u003ccode\u003ey\u003c/code\u003e, \u003ccode\u003ed\u003c/code\u003e, \u003ccode\u003eh\u003c/code\u003e, \u003ccode\u003em\u003c/code\u003e, \u003ccode\u003es\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emin_password_length\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e14\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMinimum password length required for every encryption key\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"environment-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment Variables\u003c/span\u003e \u003ca href=\"#environment-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEncryption keys are loaded from environment variables with the prefix \u003ccode\u003eMARKATA_GO_ENCRYPTION_KEY_\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# The default key (used when no specific key is set on a post)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_KEY_DEFAULT\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003emy-password\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Named keys for different access levels\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_KEY_PERSONAL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003epersonal-password\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_KEY_PREMIUM\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003epremium-password\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou can also override config options via environment:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_ENABLED\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_DEFAULT_KEY\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003edefault\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_DECRYPTION_HINT\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Contact me for access\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_ENFORCE_STRENGTH\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_MIN_ESTIMATED_CRACK_TIME\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e5d\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_MIN_PASSWORD_LENGTH\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e20\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"env-file-support\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e.env File Support\u003c/span\u003e \u003ca href=\"#env-file-support\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePlace a \u003ccode\u003e.env\u003c/code\u003e file in your project root. It is loaded automatically during the build:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# .env\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_KEY_DEFAULT\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003emy-secret-password\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_KEY_PERSONAL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003eanother-password\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRules:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLines starting with \u003ccode\u003e#\u003c/code\u003e are comments\u003c/li\u003e\n\u003cli\u003eValues can be quoted with single or double quotes\u003c/li\u003e\n\u003cli\u003eReal environment variables take precedence over \u003ccode\u003e.env\u003c/code\u003e values\u003c/li\u003e\n\u003cli\u003eThe \u003ccode\u003e.env\u003c/code\u003e file should be in your \u003ccode\u003e.gitignore\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"password-strength-policy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePassword Strength Policy\u003c/span\u003e \u003ca href=\"#password-strength-policy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEvery encryption key used by a private post must satisfy the configured strength policy before the plugin encrypts the content. The defaults are strict:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eenforce_strength = true\u003c/code\u003e (can be disabled, but keys will no longer be validated)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emin_estimated_crack_time = \u0026quot;10y\u0026quot;\u003c/code\u003e (supports \u003ccode\u003ey\u003c/code\u003e, \u003ccode\u003ed\u003c/code\u003e, \u003ccode\u003eh\u003c/code\u003e, \u003ccode\u003em\u003c/code\u003e, \u003ccode\u003es\u003c/code\u003e units)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emin_password_length = 14\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eStrength estimation uses the zxcvbn algorithm (dictionary/pattern-aware), so common passwords like \u003ccode\u003epassword12345\u003c/code\u003e are treated as weak even when they include numbers.\u003c/p\u003e\n\u003cp\u003eIf any key violates those thresholds, the build halts with an \u003ccode\u003eEncryptionBuildError\u003c/code\u003e that lists the affected posts and key names. Passwords and hints never appear in the error text.\u003c/p\u003e\n\u003ch3 id=\"cli-password-generator\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCLI Password Generator\u003c/span\u003e \u003ca href=\"#cli-password-generator\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGenerate a compliant password without running the full build:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emarkata-go encryption generate-password\nmarkata-go encryption generate-password --length 20\nmarkata-go encryption check\nmarkata-go encryption check --key default\nmarkata-go encryption encrypt-posts --dry-run\nmarkata-go encryption encrypt-posts\nmarkata-go encryption encrypt-posts --workers 4\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe command prints only the password to stdout, making it easy to pipe into your \u003ccode\u003e.env\u003c/code\u003e file or a password manager. The optional \u003ccode\u003e--length\u003c/code\u003e flag requests a longer password (it must be at least the configured \u003ccode\u003emin_password_length\u003c/code\u003e). The generated password already meets the default crack-time and length thresholds.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eencryption check\u003c/code\u003e validates configured keys against your active policy and exits non-zero when a key is missing or weak. By default it checks every key referenced by \u003ccode\u003edefault_key\u003c/code\u003e and \u003ccode\u003eprivate_tags\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"source-encrypt-private-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSource-Encrypt Private Posts\u003c/span\u003e \u003ca href=\"#source-encrypt-private-posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse \u003ccode\u003eencrypt-posts\u003c/code\u003e to rewrite private Markdown files so the body is encrypted at rest in your source repository:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emarkata-go encryption encrypt-posts --dry-run\nmarkata-go encryption encrypt-posts\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe command scans files matched by your active \u003ccode\u003eglob.patterns\u003c/code\u003e, then encrypts posts marked \u003ccode\u003eprivate: true\u003c/code\u003e or matched by \u003ccode\u003eencryption.private_tags\u003c/code\u003e. It skips draft, skipped, public, and already source-encrypted posts. \u003ccode\u003e--dry-run\u003c/code\u003e reports what would be encrypted without modifying files.\u003c/p\u003e\n\u003cp\u003eMissing or weak keys fail before any files are written. The encrypted source keeps frontmatter readable and replaces only the Markdown body with a marker and ciphertext:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eMy Secret Post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eprivate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;!-- markata-encrypted-source:v1 key=default --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBASE64_AES_GCM_CIPHERTEXT\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"decrypt-posts-back-to-plaintext\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDecrypt Posts Back To Plaintext\u003c/span\u003e \u003ca href=\"#decrypt-posts-back-to-plaintext\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse \u003ccode\u003edecrypt-posts\u003c/code\u003e when you need to edit a source-encrypted post. It is the inverse of \u003ccode\u003eencrypt-posts\u003c/code\u003e:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eexport MARKATA_GO_ENCRYPTION_KEY_DEFAULT='your-password'\n\n# preview every encrypted post that would be decrypted\nmarkata-go encryption decrypt-posts --dry-run\n\n# decrypt one file\nmarkata-go encryption decrypt-posts pages/my-secret-post.md\n\n# decrypt a whole directory tree\nmarkata-go encryption decrypt-posts pages/private/\n\n# decrypt everything matched by glob.patterns\nmarkata-go encryption decrypt-posts\n\n# use four concurrent workers (0, the default, uses available Go CPU parallelism)\nmarkata-go encryption decrypt-posts --workers 4\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe key name comes from the \u003ccode\u003ekey=\u003c/code\u003e value in the encrypted marker, falling back to \u003ccode\u003eencryption.default_key\u003c/code\u003e. The\npassword is read from \u003ccode\u003eMARKATA_GO_ENCRYPTION_KEY_\u0026lt;KEY\u0026gt;\u003c/code\u003e (uppercased). Files that are not source-encrypted are\nskipped, frontmatter is preserved exactly, and a missing env var or wrong password fails before anything is\nwritten.\u003c/p\u003e\n\u003cp\u003eA typical edit cycle is \u003ccode\u003edecrypt-posts \u0026lt;file\u0026gt;\u003c/code\u003e, edit the Markdown, then \u003ccode\u003eencrypt-posts\u003c/code\u003e before committing.\u003c/p\u003e\n\u003cp\u003eThe commands keep authenticated ciphertext in\n\u003ccode\u003e.markata/source-encryption-cache.json\u003c/code\u003e. When a body is unchanged,\n\u003ccode\u003eencrypt-posts\u003c/code\u003e verifies and restores the existing ciphertext instead of\ngenerating a new random nonce. This keeps decrypt/re-encrypt cycles from\nchanging every encrypted file. The cache stores ciphertext only, never\nplaintext or password-derived hashes, and is written with owner-only\npermissions.\u003c/p\u003e\n\u003cp\u003eTo opt one post out of a private tag or template default, set an explicit\nboolean override:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eprivate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAn explicit \u003ccode\u003eprivate: false\u003c/code\u003e takes precedence over \u003ccode\u003eencryption.private_tags\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eBoth bulk commands prepare documents in parallel by default, then begin writing only after every candidate is successfully prepared. A missing key, invalid password, malformed source file, cryptographic error, or detected edit during preparation leaves the repository unchanged. Replacements use atomic file writes, and a write failure restores earlier files. Use \u003ccode\u003e--workers 1\u003c/code\u003e if you need serial processing; \u003ccode\u003e--workers 0\u003c/code\u003e is the default and uses \u003ccode\u003eGOMAXPROCS\u003c/code\u003e workers.\u003c/p\u003e\n\u003cp\u003eWhen run in a terminal, encryption progress uses your active CLI color theme. Use \u003ccode\u003e--color\u003c/code\u003e to force colors or \u003ccode\u003e--no-color\u003c/code\u003e for plain output.\u003c/p\u003e\n\u003ch2 id=\"lint-rule\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLint Rule\u003c/span\u003e \u003ca href=\"#lint-rule\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003emarkata-go lint\u003c/code\u003e now includes an encryption policy check. When encryption is enabled, lint reports an error if configured keys are missing or fail strength thresholds.\u003c/p\u003e\n\u003ch2 id=\"making-posts-private\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMaking Posts Private\u003c/span\u003e \u003ca href=\"#making-posts-private\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThere are three ways to make a post private:\u003c/p\u003e\n\u003ch3 id=\"1-frontmatter-private-true\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e1. Frontmatter \u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003eprivate: true\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#1-frontmatter-private-true\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe simplest approach. The post is encrypted with the default key:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eMy Secret Post\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eprivate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"2-frontmatter-with-a-specific-key\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e2. Frontmatter with a specific key\u003c/span\u003e \u003ca href=\"#2-frontmatter-with-a-specific-key\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse \u003ccode\u003esecret_key\u003c/code\u003e (or its aliases \u003ccode\u003eprivate_key\u003c/code\u003e, \u003ccode\u003eencryption_key\u003c/code\u003e) to encrypt with a named key:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ePremium Content\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eprivate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003esecret_key\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epremium\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis looks for \u003ccode\u003eMARKATA_GO_ENCRYPTION_KEY_PREMIUM\u003c/code\u003e in the environment.\u003c/p\u003e\n\u003cp\u003eAll three frontmatter fields are equivalent \u0026ndash; use whichever name you prefer:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esecret_key\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003esecret_key: premium\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eprivate_key\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eprivate_key: premium\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eencryption_key\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eencryption_key: premium\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eIf multiple are set, \u003ccode\u003esecret_key\u003c/code\u003e takes priority, then \u003ccode\u003eprivate_key\u003c/code\u003e, then \u003ccode\u003eencryption_key\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"3-private-tags\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e3. Private tags\u003c/span\u003e \u003ca href=\"#3-private-tags\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigure tags that automatically mark posts as private:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eencryption\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprivate_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ediary\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;personal\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejournal\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;personal\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAny post tagged \u003ccode\u003ediary\u003c/code\u003e or \u003ccode\u003ejournal\u003c/code\u003e is automatically treated as private and encrypted with the \u003ccode\u003epersonal\u003c/code\u003e key. You don\u0026rsquo;t need to set \u003ccode\u003eprivate: true\u003c/code\u003e in the frontmatter.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003eprivate_tags\u003c/code\u003e check matches against both the post\u0026rsquo;s \u003ccode\u003etags\u003c/code\u003e list and its \u003ccode\u003etemplateKey\u003c/code\u003e (or \u003ccode\u003etemplate\u003c/code\u003e) frontmatter field. This is useful for content that uses \u003ccode\u003etemplateKey\u003c/code\u003e as its primary categorization, such as gratitude journals or diary entries that may not have explicit tags.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eencryption\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprivate_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egratitude\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Matches posts with tag \u0026#34;gratitude\u0026#34; OR templateKey \u0026#34;gratitude\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePriority rules:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIf a tag matches, the tag\u0026rsquo;s key is used\u003c/li\u003e\n\u003cli\u003eIf only \u003ccode\u003etemplateKey\u003c/code\u003e matches, its key is used\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFrontmatter key overrides both:\u003c/strong\u003e If a post has a frontmatter \u003ccode\u003esecret_key\u003c/code\u003e, it takes priority over any tag or templateKey match\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"build-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Behavior\u003c/span\u003e \u003ca href=\"#build-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"missing-keys-fail-the-build\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMissing Keys Fail the Build\u003c/span\u003e \u003ca href=\"#missing-keys-fail-the-build\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf any private post has no available encryption key, the build \u003cstrong\u003efails early with a critical error\u003c/strong\u003e that summarizes the failures by key and reason:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eencryption error: private posts found without available encryption keys. Build halted to prevent exposing private content\nkey \u0026quot;personal\u0026quot;: set MARKATA_GO_ENCRYPTION_KEY_PERSONAL in environment or .env (posts: 12, sample: diary/2024-01-15.md, diary/2024-01-16.md, diary/2024-01-17.md)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis is intentional. Private content must never be published unencrypted.\u003c/p\u003e\n\u003ch3 id=\"draft-and-skipped-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDraft and Skipped Posts\u003c/span\u003e \u003ca href=\"#draft-and-skipped-posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePosts with \u003ccode\u003edraft: true\u003c/code\u003e or \u003ccode\u003eskip: true\u003c/code\u003e are excluded from encryption checks. They are not published at all, so they don\u0026rsquo;t need encryption.\u003c/p\u003e\n\u003ch3 id=\"disabling-encryption\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDisabling Encryption\u003c/span\u003e \u003ca href=\"#disabling-encryption\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTo disable encryption entirely:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eencryption\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen disabled, the encryption plugin does nothing. Private posts pass through unmodified (they are still rendered but not encrypted). Use this only for local development.\u003c/p\u003e\n\u003ch2 id=\"multiple-access-levels\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMultiple Access Levels\u003c/span\u003e \u003ca href=\"#multiple-access-levels\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou can use different keys for different audiences:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eencryption\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edefault_key\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edecryption_hint\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Contact me for the password\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eencryption\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprivate_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ediary\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;personal\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epremium\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;subscribers\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# .env\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_KEY_DEFAULT\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003egeneral-password\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_KEY_PERSONAL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003emy-eyes-only\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_ENCRYPTION_KEY_SUBSCRIBERS\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003esubscriber-password\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen in your posts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Uses default key\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eprivate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Uses personal key (via tag)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003ediary]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Uses subscribers key (explicit)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eprivate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003esecret_key\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esubscribers\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"client-side-decryption\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eClient-Side Decryption\u003c/span\u003e \u003ca href=\"#client-side-decryption\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe encrypted content includes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eA lock icon and \u0026ldquo;Encrypted Content\u0026rdquo; heading\u003c/li\u003e\n\u003cli\u003eThe decryption hint (if configured)\u003c/li\u003e\n\u003cli\u003eA password input field\u003c/li\u003e\n\u003cli\u003eA \u0026ldquo;Remember for this session\u0026rdquo; checkbox (uses sessionStorage)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWhen the correct password is entered, JavaScript decrypts the content in-browser using the Web Crypto API with matching PBKDF2 parameters. The decrypted HTML replaces the password form.\u003c/p\u003e\n\u003cp\u003eEncrypted controls do not autofocus when a page loads, so multiple encrypted\nblocks do not move the reader to the last password field. A remembered session\npassword can decrypt content automatically without taking focus or changing\nthe current scroll position. When a user submits a password, the revealed\ncontent may receive accessibility focus without moving the viewport.\u003c/p\u003e\n\u003cp\u003eIf decrypted HTML contains another encrypted block, markata-go initializes its\ncontrols immediately. Canonical wrappers that use the same key keep the\nexisting same-key unlock behavior. Feed projections intentionally remove the\nkey name, so feed entries remain isolated and require manual decryption.\u003c/p\u003e\n\u003cp\u003eIf \u0026ldquo;Remember for this session\u0026rdquo; is checked, the password is stored in sessionStorage (cleared when the browser tab closes). This allows navigating between encrypted posts without re-entering the password for posts using the same key.\u003c/p\u003e\n\u003cp\u003eOpted-in private feed entries intentionally omit the key name. They can be\ndecrypted after manual password entry, but they do not use session storage or\nunlock other feed entries.\u003c/p\u003e\n\u003ch2 id=\"privacy-boundary\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrivacy Boundary\u003c/span\u003e \u003ca href=\"#privacy-boundary\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEncryption protects the \u003cstrong\u003epost body\u003c/strong\u003e, not metadata. Frontmatter fields like title, description, tags, and dates remain in cleartext by design.\u003c/p\u003e\n\u003ch3 id=\"what-stays-public\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat stays public\u003c/span\u003e \u003ca href=\"#what-stays-public\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eWhy\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eTitle\u003c/td\u003e\n\u003ctd\u003eShown in page cards, feed listings, navigation, and HTML \u003ccode\u003e\u0026lt;title\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDescription\u003c/td\u003e\n\u003ctd\u003eOnly if explicitly set in frontmatter \u0026ndash; you chose to make it public\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTags and dates\u003c/td\u003e\n\u003ctd\u003eUsed for site structure, filtering, and feed membership\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSlug / URL\u003c/td\u003e\n\u003ctd\u003eThe page needs to be routable and linkable\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAvatar\u003c/td\u003e\n\u003ctd\u003eShown in mentions and author cards\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"what-is-private\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat is private\u003c/span\u003e \u003ca href=\"#what-is-private\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eProtection\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003ePost body (Markdown)\u003c/td\u003e\n\u003ctd\u003eCleared from output; never written to any file\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eArticle HTML\u003c/td\u003e\n\u003ctd\u003eEncrypted with AES-256-GCM; only the ciphertext is published\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAuto-generated descriptions\u003c/td\u003e\n\u003ctd\u003eSuppressed entirely for private posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eInlinks / outlinks text\u003c/td\u003e\n\u003ctd\u003eCleared during metadata scrubbing\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eIf you put sensitive information in your title or description frontmatter, it \u003cstrong\u003ewill\u003c/strong\u003e be visible in the built site. Keep sensitive content in the post body.\u003c/p\u003e\n\u003ch2 id=\"privacy-protection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrivacy Protection\u003c/span\u003e \u003ca href=\"#privacy-protection\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen a post is marked private (by any method), markata-go suppresses it across all output types \u0026ndash; not just the HTML article page. This prevents content from leaking through alternate channels.\u003c/p\u003e\n\u003ch3 id=\"what-is-protected\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat is protected\u003c/span\u003e \u003ca href=\"#what-is-protected\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOutput\u003c/th\u003e\n\u003cth\u003eBehavior\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eHTML page\u003c/td\u003e\n\u003ctd\u003eContent encrypted with password prompt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e.md\u003c/code\u003e / \u003ccode\u003e.txt\u003c/code\u003e alternates\u003c/td\u003e\n\u003ctd\u003eNot generated for private posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eOG image cards\u003c/td\u003e\n\u003ctd\u003eNot generated for private posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRSS / Atom / JSON feeds\u003c/td\u003e\n\u003ctd\u003ePrivate posts are excluded unless the feed explicitly sets \u003ccode\u003einclude_private = true\u003c/code\u003e; included entries contain encrypted HTML and safe metadata only\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFeed pages\u003c/td\u003e\n\u003ctd\u003ePrivate posts are excluded from public feed pages; only feeds that explicitly set \u003ccode\u003einclude_private = true\u003c/code\u003e can include safe metadata and encrypted content\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eEmbed cards (`\u003c!-- embed not found: slug --\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e![[slug]]`)\u003c/td\u003e\n\u003ctd\u003eShows a \u0026ldquo;Private Content\u0026rdquo; card with no title, description, or date\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWikilinks (\u003ccode\u003e[[slug]]\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003eLink text is rendered but \u003ccode\u003edata-title\u003c/code\u003e, \u003ccode\u003edata-description\u003c/code\u003e, \u003ccode\u003edata-date\u003c/code\u003e attributes are omitted\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWikilink hover previews\u003c/td\u003e\n\u003ctd\u003eNo hover preview is shown for private posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAuto-generated descriptions\u003c/td\u003e\n\u003ctd\u003eNot generated from private post content\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"how-it-works-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow it works\u003c/span\u003e \u003ca href=\"#how-it-works-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePrivacy marking happens at the very start of the Transform stage \u0026ndash; before any other plugin processes the post. This ensures that every downstream plugin (description generation, embed cards, wikilinks, feeds, etc.) sees \u003ccode\u003eprivate: true\u003c/code\u003e and acts accordingly.\u003c/p\u003e\n\u003cp\u003eThe encrypted article HTML is the \u003cstrong\u003eonly\u003c/strong\u003e representation of your private content in the built site.\u003c/p\u003e\n\u003ch3 id=\"warm-builds-and-key-rotation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWarm builds and key rotation\u003c/span\u003e \u003ca href=\"#warm-builds-and-key-rotation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEncrypted wrappers are cached using the rendered article, key name, resolved\npassword, public hint, source path (used by accessibility controls), and a\nmaintained wrapper/browser-crypto revision. Wrapper or browser crypto format\nchanges bump that revision; old entries miss once without a build-cache schema\nmigration. A fresh randomized source envelope does not force new browser\nciphertext when plaintext and the key contract are unchanged.\u003c/p\u003e\n\u003cp\u003eWhen a wrapper really regenerates—including password/key-name rotation, hint\nchanges, or encrypted-cache file loss—the page and its dependent pages are\nrendered and published again, even if the decrypted input hash is unchanged.\nThis includes private homepages with an explicitly empty slug. Regeneration\nclears the previous full-page cache reference before fresh cache writes. If a\nbest-effort full-page write fails, saving cache metadata preserves that cleared\nreference: the next build re-renders instead of restoring old-password HTML,\neven when its encrypted wrapper is a valid hit or its output file is missing.\nThe old page-cache file may remain orphaned but is no longer usable through\nthat post\u0026rsquo;s cache reference.\u003c/p\u003e\n\u003cp\u003eValid warm hits keep the identical encrypted wrapper and full page and still\nscrub private metadata. Wrapper hits and encryption errors do not clear a valid\nfull-page reference. Best-effort wrapper-cache write failure still invalidates\nthe old full page; this is not a general transactional cache-recovery guarantee.\u003c/p\u003e\n\u003cp\u003eWhen checking a key rotation, first confirm at least two equivalent warm builds\nwith the old key. Cold-to-warm asset or configuration resets can otherwise mask\nstale-page behavior. Verify decryption of the actual published HTML file using\nthe new key, rather than checking only an in-memory wrapper.\u003c/p\u003e\n\u003cp\u003eSource-encrypted posts still never cache decrypted parsed posts or plaintext\narticles. Inferred titles use a transient hash-only prior-build baseline for\ncanonical comparison; that baseline stores no plaintext or password. Load\u0026rsquo;s\nconservative feed/tag/garden dirty signals are preserved.\u003c/p\u003e\n\u003ch3 id=\"feed-pages-and-private-tags\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed pages and private tags\u003c/span\u003e \u003ca href=\"#feed-pages-and-private-tags\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eprivate_tags\u003c/code\u003e marks matching posts as private and encrypted. Auto-generated feeds\nfor private tags opt into those posts so their encrypted entries can render;\nother auto-generated tag, category, and archive feeds exclude private posts.\u003c/p\u003e\n\u003cp\u003eIf you intentionally need a private-aware archive or admin page, create an\nexplicit feed with \u003ccode\u003einclude_private = true\u003c/code\u003e and restrict where you publish it.\nPrivate RSS, Atom, and JSON Feed entries still contain no raw body, key name,\nderived description, or private media reference.\u003c/p\u003e\n\u003ch2 id=\"security-notes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSecurity Notes\u003c/span\u003e \u003ca href=\"#security-notes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eAES-256-GCM\u003c/strong\u003e encryption with random IVs\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePBKDF2\u003c/strong\u003e key derivation with 100,000 iterations\u003c/li\u003e\n\u003cli\u003eEncryption happens at build time; decryption happens client-side\u003c/li\u003e\n\u003cli\u003eThe server only ever serves encrypted content\u003c/li\u003e\n\u003cli\u003ePasswords are never transmitted to the server\u003c/li\u003e\n\u003cli\u003eSession storage is opt-in and per-tab only\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nmarkata-go can encrypt post content so that only visitors with the correct password can read it. Encryption uses AES-256-GCM and runs entirely client-side -- your server never sees the decrypted content.\n\n\u003e **Key principle:** Private posts are **never published in plaintext**. If the encryption key is missing, the build fails rather than exposing your content.\n\n## Quick Start\n\n1. Create a `.env` file in your project root:\n\n```bash\nMARKATA_GO_ENCRYPTION_KEY_DEFAULT=your-secret-password\n```\n\n2. Mark a post as private in its frontmatter:\n\n```yaml\n---\ntitle: My Private Post\nprivate: true\n---\nYour secret content here.\n```\n\n3. Build your site:\n\n```bash\nmarkata-go build\n```\n\nThe post's HTML content is replaced with an encrypted blob and a password prompt. Visitors enter the password in their browser to decrypt and view the content.\n\n## How It Works\n\n1. During the build, the encryption plugin finds all posts with `private: true`\n2. It encrypts the rendered HTML using AES-256-GCM with a password derived via PBKDF2\n3. The encrypted content is embedded as a base64 string in a `data-encrypted` attribute\n4. A password form is rendered in place of the content\n5. Client-side JavaScript uses the Web Crypto API to decrypt on password entry\n\n**The build fails if any private post cannot be encrypted.** This prevents accidentally publishing sensitive content.\n\n## Configuration\n\nEncryption is **enabled by default** with `default_key = \"default\"`. You only need to set the environment variable.\n\n### Config File Options\n\n```toml\n[encryption]\nenabled = true                           # default: true\ndefault_key = \"default\"                  # default: \"default\"\nenforce_strength = true                  # default: true\nmin_estimated_crack_time = \"10y\"        # default: \"10y\"\nmin_password_length = 14                  # default: 14\ndecryption_hint = \"DM me for access\"     # optional hint shown to visitors\n\n[encryption.private_tags]\ndiary = \"personal\"                       # tag \"diary\" encrypts with key \"personal\"\ndraft-ideas = \"default\"                  # tag \"draft-ideas\" encrypts with key \"default\"\n```\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `enabled` | bool | `true` | Enable/disable encryption processing |\n| `default_key` | string | `\"default\"` | Key name used when a post doesn't specify one |\n| `decryption_hint` | string | `\"\"` | Help text shown next to the password prompt |\n| `private_tags` | map | `{}` | Maps tag names to encryption key names |\n| `enforce_strength` | bool | `true` | Require keys to meet the configured strength policy before encrypting private posts |\n| `min_estimated_crack_time` | string | `\"10y\"` | Minimum estimated crack time for each key (supports `y`, `d`, `h`, `m`, `s`) |\n| `min_password_length` | int | `14` | Minimum password length required for every encryption key |\n\n### Environment Variables\n\nEncryption keys are loaded from environment variables with the prefix `MARKATA_GO_ENCRYPTION_KEY_`:\n\n```bash\n# The default key (used when no specific key is set on a post)\nMARKATA_GO_ENCRYPTION_KEY_DEFAULT=my-password\n\n# Named keys for different access levels\nMARKATA_GO_ENCRYPTION_KEY_PERSONAL=personal-password\nMARKATA_GO_ENCRYPTION_KEY_PREMIUM=premium-password\n```\n\nYou can also override config options via environment:\n\n```bash\nMARKATA_GO_ENCRYPTION_ENABLED=true\nMARKATA_GO_ENCRYPTION_DEFAULT_KEY=default\nMARKATA_GO_ENCRYPTION_DECRYPTION_HINT=\"Contact me for access\"\nMARKATA_GO_ENCRYPTION_ENFORCE_STRENGTH=false\nMARKATA_GO_ENCRYPTION_MIN_ESTIMATED_CRACK_TIME=5d\nMARKATA_GO_ENCRYPTION_MIN_PASSWORD_LENGTH=20\n```\n\n### .env File Support\n\nPlace a `.env` file in your project root. It is loaded automatically during the build:\n\n```bash\n# .env\nMARKATA_GO_ENCRYPTION_KEY_DEFAULT=my-secret-password\nMARKATA_GO_ENCRYPTION_KEY_PERSONAL=another-password\n```\n\nRules:\n- Lines starting with `#` are comments\n- Values can be quoted with single or double quotes\n- Real environment variables take precedence over `.env` values\n- The `.env` file should be in your `.gitignore`\n\n## Password Strength Policy\n\nEvery encryption key used by a private post must satisfy the configured strength policy before the plugin encrypts the content. The defaults are strict:\n\n- `enforce_strength = true` (can be disabled, but keys will no longer be validated)\n- `min_estimated_crack_time = \"10y\"` (supports `y`, `d`, `h`, `m`, `s` units)\n- `min_password_length = 14`\n\nStrength estimation uses the zxcvbn algorithm (dictionary/pattern-aware), so common passwords like `password12345` are treated as weak even when they include numbers.\n\nIf any key violates those thresholds, the build halts with an `EncryptionBuildError` that lists the affected posts and key names. Passwords and hints never appear in the error text.\n\n### CLI Password Generator\n\nGenerate a compliant password without running the full build:\n\n```\nmarkata-go encryption generate-password\nmarkata-go encryption generate-password --length 20\nmarkata-go encryption check\nmarkata-go encryption check --key default\nmarkata-go encryption encrypt-posts --dry-run\nmarkata-go encryption encrypt-posts\nmarkata-go encryption encrypt-posts --workers 4\n```\n\nThe command prints only the password to stdout, making it easy to pipe into your `.env` file or a password manager. The optional `--length` flag requests a longer password (it must be at least the configured `min_password_length`). The generated password already meets the default crack-time and length thresholds.\n\n`encryption check` validates configured keys against your active policy and exits non-zero when a key is missing or weak. By default it checks every key referenced by `default_key` and `private_tags`.\n\n### Source-Encrypt Private Posts\n\nUse `encrypt-posts` to rewrite private Markdown files so the body is encrypted at rest in your source repository:\n\n```\nmarkata-go encryption encrypt-posts --dry-run\nmarkata-go encryption encrypt-posts\n```\n\nThe command scans files matched by your active `glob.patterns`, then encrypts posts marked `private: true` or matched by `encryption.private_tags`. It skips draft, skipped, public, and already source-encrypted posts. `--dry-run` reports what would be encrypted without modifying files.\n\nMissing or weak keys fail before any files are written. The encrypted source keeps frontmatter readable and replaces only the Markdown body with a marker and ciphertext:\n\n```markdown\n---\ntitle: My Secret Post\nprivate: true\n---\n\n\u003c!-- markata-encrypted-source:v1 key=default --\u003e\nBASE64_AES_GCM_CIPHERTEXT\n```\n\n### Decrypt Posts Back To Plaintext\n\nUse `decrypt-posts` when you need to edit a source-encrypted post. It is the inverse of `encrypt-posts`:\n\n```\nexport MARKATA_GO_ENCRYPTION_KEY_DEFAULT='your-password'\n\n# preview every encrypted post that would be decrypted\nmarkata-go encryption decrypt-posts --dry-run\n\n# decrypt one file\nmarkata-go encryption decrypt-posts pages/my-secret-post.md\n\n# decrypt a whole directory tree\nmarkata-go encryption decrypt-posts pages/private/\n\n# decrypt everything matched by glob.patterns\nmarkata-go encryption decrypt-posts\n\n# use four concurrent workers (0, the default, uses available Go CPU parallelism)\nmarkata-go encryption decrypt-posts --workers 4\n```\n\nThe key name comes from the `key=` value in the encrypted marker, falling back to `encryption.default_key`. The\npassword is read from `MARKATA_GO_ENCRYPTION_KEY_\u003cKEY\u003e` (uppercased). Files that are not source-encrypted are\nskipped, frontmatter is preserved exactly, and a missing env var or wrong password fails before anything is\nwritten.\n\nA typical edit cycle is `decrypt-posts \u003cfile\u003e`, edit the Markdown, then `encrypt-posts` before committing.\n\nThe commands keep authenticated ciphertext in\n`.markata/source-encryption-cache.json`. When a body is unchanged,\n`encrypt-posts` verifies and restores the existing ciphertext instead of\ngenerating a new random nonce. This keeps decrypt/re-encrypt cycles from\nchanging every encrypted file. The cache stores ciphertext only, never\nplaintext or password-derived hashes, and is written with owner-only\npermissions.\n\nTo opt one post out of a private tag or template default, set an explicit\nboolean override:\n\n```yaml\nprivate: false\n```\n\nAn explicit `private: false` takes precedence over `encryption.private_tags`.\n\nBoth bulk commands prepare documents in parallel by default, then begin writing only after every candidate is successfully prepared. A missing key, invalid password, malformed source file, cryptographic error, or detected edit during preparation leaves the repository unchanged. Replacements use atomic file writes, and a write failure restores earlier files. Use `--workers 1` if you need serial processing; `--workers 0` is the default and uses `GOMAXPROCS` workers.\n\nWhen run in a terminal, encryption progress uses your active CLI color theme. Use `--color` to force colors or `--no-color` for plain output.\n\n## Lint Rule\n\n`markata-go lint` now includes an encryption policy check. When encryption is enabled, lint reports an error if configured keys are missing or fail strength thresholds.\n\n## Making Posts Private\n\nThere are three ways to make a post private:\n\n### 1. Frontmatter `private: true`\n\nThe simplest approach. The post is encrypted with the default key:\n\n```yaml\n---\ntitle: My Secret Post\nprivate: true\n---\n```\n\n### 2. Frontmatter with a specific key\n\nUse `secret_key` (or its aliases `private_key`, `encryption_key`) to encrypt with a named key:\n\n```yaml\n---\ntitle: Premium Content\nprivate: true\nsecret_key: premium\n---\n```\n\nThis looks for `MARKATA_GO_ENCRYPTION_KEY_PREMIUM` in the environment.\n\nAll three frontmatter fields are equivalent -- use whichever name you prefer:\n\n| Field | Example |\n|-------|---------|\n| `secret_key` | `secret_key: premium` |\n| `private_key` | `private_key: premium` |\n| `encryption_key` | `encryption_key: premium` |\n\nIf multiple are set, `secret_key` takes priority, then `private_key`, then `encryption_key`.\n\n### 3. Private tags\n\nConfigure tags that automatically mark posts as private:\n\n```toml\n[encryption.private_tags]\ndiary = \"personal\"\njournal = \"personal\"\n```\n\nAny post tagged `diary` or `journal` is automatically treated as private and encrypted with the `personal` key. You don't need to set `private: true` in the frontmatter.\n\nThe `private_tags` check matches against both the post's `tags` list and its `templateKey` (or `template`) frontmatter field. This is useful for content that uses `templateKey` as its primary categorization, such as gratitude journals or diary entries that may not have explicit tags.\n\n```toml\n[encryption.private_tags]\ngratitude = \"default\"    # Matches posts with tag \"gratitude\" OR templateKey \"gratitude\"\n```\n\n**Priority rules:**\n- If a tag matches, the tag's key is used\n- If only `templateKey` matches, its key is used\n- **Frontmatter key overrides both:** If a post has a frontmatter `secret_key`, it takes priority over any tag or templateKey match\n\n## Build Behavior\n\n### Missing Keys Fail the Build\n\nIf any private post has no available encryption key, the build **fails early with a critical error** that summarizes the failures by key and reason:\n\n```\nencryption error: private posts found without available encryption keys. Build halted to prevent exposing private content\nkey \"personal\": set MARKATA_GO_ENCRYPTION_KEY_PERSONAL in environment or .env (posts: 12, sample: diary/2024-01-15.md, diary/2024-01-16.md, diary/2024-01-17.md)\n```\n\nThis is intentional. Private content must never be published unencrypted.\n\n### Draft and Skipped Posts\n\nPosts with `draft: true` or `skip: true` are excluded from encryption checks. They are not published at all, so they don't need encryption.\n\n### Disabling Encryption\n\nTo disable encryption entirely:\n\n```toml\n[encryption]\nenabled = false\n```\n\nWhen disabled, the encryption plugin does nothing. Private posts pass through unmodified (they are still rendered but not encrypted). Use this only for local development.\n\n## Multiple Access Levels\n\nYou can use different keys for different audiences:\n\n```toml\n[encryption]\ndefault_key = \"default\"\ndecryption_hint = \"Contact me for the password\"\n\n[encryption.private_tags]\ndiary = \"personal\"\npremium = \"subscribers\"\n```\n\n```bash\n# .env\nMARKATA_GO_ENCRYPTION_KEY_DEFAULT=general-password\nMARKATA_GO_ENCRYPTION_KEY_PERSONAL=my-eyes-only\nMARKATA_GO_ENCRYPTION_KEY_SUBSCRIBERS=subscriber-password\n```\n\nThen in your posts:\n\n```yaml\n# Uses default key\n---\nprivate: true\n---\n\n# Uses personal key (via tag)\n---\ntags: [diary]\n---\n\n# Uses subscribers key (explicit)\n---\nprivate: true\nsecret_key: subscribers\n---\n```\n\n## Client-Side Decryption\n\nThe encrypted content includes:\n- A lock icon and \"Encrypted Content\" heading\n- The decryption hint (if configured)\n- A password input field\n- A \"Remember for this session\" checkbox (uses sessionStorage)\n\nWhen the correct password is entered, JavaScript decrypts the content in-browser using the Web Crypto API with matching PBKDF2 parameters. The decrypted HTML replaces the password form.\n\nEncrypted controls do not autofocus when a page loads, so multiple encrypted\nblocks do not move the reader to the last password field. A remembered session\npassword can decrypt content automatically without taking focus or changing\nthe current scroll position. When a user submits a password, the revealed\ncontent may receive accessibility focus without moving the viewport.\n\nIf decrypted HTML contains another encrypted block, markata-go initializes its\ncontrols immediately. Canonical wrappers that use the same key keep the\nexisting same-key unlock behavior. Feed projections intentionally remove the\nkey name, so feed entries remain isolated and require manual decryption.\n\nIf \"Remember for this session\" is checked, the password is stored in sessionStorage (cleared when the browser tab closes). This allows navigating between encrypted posts without re-entering the password for posts using the same key.\n\nOpted-in private feed entries intentionally omit the key name. They can be\ndecrypted after manual password entry, but they do not use session storage or\nunlock other feed entries.\n\n## Privacy Boundary\n\nEncryption protects the **post body**, not metadata. Frontmatter fields like title, description, tags, and dates remain in cleartext by design.\n\n### What stays public\n\n| Field | Why |\n|-------|-----|\n| Title | Shown in page cards, feed listings, navigation, and HTML `\u003ctitle\u003e` |\n| Description | Only if explicitly set in frontmatter -- you chose to make it public |\n| Tags and dates | Used for site structure, filtering, and feed membership |\n| Slug / URL | The page needs to be routable and linkable |\n| Avatar | Shown in mentions and author cards |\n\n### What is private\n\n| Field | Protection |\n|-------|-----------|\n| Post body (Markdown) | Cleared from output; never written to any file |\n| Article HTML | Encrypted with AES-256-GCM; only the ciphertext is published |\n| Auto-generated descriptions | Suppressed entirely for private posts |\n| Inlinks / outlinks text | Cleared during metadata scrubbing |\n\nIf you put sensitive information in your title or description frontmatter, it **will** be visible in the built site. Keep sensitive content in the post body.\n\n## Privacy Protection\n\nWhen a post is marked private (by any method), markata-go suppresses it across all output types -- not just the HTML article page. This prevents content from leaking through alternate channels.\n\n### What is protected\n\n| Output | Behavior |\n|--------|----------|\n| HTML page | Content encrypted with password prompt |\n| `.md` / `.txt` alternates | Not generated for private posts |\n| OG image cards | Not generated for private posts |\n| RSS / Atom / JSON feeds | Private posts are excluded unless the feed explicitly sets `include_private = true`; included entries contain encrypted HTML and safe metadata only |\n| Feed pages | Private posts are excluded from public feed pages; only feeds that explicitly set `include_private = true` can include safe metadata and encrypted content |\n| Embed cards (`\u003c!-- embed not found: slug --\u003e\n![[slug]]`) | Shows a \"Private Content\" card with no title, description, or date |\n| Wikilinks (`[[slug]]`) | Link text is rendered but `data-title`, `data-description`, `data-date` attributes are omitted |\n| Wikilink hover previews | No hover preview is shown for private posts |\n| Auto-generated descriptions | Not generated from private post content |\n\n### How it works\n\nPrivacy marking happens at the very start of the Transform stage -- before any other plugin processes the post. This ensures that every downstream plugin (description generation, embed cards, wikilinks, feeds, etc.) sees `private: true` and acts accordingly.\n\nThe encrypted article HTML is the **only** representation of your private content in the built site.\n\n### Warm builds and key rotation\n\nEncrypted wrappers are cached using the rendered article, key name, resolved\npassword, public hint, source path (used by accessibility controls), and a\nmaintained wrapper/browser-crypto revision. Wrapper or browser crypto format\nchanges bump that revision; old entries miss once without a build-cache schema\nmigration. A fresh randomized source envelope does not force new browser\nciphertext when plaintext and the key contract are unchanged.\n\nWhen a wrapper really regenerates—including password/key-name rotation, hint\nchanges, or encrypted-cache file loss—the page and its dependent pages are\nrendered and published again, even if the decrypted input hash is unchanged.\nThis includes private homepages with an explicitly empty slug. Regeneration\nclears the previous full-page cache reference before fresh cache writes. If a\nbest-effort full-page write fails, saving cache metadata preserves that cleared\nreference: the next build re-renders instead of restoring old-password HTML,\neven when its encrypted wrapper is a valid hit or its output file is missing.\nThe old page-cache file may remain orphaned but is no longer usable through\nthat post's cache reference.\n\nValid warm hits keep the identical encrypted wrapper and full page and still\nscrub private metadata. Wrapper hits and encryption errors do not clear a valid\nfull-page reference. Best-effort wrapper-cache write failure still invalidates\nthe old full page; this is not a general transactional cache-recovery guarantee.\n\nWhen checking a key rotation, first confirm at least two equivalent warm builds\nwith the old key. Cold-to-warm asset or configuration resets can otherwise mask\nstale-page behavior. Verify decryption of the actual published HTML file using\nthe new key, rather than checking only an in-memory wrapper.\n\nSource-encrypted posts still never cache decrypted parsed posts or plaintext\narticles. Inferred titles use a transient hash-only prior-build baseline for\ncanonical comparison; that baseline stores no plaintext or password. Load's\nconservative feed/tag/garden dirty signals are preserved.\n\n### Feed pages and private tags\n\n`private_tags` marks matching posts as private and encrypted. Auto-generated feeds\nfor private tags opt into those posts so their encrypted entries can render;\nother auto-generated tag, category, and archive feeds exclude private posts.\n\nIf you intentionally need a private-aware archive or admin page, create an\nexplicit feed with `include_private = true` and restrict where you publish it.\nPrivate RSS, Atom, and JSON Feed entries still contain no raw body, key name,\nderived description, or private media reference.\n\n## Security Notes\n\n- **AES-256-GCM** encryption with random IVs\n- **PBKDF2** key derivation with 100,000 iterations\n- Encryption happens at build time; decryption happens client-side\n- The server only ever serves encrypted content\n- Passwords are never transmitted to the server\n- Session storage is opt-in and per-tab only\n",
      "summary": "Protect sensitive content with client-side encryption using AES-256-GCM",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "encryption",
        "privacy",
        "security"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/dynamic-content/",
      "url": "https://markata.dev/docs/guides/dynamic-content/",
      "title": "Dynamic Content",
      "content_html": "\u003ch2 id=\"dynamic-content-jinja-in-markdown\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDynamic Content (Jinja in Markdown)\u003c/span\u003e \u003ca href=\"#dynamic-content-jinja-in-markdown\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ccode\u003ejinja_md\u003c/code\u003e plugin lets you use Jinja2 template syntax directly inside your Markdown files. This enables dynamic content generation: listing recent posts, showing related articles, creating series navigation, and more.\u003c/p\u003e\n\u003ch2 id=\"table-of-contents\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTable of Contents\u003c/span\u003e \u003ca href=\"#table-of-contents\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#overview\"\u003eOverview\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#enabling-jinja-in-markdown\"\u003eEnabling Jinja in Markdown\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#accessing-posts-in-markdown\"\u003eAccessing Posts in Markdown\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#including-recent-posts-from-a-feed\"\u003eIncluding Recent Posts from a Feed\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#common-use-cases\"\u003eCommon Use Cases\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#available-variables\"\u003eAvailable Variables\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#available-filters\"\u003eAvailable Filters\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#practical-examples\"\u003ePractical Examples\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#tips-and-troubleshooting\"\u003eTips and Troubleshooting\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"overview\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOverview\u003c/span\u003e \u003ca href=\"#overview\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ccode\u003ejinja_md\u003c/code\u003e plugin processes Jinja2 template syntax in your Markdown content \u003cstrong\u003ebefore\u003c/strong\u003e it\u0026rsquo;s converted to HTML. This means you can:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLoop through posts and create dynamic lists\u003c/li\u003e\n\u003cli\u003eFilter posts by tags, dates, or any frontmatter field\u003c/li\u003e\n\u003cli\u003eAccess site configuration and post metadata\u003c/li\u003e\n\u003cli\u003eCreate reusable content patterns within your posts\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe plugin uses the same template engine as HTML templates, so all filters and syntax work identically.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"enabling-jinja-in-markdown\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnabling Jinja in Markdown\u003c/span\u003e \u003ca href=\"#enabling-jinja-in-markdown\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ccode\u003ejinja_md\u003c/code\u003e plugin is \u003cstrong\u003eincluded by default\u003c/strong\u003e, but Jinja processing is \u003cstrong\u003eopt-in per post\u003c/strong\u003e. You must explicitly enable it in the frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Homepage\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e## Recent Posts\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\u003cspan class=\"l\"\u003e% for post in core.filter(\u0026#34;published == True\u0026#34;)[:5] %}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"p\"\u003e[\u003c/span\u003e{{\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epost.Title }}]({{ post.Href }})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\u003cspan class=\"l\"\u003e% endfor %}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"why-opt-in\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhy Opt-In?\u003c/span\u003e \u003ca href=\"#why-opt-in\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eJinja processing is opt-in because:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003ePerformance\u003c/strong\u003e - Not every post needs template processing\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSafety\u003c/strong\u003e - Prevents accidental template interpretation in code examples\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClarity\u003c/strong\u003e - Makes it obvious which files contain dynamic content\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"valid-values\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eValid Values\u003c/span\u003e \u003ca href=\"#valid-values\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe \u003ccode\u003ejinja\u003c/code\u003e frontmatter field accepts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# Enable (boolean)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# Enable (string)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;yes\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"c\"\u003e# Enable (string)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"c\"\u003e# Enable (string)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"c\"\u003e# Disable (default)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"accessing-posts-in-markdown\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAccessing Posts in Markdown\u003c/span\u003e \u003ca href=\"#accessing-posts-in-markdown\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen Jinja is enabled, you have access to three key objects for working with posts:\u003c/p\u003e\n\u003ch3 id=\"core-posts\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003ecore.Posts()\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#core-posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eReturns \u003cstrong\u003eall posts\u003c/strong\u003e as a list:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003e{% for post in core.Posts() %}\n- {{ post.Title }}\n{% endfor %}\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"core-filter-expression\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003ecore.filter(expression)\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#core-filter-expression\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eReturns posts matching a \u003cstrong\u003efilter expression\u003c/strong\u003e:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003e{% for post in core.filter(\u0026quot;published == True\u0026quot;) %}\n- {{ post.Title }}\n{% endfor %}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe filter syntax matches what you use in feed configuration:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eExpression\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;published == True\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePublished posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;draft == False\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNon-draft posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;'python' in tags\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePosts tagged with \u0026ldquo;python\u0026rdquo;\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;date \u0026gt;= '2024-01-01'\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePosts from 2024 onwards\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;published == True and 'tutorial' in tags\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePublished tutorials\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"core-feeds\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003ecore.feeds\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#core-feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAccess to configured feed collections (coming soon):\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003e{% for post in core.feeds.blog.posts[:5] %}\n- {{ post.Title }}\n{% endfor %}\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch2 id=\"including-recent-posts-from-a-feed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIncluding Recent Posts from a Feed\u003c/span\u003e \u003ca href=\"#including-recent-posts-from-a-feed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis is the most common use case: showing a list of recent posts on a homepage or landing page.\u003c/p\u003e\n\u003ch3 id=\"basic-example-last-3-posts-as-links\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Example: Last 3 Posts as Links\u003c/span\u003e \u003ca href=\"#basic-example-last-3-posts-as-links\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Welcome to My Blog\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Welcome\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCheck out my latest articles:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Recent Posts\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for post in core.filter(\u0026#34;published == True\u0026#34;)[:3] %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ post.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ post.Href }}\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eOutput:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Welcome\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCheck out my latest articles:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Recent Posts\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eGetting Started with Go\u003c/span\u003e](\u003cspan class=\"na\"\u003e/getting-started-with-go/\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eWhy I Switched to Neovim\u003c/span\u003e](\u003cspan class=\"na\"\u003e/why-i-switched-to-neovim/\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003eBuilding a Static Site Generator\u003c/span\u003e](\u003cspan class=\"na\"\u003e/building-a-static-site-generator/\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"with-dates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWith Dates\u003c/span\u003e \u003ca href=\"#with-dates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Recent Posts\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for post in core.filter(\u0026#34;published == True\u0026#34;)[:5] %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ post.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ post.Href }}\u003c/span\u003e) - {{ post.Date|date_format:\u0026#34;Jan 2, 2006\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"with-descriptions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWith Descriptions\u003c/span\u003e \u003ca href=\"#with-descriptions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Recent Posts\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for post in core.filter(\u0026#34;published == True\u0026#34;)[:3] %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### [{{ post.Title }}]({{ post.Href }})\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ post.Description|default_if_none:\u0026#34;\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"excluding-the-current-post\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExcluding the Current Post\u003c/span\u003e \u003ca href=\"#excluding-the-current-post\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen showing related posts, exclude the current post:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Other Posts You Might Like\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for post in core.filter(\u0026#34;published == True\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.Slug != slug %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ post.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ post.Href }}\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"common-use-cases\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Use Cases\u003c/span\u003e \u003ca href=\"#common-use-cases\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"related-posts-by-tag\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRelated Posts by Tag\u003c/span\u003e \u003ca href=\"#related-posts-by-tag\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eShow posts that share tags with the current post:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Python Tips and Tricks\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;python\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;programming\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Python Tips and Tricks\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[Your article content here]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Related Posts\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in core.filter(\u0026#34;published == True\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if p.Slug != post.Slug %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for tag in post.Tags %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if tag in p.Tags %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ p.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ p.Href }}\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"posts-in-a-series\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePosts in a Series\u003c/span\u003e \u003ca href=\"#posts-in-a-series\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate navigation for a multi-part series:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Go Tutorial Part 2: Variables\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;go-tutorial\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries_order\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Series Navigation\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in core.filter(\u0026#34;published == True\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if p.Extra.series == \u0026#34;go-tutorial\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if p.Extra.series_order == post.Extra.series_order %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ge\"\u003e**\u003c/span\u003e{{ p.Extra.series_order }}. {{ p.Title }}** (You are here)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ p.Extra.series_order }}. [\u003cspan class=\"nt\"\u003e{{ p.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ p.Href }}\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"featured-posts-section\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeatured Posts Section\u003c/span\u003e \u003ca href=\"#featured-posts-section\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eShow posts marked as featured:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Home\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Featured Articles\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for post in core.filter(\u0026#34;published == True and featured == True\u0026#34;)[:3] %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### [{{ post.Title }}]({{ post.Href }})\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ post.Description|default_if_none:\u0026#34;\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"table-of-contents-from-other-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTable of Contents from Other Posts\u003c/span\u003e \u003ca href=\"#table-of-contents-from-other-posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGenerate a table of contents from a category:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Documentation Index\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Documentation\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Getting Started\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for post in core.filter(\u0026#34;published == True and \u0026#39;getting-started\u0026#39; in tags\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ post.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ post.Href }}\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Advanced Topics\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for post in core.filter(\u0026#34;published == True and \u0026#39;advanced\u0026#39; in tags\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ post.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ post.Href }}\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## API Reference\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for post in core.filter(\u0026#34;published == True and \u0026#39;api\u0026#39; in tags\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ post.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ post.Href }}\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"dynamic-navigation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDynamic Navigation\u003c/span\u003e \u003ca href=\"#dynamic-navigation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate a navigation section that updates automatically:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Python Guide\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecategory\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;python\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;nav class=\u0026#34;sidebar\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in core.filter(\u0026#34;published == True and category == \u0026#39;python\u0026#39;\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if p.Slug == post.Slug %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;strong\u0026gt;{{ p.Title }}\u0026lt;/strong\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;a href=\u0026#34;{{ p.Href }}\u0026#34;\u0026gt;{{ p.Title }}\u0026lt;/a\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;/nav\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Python Guide\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[Content here]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"available-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAvailable Variables\u003c/span\u003e \u003ca href=\"#available-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen Jinja is enabled in a Markdown file, these variables are available:\u003c/p\u003e\n\u003ch3 id=\"post-the-current-post\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003epost\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e - The Current Post\u003c/span\u003e \u003ca href=\"#post-the-current-post\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003ePost title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Slug\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eURL slug\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Href\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRelative URL (e.g., \u003ccode\u003e/my-post/\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Date\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003etime\u003c/td\u003e\n\u003ctd\u003ePublication date\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Published\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eWhether the post is published\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Draft\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eWhether it\u0026rsquo;s a draft\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Tags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003eList of tags\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Description\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003ePost description\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Content\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRaw Markdown content\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epost.Extra\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003emap\u003c/td\u003e\n\u003ctd\u003eCustom frontmatter fields\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eAccess custom frontmatter via \u003ccode\u003epost.Extra\u003c/code\u003e:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003eSeries: {{ post.Extra.series }}\nOrder: {{ post.Extra.series_order }}\nCustom Field: {{ post.Extra.my_custom_field }}\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"config-site-configuration\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003econfig\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e - Site Configuration\u003c/span\u003e \u003ca href=\"#config-site-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig.Title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSite title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig.Description\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSite description\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig.URL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSite base URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig.Author\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSite author\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"core-the-lifecycle-manager\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003ecore\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e - The Lifecycle Manager\u003c/span\u003e \u003ca href=\"#core-the-lifecycle-manager\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eMethod\u003c/th\u003e\n\u003cth\u003eReturns\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecore.Posts()\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]Post\u003c/td\u003e\n\u003ctd\u003eAll posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecore.filter(expr)\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]Post\u003c/td\u003e\n\u003ctd\u003ePosts matching expression\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"posts-all-posts-alias\"\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003eposts\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e - All Posts (Alias)\u003c/span\u003e \u003ca href=\"#posts-all-posts-alias\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eA convenience alias for \u003ccode\u003ecore.Posts()\u003c/code\u003e:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003e{% for p in posts %}\n- {{ p.Title }}\n{% endfor %}\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"shorthand-aliases\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eShorthand Aliases\u003c/span\u003e \u003ca href=\"#shorthand-aliases\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThese aliases are also available for convenience:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAlias\u003c/th\u003e\n\u003cth\u003eEquivalent\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esite_title\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003econfig.Title\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esite_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003econfig.URL\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esite_description\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003econfig.Description\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esite_author\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003econfig.Author\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"available-filters\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAvailable Filters\u003c/span\u003e \u003ca href=\"#available-filters\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAll template filters work in Jinja Markdown. Here are the most useful ones:\u003c/p\u003e\n\u003ch3 id=\"date-formatting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDate Formatting\u003c/span\u003e \u003ca href=\"#date-formatting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003e{{ post.Date|date_format:\u0026quot;January 2, 2006\u0026quot; }}\n{{ post.Date|date_format:\u0026quot;2006-01-02\u0026quot; }}\n{{ post.Date|date_format:\u0026quot;Jan 2\u0026quot; }}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eGo date format reference:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFormat\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e2006-01-02\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e2024-03-15\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eJanuary 2, 2006\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMarch 15, 2024\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eJan 2, 2006\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMar 15, 2024\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e02 Jan 2006\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e15 Mar 2024\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMonday, January 2\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFriday, March 15\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"string-manipulation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eString Manipulation\u003c/span\u003e \u003ca href=\"#string-manipulation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003e{{ post.Title|slugify }}           {# my-post-title #}\n{{ post.Description|truncate:100 }} {# First 100 chars... #}\n{{ post.Description|truncatewords:20 }} {# First 20 words... #}\n{{ \u0026quot;Hello World\u0026quot;|upper }}          {# HELLO WORLD #}\n{{ \u0026quot;Hello World\u0026quot;|lower }}          {# hello world #}\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"default-values\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDefault Values\u003c/span\u003e \u003ca href=\"#default-values\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003e{{ post.Description|default_if_none:\u0026quot;No description\u0026quot; }}\n{{ post.Extra.custom|default_if_none:\u0026quot;Default value\u0026quot; }}\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"collections\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCollections\u003c/span\u003e \u003ca href=\"#collections\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003e{{ post.Tags|length }}             {# Number of tags #}\n{{ post.Tags|join:\u0026quot;, \u0026quot; }}          {# tag1, tag2, tag3 #}\n{{ post.Tags|first }}              {# First tag #}\n{{ post.Tags|last }}               {# Last tag #}\n{{ post.Tags|sort|join:\u0026quot;, \u0026quot; }}     {# Alphabetically sorted #}\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"html-text\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHTML/Text\u003c/span\u003e \u003ca href=\"#html-text\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003e{{ html_content|striptags }}       {# Remove HTML tags #}\n{{ text|linebreaksbr }}            {# Convert \\n to \u0026lt;br\u0026gt; #}\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"urls\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eURLs\u003c/span\u003e \u003ca href=\"#urls\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003e{{ post.Href|absolute_url:config.URL }}  {# https://example.com/my-post/ #}\n{{ \u0026quot;search query\u0026quot;|urlencode }}           {# search%20query #}\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch2 id=\"practical-examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePractical Examples\u003c/span\u003e \u003ca href=\"#practical-examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"blog-homepage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBlog Homepage\u003c/span\u003e \u003ca href=\"#blog-homepage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eA complete homepage showing featured posts, recent posts, and categories:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Home\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;landing.html\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Welcome to My Blog\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eI write about programming, technology, and life.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Featured Posts\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in core.filter(\u0026#34;published == True and featured == True\u0026#34;)[:3] %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;article class=\u0026#34;featured\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026lt;h3\u0026gt;\u0026lt;a href=\u0026#34;{{ p.Href }}\u0026#34;\u0026gt;{{ p.Title }}\u0026lt;/a\u0026gt;\u0026lt;/h3\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026lt;p\u0026gt;{{ p.Description|default_if_none:\u0026#34;\u0026#34; }}\u0026lt;/p\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026lt;time\u0026gt;{{ p.Date|date_format:\u0026#34;January 2, 2006\u0026#34; }}\u0026lt;/time\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;/article\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Recent Posts\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in core.filter(\u0026#34;published == True\u0026#34;)[:10] %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ p.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ p.Href }}\u003c/span\u003e) \u0026lt;small\u0026gt;{{ p.Date|date_format:\u0026#34;Jan 2\u0026#34; }}\u0026lt;/small\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003eView all posts\u003c/span\u003e](\u003cspan class=\"na\"\u003e/archive/\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"series-navigation-component\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSeries Navigation Component\u003c/span\u003e \u003ca href=\"#series-navigation-component\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eReusable series navigation that appears at the top and bottom of series posts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Building a CLI in Go: Part 3\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;go-cli\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries_order\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;nav class=\u0026#34;series-nav\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026lt;strong\u0026gt;Series: Building a CLI in Go\u0026lt;/strong\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026lt;ol\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% for p in core.filter(\u0026#34;published == True\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% if p.Extra.series == post.Extra.series %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if p.Slug == post.Slug %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026lt;li class=\u0026#34;current\u0026#34;\u0026gt;{{ p.Title }}\u0026lt;/li\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;{{ p.Href }}\u0026#34;\u0026gt;{{ p.Title }}\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026lt;/ol\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;/nav\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Building a CLI in Go: Part 3\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[Your content here]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;nav class=\u0026#34;series-nav\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% set series_posts = [] %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% for p in core.filter(\u0026#34;published == True\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% if p.Extra.series == post.Extra.series %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% set _ = series_posts.append(p) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% if post.Extra.series_order \u0026gt; 1 %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  [\u003cspan class=\"nt\"\u003ePrevious: Part {{ post.Extra.series_order - 1 }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e#\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% if post.Extra.series_order \u0026lt; series_posts|length %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  [\u003cspan class=\"nt\"\u003eNext: Part {{ post.Extra.series_order + 1 }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e#\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;/nav\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"tag-cloud\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTag Cloud\u003c/span\u003e \u003ca href=\"#tag-cloud\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGenerate a tag cloud showing all tags:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Tags\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# All Tags\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;div class=\u0026#34;tag-cloud\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% set all_tags = [] %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in core.filter(\u0026#34;published == True\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% for tag in p.Tags %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if tag not in all_tags %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {% set _ = all_tags.append(tag) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for tag in all_tags|sort %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;a href=\u0026#34;/tags/{{ tag|slugify }}/\u0026#34; class=\u0026#34;tag\u0026#34;\u0026gt;{{ tag }}\u0026lt;/a\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;/div\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"archive-by-year\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eArchive by Year\u003c/span\u003e \u003ca href=\"#archive-by-year\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate an archive organized by year:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Archive\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Archive\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% set current_year = \u0026#34;\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in core.filter(\u0026#34;published == True\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% set year = p.Date|date_format:\u0026#34;2006\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if year != current_year %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% set current_year = year %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## {{ year }}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ p.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ p.Href }}\u003c/span\u003e) \u0026lt;small\u0026gt;{{ p.Date|date_format:\u0026#34;Jan 2\u0026#34; }}\u0026lt;/small\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"posts-by-category\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePosts by Category\u003c/span\u003e \u003ca href=\"#posts-by-category\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGroup posts by a custom category field:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;All Articles\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# All Articles\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Tutorials\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in core.filter(\u0026#34;published == True and category == \u0026#39;tutorial\u0026#39;\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ p.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ p.Href }}\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Essays\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in core.filter(\u0026#34;published == True and category == \u0026#39;essay\u0026#39;\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ p.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ p.Href }}\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Reviews\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in core.filter(\u0026#34;published == True and category == \u0026#39;review\u0026#39;\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ p.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ p.Href }}\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"dynamic-changelog\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDynamic Changelog\u003c/span\u003e \u003ca href=\"#dynamic-changelog\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eShow recent posts as a changelog:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Changelog\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Changelog\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in core.filter(\u0026#34;published == True and \u0026#39;changelog\u0026#39; in tags\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## {{ p.Date|date_format:\u0026#34;January 2, 2006\u0026#34; }} - {{ p.Title }}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ p.Description|default_if_none:\u0026#34;\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\u003cspan class=\"nt\"\u003eRead more\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ p.Href }}\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"tips-and-troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTips and Troubleshooting\u003c/span\u003e \u003ca href=\"#tips-and-troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"escaping-jinja-syntax\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEscaping Jinja Syntax\u003c/span\u003e \u003ca href=\"#escaping-jinja-syntax\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIf you need to show literal Jinja syntax (like in documentation), use raw blocks:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003e{% raw %}\nThis won't be processed: {{ variable }}\nNeither will this: {% for item in list %}\n{% endraw %}\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"debugging\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDebugging\u003c/span\u003e \u003ca href=\"#debugging\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePrint variables to see their values:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003e\u0026lt;!-- Debug: {{ post.Extra }} --\u0026gt;\n\u0026lt;!-- Tags: {{ post.Tags }} --\u0026gt;\n\u0026lt;!-- Post count: {{ core.Posts()|length }} --\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"performance-considerations\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePerformance Considerations\u003c/span\u003e \u003ca href=\"#performance-considerations\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUse specific filters rather than filtering all posts in templates\u003c/li\u003e\n\u003cli\u003eLimit results with slicing: \u003ccode\u003e[:10]\u003c/code\u003e instead of processing everything\u003c/li\u003e\n\u003cli\u003eConsider using feeds for complex aggregations\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"common-mistakes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Mistakes\u003c/span\u003e \u003ca href=\"#common-mistakes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eForgetting \u003ccode\u003ejinja: true\u003c/code\u003e:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Post\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Don\u0026#39;t forget this!\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eWrong field names:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003e{{ post.title }}  # Wrong: lowercase\n{{ post.Title }}  # Correct: PascalCase\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eMissing safe filter for HTML:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003e{{ post.ArticleHTML }}        # Escaped HTML (wrong)\n{{ post.ArticleHTML|safe }}   # Raw HTML (correct)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eComparing to string instead of boolean:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-jinja2\"\u003e{% if post.Published == \u0026quot;true\u0026quot; %}  # Wrong\n{% if post.Published %}             # Correct\n{% if post.Published == True %}     # Also correct\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[[templates-guide|Templates Guide]] - Full template syntax and filters\u003c/li\u003e\n\u003cli\u003e[[feeds-guide|Feeds Guide]] - Configure feed collections\u003c/li\u003e\n\u003cli\u003e[[configuration-guide|Configuration Guide]] - Site-wide settings\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n## Dynamic Content (Jinja in Markdown)\n\nThe `jinja_md` plugin lets you use Jinja2 template syntax directly inside your Markdown files. This enables dynamic content generation: listing recent posts, showing related articles, creating series navigation, and more.\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Enabling Jinja in Markdown](#enabling-jinja-in-markdown)\n- [Accessing Posts in Markdown](#accessing-posts-in-markdown)\n- [Including Recent Posts from a Feed](#including-recent-posts-from-a-feed)\n- [Common Use Cases](#common-use-cases)\n- [Available Variables](#available-variables)\n- [Available Filters](#available-filters)\n- [Practical Examples](#practical-examples)\n- [Tips and Troubleshooting](#tips-and-troubleshooting)\n\n---\n\n## Overview\n\nThe `jinja_md` plugin processes Jinja2 template syntax in your Markdown content **before** it's converted to HTML. This means you can:\n\n- Loop through posts and create dynamic lists\n- Filter posts by tags, dates, or any frontmatter field\n- Access site configuration and post metadata\n- Create reusable content patterns within your posts\n\nThe plugin uses the same template engine as HTML templates, so all filters and syntax work identically.\n\n---\n\n## Enabling Jinja in Markdown\n\nThe `jinja_md` plugin is **included by default**, but Jinja processing is **opt-in per post**. You must explicitly enable it in the frontmatter:\n\n```yaml\n---\ntitle: \"My Homepage\"\njinja: true\n---\n\n## Recent Posts\n\n{% for post in core.filter(\"published == True\")[:5] %}\n- [{{ post.Title }}]({{ post.Href }})\n{% endfor %}\n```\n\n### Why Opt-In?\n\nJinja processing is opt-in because:\n\n1. **Performance** - Not every post needs template processing\n2. **Safety** - Prevents accidental template interpretation in code examples\n3. **Clarity** - Makes it obvious which files contain dynamic content\n\n### Valid Values\n\nThe `jinja` frontmatter field accepts:\n\n```yaml\njinja: true      # Enable (boolean)\njinja: \"true\"    # Enable (string)\njinja: \"yes\"     # Enable (string)\njinja: \"1\"       # Enable (string)\njinja: false     # Disable (default)\n```\n\n---\n\n## Accessing Posts in Markdown\n\nWhen Jinja is enabled, you have access to three key objects for working with posts:\n\n### `core.Posts()`\n\nReturns **all posts** as a list:\n\n```jinja2\n{% for post in core.Posts() %}\n- {{ post.Title }}\n{% endfor %}\n```\n\n### `core.filter(expression)`\n\nReturns posts matching a **filter expression**:\n\n```jinja2\n{% for post in core.filter(\"published == True\") %}\n- {{ post.Title }}\n{% endfor %}\n```\n\nThe filter syntax matches what you use in feed configuration:\n\n| Expression | Description |\n|------------|-------------|\n| `\"published == True\"` | Published posts |\n| `\"draft == False\"` | Non-draft posts |\n| `\"'python' in tags\"` | Posts tagged with \"python\" |\n| `\"date \u003e= '2024-01-01'\"` | Posts from 2024 onwards |\n| `\"published == True and 'tutorial' in tags\"` | Published tutorials |\n\n### `core.feeds`\n\nAccess to configured feed collections (coming soon):\n\n```jinja2\n{% for post in core.feeds.blog.posts[:5] %}\n- {{ post.Title }}\n{% endfor %}\n```\n\n---\n\n## Including Recent Posts from a Feed\n\nThis is the most common use case: showing a list of recent posts on a homepage or landing page.\n\n### Basic Example: Last 3 Posts as Links\n\n```markdown\n---\ntitle: \"Welcome to My Blog\"\njinja: true\n---\n\n# Welcome\n\nCheck out my latest articles:\n\n## Recent Posts\n\n{% for post in core.filter(\"published == True\")[:3] %}\n- [{{ post.Title }}]({{ post.Href }})\n{% endfor %}\n```\n\n**Output:**\n\n```markdown\n# Welcome\n\nCheck out my latest articles:\n\n## Recent Posts\n\n- [Getting Started with Go](/getting-started-with-go/)\n- [Why I Switched to Neovim](/why-i-switched-to-neovim/)\n- [Building a Static Site Generator](/building-a-static-site-generator/)\n```\n\n### With Dates\n\n```markdown\n## Recent Posts\n\n{% for post in core.filter(\"published == True\")[:5] %}\n- [{{ post.Title }}]({{ post.Href }}) - {{ post.Date|date_format:\"Jan 2, 2006\" }}\n{% endfor %}\n```\n\n### With Descriptions\n\n```markdown\n## Recent Posts\n\n{% for post in core.filter(\"published == True\")[:3] %}\n### [{{ post.Title }}]({{ post.Href }})\n\n{{ post.Description|default_if_none:\"\" }}\n\n{% endfor %}\n```\n\n### Excluding the Current Post\n\nWhen showing related posts, exclude the current post:\n\n```markdown\n## Other Posts You Might Like\n\n{% for post in core.filter(\"published == True\") %}\n{% if post.Slug != slug %}\n- [{{ post.Title }}]({{ post.Href }})\n{% endif %}\n{% endfor %}\n```\n\n---\n\n## Common Use Cases\n\n### Related Posts by Tag\n\nShow posts that share tags with the current post:\n\n```markdown\n---\ntitle: \"Python Tips and Tricks\"\ntags: [\"python\", \"programming\"]\njinja: true\n---\n\n# Python Tips and Tricks\n\n[Your article content here]\n\n---\n\n## Related Posts\n\n{% for p in core.filter(\"published == True\") %}\n{% if p.Slug != post.Slug %}\n{% for tag in post.Tags %}\n{% if tag in p.Tags %}\n- [{{ p.Title }}]({{ p.Href }})\n{% endif %}\n{% endfor %}\n{% endif %}\n{% endfor %}\n```\n\n### Posts in a Series\n\nCreate navigation for a multi-part series:\n\n```markdown\n---\ntitle: \"Go Tutorial Part 2: Variables\"\nseries: \"go-tutorial\"\nseries_order: 2\njinja: true\n---\n\n## Series Navigation\n\n{% for p in core.filter(\"published == True\") %}\n{% if p.Extra.series == \"go-tutorial\" %}\n{% if p.Extra.series_order == post.Extra.series_order %}\n**{{ p.Extra.series_order }}. {{ p.Title }}** (You are here)\n{% else %}\n{{ p.Extra.series_order }}. [{{ p.Title }}]({{ p.Href }})\n{% endif %}\n{% endif %}\n{% endfor %}\n```\n\n### Featured Posts Section\n\nShow posts marked as featured:\n\n```markdown\n---\ntitle: \"Home\"\njinja: true\n---\n\n## Featured Articles\n\n{% for post in core.filter(\"published == True and featured == True\")[:3] %}\n### [{{ post.Title }}]({{ post.Href }})\n\n{{ post.Description|default_if_none:\"\" }}\n\n{% endfor %}\n```\n\n### Table of Contents from Other Posts\n\nGenerate a table of contents from a category:\n\n```markdown\n---\ntitle: \"Documentation Index\"\njinja: true\n---\n\n# Documentation\n\n## Getting Started\n\n{% for post in core.filter(\"published == True and 'getting-started' in tags\") %}\n- [{{ post.Title }}]({{ post.Href }})\n{% endfor %}\n\n## Advanced Topics\n\n{% for post in core.filter(\"published == True and 'advanced' in tags\") %}\n- [{{ post.Title }}]({{ post.Href }})\n{% endfor %}\n\n## API Reference\n\n{% for post in core.filter(\"published == True and 'api' in tags\") %}\n- [{{ post.Title }}]({{ post.Href }})\n{% endfor %}\n```\n\n### Dynamic Navigation\n\nCreate a navigation section that updates automatically:\n\n```markdown\n---\ntitle: \"Python Guide\"\ncategory: \"python\"\njinja: true\n---\n\n\u003cnav class=\"sidebar\"\u003e\n{% for p in core.filter(\"published == True and category == 'python'\") %}\n{% if p.Slug == post.Slug %}\n\u003cstrong\u003e{{ p.Title }}\u003c/strong\u003e\n{% else %}\n\u003ca href=\"{{ p.Href }}\"\u003e{{ p.Title }}\u003c/a\u003e\n{% endif %}\n{% endfor %}\n\u003c/nav\u003e\n\n# Python Guide\n\n[Content here]\n```\n\n---\n\n## Available Variables\n\nWhen Jinja is enabled in a Markdown file, these variables are available:\n\n### `post` - The Current Post\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `post.Title` | string | Post title |\n| `post.Slug` | string | URL slug |\n| `post.Href` | string | Relative URL (e.g., `/my-post/`) |\n| `post.Date` | time | Publication date |\n| `post.Published` | bool | Whether the post is published |\n| `post.Draft` | bool | Whether it's a draft |\n| `post.Tags` | []string | List of tags |\n| `post.Description` | string | Post description |\n| `post.Content` | string | Raw Markdown content |\n| `post.Extra` | map | Custom frontmatter fields |\n\nAccess custom frontmatter via `post.Extra`:\n\n```jinja2\nSeries: {{ post.Extra.series }}\nOrder: {{ post.Extra.series_order }}\nCustom Field: {{ post.Extra.my_custom_field }}\n```\n\n### `config` - Site Configuration\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `config.Title` | string | Site title |\n| `config.Description` | string | Site description |\n| `config.URL` | string | Site base URL |\n| `config.Author` | string | Site author |\n\n### `core` - The Lifecycle Manager\n\n| Method | Returns | Description |\n|--------|---------|-------------|\n| `core.Posts()` | []Post | All posts |\n| `core.filter(expr)` | []Post | Posts matching expression |\n\n### `posts` - All Posts (Alias)\n\nA convenience alias for `core.Posts()`:\n\n```jinja2\n{% for p in posts %}\n- {{ p.Title }}\n{% endfor %}\n```\n\n### Shorthand Aliases\n\nThese aliases are also available for convenience:\n\n| Alias | Equivalent |\n|-------|------------|\n| `site_title` | `config.Title` |\n| `site_url` | `config.URL` |\n| `site_description` | `config.Description` |\n| `site_author` | `config.Author` |\n\n---\n\n## Available Filters\n\nAll template filters work in Jinja Markdown. Here are the most useful ones:\n\n### Date Formatting\n\n```jinja2\n{{ post.Date|date_format:\"January 2, 2006\" }}\n{{ post.Date|date_format:\"2006-01-02\" }}\n{{ post.Date|date_format:\"Jan 2\" }}\n```\n\nGo date format reference:\n\n| Format | Example |\n|--------|---------|\n| `2006-01-02` | 2024-03-15 |\n| `January 2, 2006` | March 15, 2024 |\n| `Jan 2, 2006` | Mar 15, 2024 |\n| `02 Jan 2006` | 15 Mar 2024 |\n| `Monday, January 2` | Friday, March 15 |\n\n### String Manipulation\n\n```jinja2\n{{ post.Title|slugify }}           {# my-post-title #}\n{{ post.Description|truncate:100 }} {# First 100 chars... #}\n{{ post.Description|truncatewords:20 }} {# First 20 words... #}\n{{ \"Hello World\"|upper }}          {# HELLO WORLD #}\n{{ \"Hello World\"|lower }}          {# hello world #}\n```\n\n### Default Values\n\n```jinja2\n{{ post.Description|default_if_none:\"No description\" }}\n{{ post.Extra.custom|default_if_none:\"Default value\" }}\n```\n\n### Collections\n\n```jinja2\n{{ post.Tags|length }}             {# Number of tags #}\n{{ post.Tags|join:\", \" }}          {# tag1, tag2, tag3 #}\n{{ post.Tags|first }}              {# First tag #}\n{{ post.Tags|last }}               {# Last tag #}\n{{ post.Tags|sort|join:\", \" }}     {# Alphabetically sorted #}\n```\n\n### HTML/Text\n\n```jinja2\n{{ html_content|striptags }}       {# Remove HTML tags #}\n{{ text|linebreaksbr }}            {# Convert \\n to \u003cbr\u003e #}\n```\n\n### URLs\n\n```jinja2\n{{ post.Href|absolute_url:config.URL }}  {# https://example.com/my-post/ #}\n{{ \"search query\"|urlencode }}           {# search%20query #}\n```\n\n---\n\n## Practical Examples\n\n### Blog Homepage\n\nA complete homepage showing featured posts, recent posts, and categories:\n\n```markdown\n---\ntitle: \"Home\"\ntemplate: \"landing.html\"\njinja: true\n---\n\n# Welcome to My Blog\n\nI write about programming, technology, and life.\n\n## Featured Posts\n\n{% for p in core.filter(\"published == True and featured == True\")[:3] %}\n\u003carticle class=\"featured\"\u003e\n  \u003ch3\u003e\u003ca href=\"{{ p.Href }}\"\u003e{{ p.Title }}\u003c/a\u003e\u003c/h3\u003e\n  \u003cp\u003e{{ p.Description|default_if_none:\"\" }}\u003c/p\u003e\n  \u003ctime\u003e{{ p.Date|date_format:\"January 2, 2006\" }}\u003c/time\u003e\n\u003c/article\u003e\n{% endfor %}\n\n## Recent Posts\n\n{% for p in core.filter(\"published == True\")[:10] %}\n- [{{ p.Title }}]({{ p.Href }}) \u003csmall\u003e{{ p.Date|date_format:\"Jan 2\" }}\u003c/small\u003e\n{% endfor %}\n\n[View all posts](/archive/)\n```\n\n### Series Navigation Component\n\nReusable series navigation that appears at the top and bottom of series posts:\n\n```markdown\n---\ntitle: \"Building a CLI in Go: Part 3\"\nseries: \"go-cli\"\nseries_order: 3\njinja: true\n---\n\n\u003cnav class=\"series-nav\"\u003e\n  \u003cstrong\u003eSeries: Building a CLI in Go\u003c/strong\u003e\n  \u003col\u003e\n  {% for p in core.filter(\"published == True\") %}\n  {% if p.Extra.series == post.Extra.series %}\n    {% if p.Slug == post.Slug %}\n    \u003cli class=\"current\"\u003e{{ p.Title }}\u003c/li\u003e\n    {% else %}\n    \u003cli\u003e\u003ca href=\"{{ p.Href }}\"\u003e{{ p.Title }}\u003c/a\u003e\u003c/li\u003e\n    {% endif %}\n  {% endif %}\n  {% endfor %}\n  \u003c/ol\u003e\n\u003c/nav\u003e\n\n# Building a CLI in Go: Part 3\n\n[Your content here]\n\n---\n\n\u003cnav class=\"series-nav\"\u003e\n  {% set series_posts = [] %}\n  {% for p in core.filter(\"published == True\") %}\n  {% if p.Extra.series == post.Extra.series %}\n  {% set _ = series_posts.append(p) %}\n  {% endif %}\n  {% endfor %}\n\n  {% if post.Extra.series_order \u003e 1 %}\n  [Previous: Part {{ post.Extra.series_order - 1 }}](#)\n  {% endif %}\n\n  {% if post.Extra.series_order \u003c series_posts|length %}\n  [Next: Part {{ post.Extra.series_order + 1 }}](#)\n  {% endif %}\n\u003c/nav\u003e\n```\n\n### Tag Cloud\n\nGenerate a tag cloud showing all tags:\n\n```markdown\n---\ntitle: \"Tags\"\njinja: true\n---\n\n# All Tags\n\n\u003cdiv class=\"tag-cloud\"\u003e\n{% set all_tags = [] %}\n{% for p in core.filter(\"published == True\") %}\n  {% for tag in p.Tags %}\n    {% if tag not in all_tags %}\n      {% set _ = all_tags.append(tag) %}\n    {% endif %}\n  {% endfor %}\n{% endfor %}\n\n{% for tag in all_tags|sort %}\n\u003ca href=\"/tags/{{ tag|slugify }}/\" class=\"tag\"\u003e{{ tag }}\u003c/a\u003e\n{% endfor %}\n\u003c/div\u003e\n```\n\n### Archive by Year\n\nCreate an archive organized by year:\n\n```markdown\n---\ntitle: \"Archive\"\njinja: true\n---\n\n# Archive\n\n{% set current_year = \"\" %}\n{% for p in core.filter(\"published == True\") %}\n{% set year = p.Date|date_format:\"2006\" %}\n{% if year != current_year %}\n{% set current_year = year %}\n\n## {{ year }}\n\n{% endif %}\n- [{{ p.Title }}]({{ p.Href }}) \u003csmall\u003e{{ p.Date|date_format:\"Jan 2\" }}\u003c/small\u003e\n{% endfor %}\n```\n\n### Posts by Category\n\nGroup posts by a custom category field:\n\n```markdown\n---\ntitle: \"All Articles\"\njinja: true\n---\n\n# All Articles\n\n## Tutorials\n\n{% for p in core.filter(\"published == True and category == 'tutorial'\") %}\n- [{{ p.Title }}]({{ p.Href }})\n{% endfor %}\n\n## Essays\n\n{% for p in core.filter(\"published == True and category == 'essay'\") %}\n- [{{ p.Title }}]({{ p.Href }})\n{% endfor %}\n\n## Reviews\n\n{% for p in core.filter(\"published == True and category == 'review'\") %}\n- [{{ p.Title }}]({{ p.Href }})\n{% endfor %}\n```\n\n### Dynamic Changelog\n\nShow recent posts as a changelog:\n\n```markdown\n---\ntitle: \"Changelog\"\njinja: true\n---\n\n# Changelog\n\n{% for p in core.filter(\"published == True and 'changelog' in tags\") %}\n## {{ p.Date|date_format:\"January 2, 2006\" }} - {{ p.Title }}\n\n{{ p.Description|default_if_none:\"\" }}\n\n[Read more]({{ p.Href }})\n\n---\n\n{% endfor %}\n```\n\n---\n\n## Tips and Troubleshooting\n\n### Escaping Jinja Syntax\n\nIf you need to show literal Jinja syntax (like in documentation), use raw blocks:\n\n```jinja2\n{% raw %}\nThis won't be processed: {{ variable }}\nNeither will this: {% for item in list %}\n{% endraw %}\n```\n\n### Debugging\n\nPrint variables to see their values:\n\n```jinja2\n\u003c!-- Debug: {{ post.Extra }} --\u003e\n\u003c!-- Tags: {{ post.Tags }} --\u003e\n\u003c!-- Post count: {{ core.Posts()|length }} --\u003e\n```\n\n### Performance Considerations\n\n- Use specific filters rather than filtering all posts in templates\n- Limit results with slicing: `[:10]` instead of processing everything\n- Consider using feeds for complex aggregations\n\n### Common Mistakes\n\n**Forgetting `jinja: true`:**\n\n```yaml\n---\ntitle: \"My Post\"\njinja: true  # Don't forget this!\n---\n```\n\n**Wrong field names:**\n\n```jinja2\n{{ post.title }}  # Wrong: lowercase\n{{ post.Title }}  # Correct: PascalCase\n```\n\n**Missing safe filter for HTML:**\n\n```jinja2\n{{ post.ArticleHTML }}        # Escaped HTML (wrong)\n{{ post.ArticleHTML|safe }}   # Raw HTML (correct)\n```\n\n**Comparing to string instead of boolean:**\n\n```jinja2\n{% if post.Published == \"true\" %}  # Wrong\n{% if post.Published %}             # Correct\n{% if post.Published == True %}     # Also correct\n```\n\n---\n\n## See Also\n\n- [[templates-guide|Templates Guide]] - Full template syntax and filters\n- [[feeds-guide|Feeds Guide]] - Configure feed collections\n- [[configuration-guide|Configuration Guide]] - Site-wide settings\n",
      "summary": "Using Jinja2 template syntax in Markdown files for dynamic content generation",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "jinja",
        "templates"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/deployment-guide/",
      "url": "https://markata.dev/docs/guides/deployment-guide/",
      "title": "Deployment Guide",
      "content_html": "\u003ch2 id=\"deployment-and-hosting-guide\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeployment and Hosting Guide\u003c/span\u003e \u003ca href=\"#deployment-and-hosting-guide\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis guide covers deploying markata-go sites to various hosting platforms, from managed services like GitHub Pages and Netlify to self-hosted solutions using nginx or Docker.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003ePrerequisites:\u003c/strong\u003e Before deploying, ensure you have:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eA working markata-go site that builds successfully (\u003ccode\u003emarkata-go build\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfiguration\u003c/a\u003e set up with your site URL\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/feeds/\"\u003eFeeds\u003c/a\u003e configured for RSS/Atom if you want syndication\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"building-for-production\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuilding for Production\u003c/span\u003e \u003ca href=\"#building-for-production\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"build-command\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Command\u003c/span\u003e \u003ca href=\"#build-command\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBuild your site for production using the \u003ccode\u003ebuild\u003c/code\u003e command:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Standard production build\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Clean build (removes output directory and build cache first)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build with verbose output\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build to a custom output directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build -o dist\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Dry run (show what would be built without writing files)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --dry-run\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"output-directory-structure\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOutput Directory Structure\u003c/span\u003e \u003ca href=\"#output-directory-structure\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAfter building, your output directory (default: \u003ccode\u003eoutput/\u003c/code\u003e) contains the complete static site:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eoutput/\n├── index.html              # Home page (from empty-slug feed)\n├── blog/\n│   ├── index.html          # Blog feed page 1\n│   ├── page/2/index.html   # Blog feed page 2\n│   ├── rss.xml             # RSS feed\n│   └── atom.xml            # Atom feed\n├── tags/\n│   ├── go/\n│   │   ├── index.html      # Tag archive\n│   │   └── rss.xml         # Tag RSS feed\n│   └── tutorial/\n│       └── index.html\n├── my-first-post/\n│   └── index.html          # Individual post\n├── about/\n│   └── index.html          # Page\n├── static/                 # Copied assets\n│   ├── css/\n│   ├── js/\n│   └── images/\n└── sitemap.xml\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"clean-builds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eClean Builds\u003c/span\u003e \u003ca href=\"#clean-builds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor production deployments, use clean builds when you want to ensure no stale output or build-cache entries remain:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo remove only the generated output manually before a normal build:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erm -rf output \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"environment-specific-builds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment-Specific Builds\u003c/span\u003e \u003ca href=\"#environment-specific-builds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse environment variables to customize builds for different environments:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Production\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Staging\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://staging.example.com markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Preview/development\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://preview-123.example.com markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"deploying-to-github-pages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeploying to GitHub Pages\u003c/span\u003e \u003ca href=\"#deploying-to-github-pages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGitHub Pages is a free hosting service for static sites directly from a GitHub repository.\u003c/p\u003e\n\u003ch3 id=\"github-actions-workflow-recommended\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGitHub Actions Workflow (Recommended)\u003c/span\u003e \u003ca href=\"#github-actions-workflow-recommended\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003e.github/workflows/deploy.yml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy to GitHub Pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eworkflow_dispatch\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epermissions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eread\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eid-token\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003econcurrency\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003egroup\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pages\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecancel-in-progress\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCheckout\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-go@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ego-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1.22\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ego install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ vars.SITE_URL || \u0026#39;https://username.github.io/repo-name\u0026#39; }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eUpload artifact\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/upload-pages-artifact@v3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e./output\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edeploy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub-pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ steps.deployment.outputs.page_url }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy to GitHub Pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeployment\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/deploy-pages@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"repository-settings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRepository Settings\u003c/span\u003e \u003ca href=\"#repository-settings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eGo to your repository\u0026rsquo;s \u003cstrong\u003eSettings\u003c/strong\u003e \u0026gt; \u003cstrong\u003ePages\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eUnder \u003cstrong\u003eSource\u003c/strong\u003e, select \u003cstrong\u003eGitHub Actions\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eThe workflow will deploy on every push to \u003ccode\u003emain\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"custom-domains\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Domains\u003c/span\u003e \u003ca href=\"#custom-domains\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTo use a custom domain with GitHub Pages:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eAdd a \u003ccode\u003eCNAME\u003c/code\u003e file to your \u003ccode\u003estatic/\u003c/code\u003e directory:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre\u003e\u003ccode\u003eexample.com\n\u003c/code\u003e\u003c/pre\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e\n\u003cp\u003eConfigure DNS at your domain registrar:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFor apex domain: Add \u003ccode\u003eA\u003c/code\u003e records pointing to GitHub\u0026rsquo;s IPs\u003c/li\u003e\n\u003cli\u003eFor subdomain: Add a \u003ccode\u003eCNAME\u003c/code\u003e record pointing to \u003ccode\u003eusername.github.io\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate your config:\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"manual-deployment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eManual Deployment\u003c/span\u003e \u003ca href=\"#manual-deployment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor manual deployment without GitHub Actions:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build the site\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Deploy using gh-pages branch\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e output\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit init\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit add -A\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit commit -m \u003cspan class=\"s2\"\u003e\u0026#34;Deploy\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit push -f git@github.com:username/repo.git main:gh-pages\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOr use the \u003ccode\u003egh-pages\u003c/code\u003e npm package:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpm install -g gh-pages\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egh-pages -d output\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"deploying-to-netlify\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeploying to Netlify\u003c/span\u003e \u003ca href=\"#deploying-to-netlify\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNetlify provides continuous deployment, serverless functions, and edge features.\u003c/p\u003e\n\u003ch3 id=\"netlify-toml-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003enetlify.toml Configuration\u003c/span\u003e \u003ca href=\"#netlify-toml-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003enetlify.toml\u003c/code\u003e in your repository root:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003ecommand\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026amp;\u0026amp; markata-go build --clean\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003epublish\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;output\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eGO_VERSION\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1.22\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eMARKATA_GO_URL\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.netlify.app\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Production context\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eproduction\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eenvironment\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eMARKATA_GO_URL\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Deploy previews\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edeploy-preview\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003ecommand\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026amp;\u0026amp; markata-go build\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edeploy-preview\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c\"\u003e# URL is set automatically by Netlify\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Branch deploys\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebranch-deploy\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003ecommand\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026amp;\u0026amp; markata-go build\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Headers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/*\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eX-Frame-Options\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;DENY\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eX-Content-Type-Options\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;nosniff\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eReferrer-Policy\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;strict-origin-when-cross-origin\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/static/*\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eCache-Control\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public, max-age=31536000, immutable\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/*.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eCache-Control\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public, max-age=0, must-revalidate\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Redirects\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eredirects\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003efrom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/old-path/*\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eto\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/new-path/:splat\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003estatus\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e301\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eredirects\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003efrom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/api/*\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eto\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://api.example.com/:splat\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003estatus\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e200\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eforce\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# SPA fallback (if needed)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# [[redirects]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e#   from = \u0026#34;/*\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e#   to = \u0026#34;/index.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e#   status = 200\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"build-settings-via-ui\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Settings via UI\u003c/span\u003e \u003ca href=\"#build-settings-via-ui\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAlternatively, configure through the Netlify dashboard:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eBase directory\u003c/strong\u003e: (leave empty or set if site is in subdirectory)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBuild command\u003c/strong\u003e: \u003ccode\u003ego install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026amp;\u0026amp; markata-go build --clean\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePublish directory\u003c/strong\u003e: \u003ccode\u003eoutput\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eEnvironment variables\u003c/strong\u003e:\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eGO_VERSION\u003c/code\u003e: \u003ccode\u003e1.22\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eMARKATA_GO_URL\u003c/code\u003e: \u003ccode\u003ehttps://your-site.netlify.app\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"deploy-via-cli\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeploy via CLI\u003c/span\u003e \u003ca href=\"#deploy-via-cli\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eInstall the Netlify CLI and deploy manually:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Install CLI\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpm install -g netlify-cli\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Login\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enetlify login\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Initialize (first time)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enetlify init\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Deploy preview\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enetlify deploy --dir\u003cspan class=\"o\"\u003e=\u003c/span\u003eoutput\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Deploy to production\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enetlify deploy --dir\u003cspan class=\"o\"\u003e=\u003c/span\u003eoutput --prod\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"deploying-to-vercel\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeploying to Vercel\u003c/span\u003e \u003ca href=\"#deploying-to-vercel\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eVercel offers zero-configuration deployments with excellent performance.\u003c/p\u003e\n\u003ch3 id=\"vercel-json-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003evercel.json Configuration\u003c/span\u003e \u003ca href=\"#vercel-json-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003evercel.json\u003c/code\u003e in your repository root:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;buildCommand\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026amp;\u0026amp; markata-go build --clean\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;outputDirectory\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;output\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;installCommand\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;echo \u0026#39;No npm dependencies\u0026#39;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;framework\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;headers\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/static/(.*)\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;headers\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;key\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Cache-Control\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public, max-age=31536000, immutable\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/(.*).html\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;headers\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;key\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Cache-Control\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public, max-age=0, must-revalidate\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;redirects\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/old-path/:path*\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;destination\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/new-path/:path*\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;permanent\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;rewrites\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/api/:path*\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;destination\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://api.example.com/:path*\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"environment-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment Variables\u003c/span\u003e \u003ca href=\"#environment-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSet environment variables in the Vercel dashboard or via CLI:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Via CLI\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evercel env add MARKATA_GO_URL production\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Enter: https://example.com\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evercel env add MARKATA_GO_URL preview\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Enter: (leave blank to use Vercel\u0026#39;s preview URL)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"deploy-via-cli-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeploy via CLI\u003c/span\u003e \u003ca href=\"#deploy-via-cli-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Install CLI\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpm install -g vercel\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Login\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evercel login\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Deploy preview\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evercel --cwd output\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Deploy to production\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evercel --cwd output --prod\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"using-vercel-json-with-go\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing vercel.json with Go\u003c/span\u003e \u003ca href=\"#using-vercel-json-with-go\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSince Vercel needs Go installed, use their Go runtime:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;build\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;env\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;GO_VERSION\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1.22\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;buildCommand\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;curl -sSL https://go.dev/dl/go1.22.0.linux-amd64.tar.gz | tar -C /usr/local -xzf - \u0026amp;\u0026amp; export PATH=$PATH:/usr/local/go/bin \u0026amp;\u0026amp; go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026amp;\u0026amp; ~/go/bin/markata-go build --clean\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;outputDirectory\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;output\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"deploying-to-cloudflare-pages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeploying to Cloudflare Pages\u003c/span\u003e \u003ca href=\"#deploying-to-cloudflare-pages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCloudflare Pages offers fast global CDN deployment with Workers integration.\u003c/p\u003e\n\u003ch3 id=\"build-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Configuration\u003c/span\u003e \u003ca href=\"#build-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConfigure via the Cloudflare dashboard:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eFramework preset\u003c/strong\u003e: None\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBuild command\u003c/strong\u003e:\n\u003cpre\u003e\u003ccode\u003ecurl -sSL https://go.dev/dl/go1.22.0.linux-amd64.tar.gz | tar -xzf - \u0026amp;\u0026amp; ./go/bin/go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026amp;\u0026amp; ~/go/bin/markata-go build --clean\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBuild output directory\u003c/strong\u003e: \u003ccode\u003eoutput\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRoot directory\u003c/strong\u003e: (leave empty)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"environment-variables-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment Variables\u003c/span\u003e \u003ca href=\"#environment-variables-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSet in the Cloudflare dashboard under \u003cstrong\u003eSettings\u003c/strong\u003e \u0026gt; \u003cstrong\u003eEnvironment variables\u003c/strong\u003e:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eProduction\u003c/th\u003e\n\u003cth\u003ePreview\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMARKATA_GO_URL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ehttps://example.com\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e(leave empty)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eGO_VERSION\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e1.22\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e1.22\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"_headers-file\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e_headers File\u003c/span\u003e \u003ca href=\"#_headers-file\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003estatic/_headers\u003c/code\u003e for custom headers (copied to output):\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e/*\n  X-Frame-Options: DENY\n  X-Content-Type-Options: nosniff\n  Referrer-Policy: strict-origin-when-cross-origin\n\n/static/*\n  Cache-Control: public, max-age=31536000, immutable\n\n/*.html\n  Cache-Control: public, max-age=0, must-revalidate\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"_redirects-file\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e_redirects File\u003c/span\u003e \u003ca href=\"#_redirects-file\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003estatic/_redirects\u003c/code\u003e for redirects:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e/old-path/* /new-path/:splat 301\n/blog/old-post /blog/new-post 301\n\n# Proxy example\n/api/* https://api.example.com/:splat 200\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"wrangler-cli-deployment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWrangler CLI Deployment\u003c/span\u003e \u003ca href=\"#wrangler-cli-deployment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Install wrangler\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpm install -g wrangler\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Login\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewrangler login\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build and deploy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewrangler pages deploy output --project-name\u003cspan class=\"o\"\u003e=\u003c/span\u003emy-site\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"self-hosting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSelf-Hosting\u003c/span\u003e \u003ca href=\"#self-hosting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"using-nginx\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing nginx\u003c/span\u003e \u003ca href=\"#using-nginx\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003enginx configuration for serving a markata-go site:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eserver\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elisten\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elisten\u003c/span\u003e \u003cspan class=\"s\"\u003e[::]:80\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eserver_name\u003c/span\u003e \u003cspan class=\"s\"\u003eexample.com\u003c/span\u003e \u003cspan class=\"s\"\u003ewww.example.com\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Redirect HTTP to HTTPS\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003ereturn\u003c/span\u003e \u003cspan class=\"mi\"\u003e301\u003c/span\u003e \u003cspan class=\"s\"\u003ehttps://\u003c/span\u003e\u003cspan class=\"nv\"\u003e$server_name$request_uri\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eserver\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elisten\u003c/span\u003e \u003cspan class=\"mi\"\u003e443\u003c/span\u003e \u003cspan class=\"s\"\u003essl\u003c/span\u003e \u003cspan class=\"s\"\u003ehttp2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elisten\u003c/span\u003e \u003cspan class=\"s\"\u003e[::]:443\u003c/span\u003e \u003cspan class=\"s\"\u003essl\u003c/span\u003e \u003cspan class=\"s\"\u003ehttp2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eserver_name\u003c/span\u003e \u003cspan class=\"s\"\u003eexample.com\u003c/span\u003e \u003cspan class=\"s\"\u003ewww.example.com\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# SSL configuration\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003essl_certificate\u003c/span\u003e \u003cspan class=\"s\"\u003e/etc/letsencrypt/live/example.com/fullchain.pem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003essl_certificate_key\u003c/span\u003e \u003cspan class=\"s\"\u003e/etc/letsencrypt/live/example.com/privkey.pem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003essl_session_timeout\u003c/span\u003e \u003cspan class=\"s\"\u003e1d\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003essl_session_cache\u003c/span\u003e \u003cspan class=\"s\"\u003eshared:SSL:50m\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003essl_protocols\u003c/span\u003e \u003cspan class=\"s\"\u003eTLSv1.2\u003c/span\u003e \u003cspan class=\"s\"\u003eTLSv1.3\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003essl_ciphers\u003c/span\u003e \u003cspan class=\"s\"\u003eECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003essl_prefer_server_ciphers\u003c/span\u003e \u003cspan class=\"no\"\u003eoff\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# HSTS\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eadd_header\u003c/span\u003e \u003cspan class=\"s\"\u003eStrict-Transport-Security\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;max-age=63072000\u0026#34;\u003c/span\u003e \u003cspan class=\"s\"\u003ealways\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Document root\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eroot\u003c/span\u003e \u003cspan class=\"s\"\u003e/var/www/example.com/output\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eindex\u003c/span\u003e \u003cspan class=\"s\"\u003eindex.html\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Security headers\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eadd_header\u003c/span\u003e \u003cspan class=\"s\"\u003eX-Frame-Options\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;DENY\u0026#34;\u003c/span\u003e \u003cspan class=\"s\"\u003ealways\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eadd_header\u003c/span\u003e \u003cspan class=\"s\"\u003eX-Content-Type-Options\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;nosniff\u0026#34;\u003c/span\u003e \u003cspan class=\"s\"\u003ealways\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eadd_header\u003c/span\u003e \u003cspan class=\"s\"\u003eReferrer-Policy\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;strict-origin-when-cross-origin\u0026#34;\u003c/span\u003e \u003cspan class=\"s\"\u003ealways\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Gzip compression\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003egzip\u003c/span\u003e \u003cspan class=\"no\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003egzip_vary\u003c/span\u003e \u003cspan class=\"no\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003egzip_proxied\u003c/span\u003e \u003cspan class=\"s\"\u003eany\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003egzip_comp_level\u003c/span\u003e \u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003egzip_types\u003c/span\u003e \u003cspan class=\"s\"\u003etext/plain\u003c/span\u003e \u003cspan class=\"s\"\u003etext/css\u003c/span\u003e \u003cspan class=\"s\"\u003etext/xml\u003c/span\u003e \u003cspan class=\"s\"\u003eapplication/json\u003c/span\u003e \u003cspan class=\"s\"\u003eapplication/javascript\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e               \u003cspan class=\"s\"\u003eapplication/rss+xml\u003c/span\u003e \u003cspan class=\"s\"\u003eapplication/atom+xml\u003c/span\u003e \u003cspan class=\"s\"\u003eimage/svg+xml\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# MIME types for txt/md files\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"p\"\u003e~\u003c/span\u003e \u003cspan class=\"sr\"\u003e\\.(txt|md)$\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003edefault_type\u003c/span\u003e \u003cspan class=\"s\"\u003etext/plain\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003echarset\u003c/span\u003e \u003cspan class=\"s\"\u003eutf-8\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Static assets caching\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"s\"\u003e/static/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eexpires\u003c/span\u003e \u003cspan class=\"s\"\u003e1y\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eadd_header\u003c/span\u003e \u003cspan class=\"s\"\u003eCache-Control\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;public,\u003c/span\u003e \u003cspan class=\"s\"\u003eimmutable\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# HTML files - no caching\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"p\"\u003e~\u003c/span\u003e\u003cspan class=\"sr\"\u003e*\u003c/span\u003e \u003cspan class=\"s\"\u003e\\.html\u003c/span\u003e$ \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eexpires\u003c/span\u003e \u003cspan class=\"s\"\u003e-1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eadd_header\u003c/span\u003e \u003cspan class=\"s\"\u003eCache-Control\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;no-store,\u003c/span\u003e \u003cspan class=\"s\"\u003eno-cache,\u003c/span\u003e \u003cspan class=\"s\"\u003emust-revalidate\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# XML feeds\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"p\"\u003e~\u003c/span\u003e\u003cspan class=\"sr\"\u003e*\u003c/span\u003e \u003cspan class=\"s\"\u003e\\.(xml|rss|atom)\u003c/span\u003e$ \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eexpires\u003c/span\u003e \u003cspan class=\"s\"\u003e1h\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eadd_header\u003c/span\u003e \u003cspan class=\"s\"\u003eCache-Control\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Try exact file first (for /robots.txt), then index.html, then directory\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# This supports reversed redirects where canonical files are at /slug.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"s\"\u003e/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003etry_files\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri/index.html\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri/\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e404\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Custom error pages\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eerror_page\u003c/span\u003e \u003cspan class=\"mi\"\u003e404\u003c/span\u003e \u003cspan class=\"s\"\u003e/404.html\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e/404.html\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003einternal\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eTesting the configuration:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Test nginx configuration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo nginx -t\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Reload nginx\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl reload nginx\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Verify txt files are served with correct MIME type\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -I https://example.com/robots.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Should show: Content-Type: text/plain; charset=utf-8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Verify HTML pages work\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -I https://example.com/blog/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Should show: Content-Type: text/html\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"using-caddy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing Caddy\u003c/span\u003e \u003ca href=\"#using-caddy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCaddy provides automatic HTTPS and simpler configuration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003eexample.com\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eroot\u003c/span\u003e \u003cspan class=\"nd\"\u003e*\u003c/span\u003e \u003cspan class=\"s\"\u003e/var/www/example.com/output\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efile_server\u003c/span\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e    # Compression\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eencode\u003c/span\u003e \u003cspan class=\"s\"\u003egzip\u003c/span\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e    # Security headers\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eheader\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eX-Frame-Options\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;DENY\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eX-Content-Type-Options\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;nosniff\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eReferrer-Policy\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;strict-origin-when-cross-origin\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eStrict-Transport-Security\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;max-age=63072000\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e    # MIME types for txt/md files\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@txtmd\u003c/span\u003e \u003cspan class=\"k\"\u003epath\u003c/span\u003e \u003cspan class=\"s\"\u003e*.txt\u003c/span\u003e \u003cspan class=\"s\"\u003e*.md\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eheader\u003c/span\u003e \u003cspan class=\"nd\"\u003e@txtmd\u003c/span\u003e \u003cspan class=\"s\"\u003eContent-Type\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;text/plain; charset=utf-8\u0026#34;\u003c/span\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e    # Static assets caching\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@static\u003c/span\u003e \u003cspan class=\"k\"\u003epath\u003c/span\u003e \u003cspan class=\"s\"\u003e/static/*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eheader\u003c/span\u003e \u003cspan class=\"nd\"\u003e@static\u003c/span\u003e \u003cspan class=\"s\"\u003eCache-Control\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public, max-age=31536000, immutable\u0026#34;\u003c/span\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e    # HTML no-cache\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nd\"\u003e@html\u003c/span\u003e \u003cspan class=\"k\"\u003epath\u003c/span\u003e \u003cspan class=\"s\"\u003e*.html\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eheader\u003c/span\u003e \u003cspan class=\"nd\"\u003e@html\u003c/span\u003e \u003cspan class=\"s\"\u003eCache-Control\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;no-cache, no-store, must-revalidate\u0026#34;\u003c/span\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e    # Try exact file first (for /robots.txt), then index.html, then directory\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003etry_files\u003c/span\u003e \u003cspan class=\"se\"\u003e{path}\u003c/span\u003e \u003cspan class=\"se\"\u003e{path}\u003c/span\u003e\u003cspan class=\"s\"\u003e/index.html\u003c/span\u003e \u003cspan class=\"se\"\u003e{path}\u003c/span\u003e\u003cspan class=\"s\"\u003e/\u003c/span\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e    # Custom 404\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ehandle_errors\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003erewrite\u003c/span\u003e \u003cspan class=\"nd\"\u003e*\u003c/span\u003e \u003cspan class=\"s\"\u003e/404.html\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003efile_server\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Redirect www to non-www\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003ewww.example.com\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eredir\u003c/span\u003e \u003cspan class=\"s\"\u003ehttps://example.com\u003c/span\u003e\u003cspan class=\"se\"\u003e{uri}\u003c/span\u003e \u003cspan class=\"s\"\u003epermanent\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eTesting the configuration:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Validate Caddyfile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecaddy validate --config /etc/caddy/Caddyfile\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Reload Caddy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl reload caddy\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Verify txt files are served correctly\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -I https://example.com/robots.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Should show: Content-Type: text/plain; charset=utf-8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"docker-deployment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocker Deployment\u003c/span\u003e \u003ca href=\"#docker-deployment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"dockerfile\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDockerfile\u003c/span\u003e \u003ca href=\"#dockerfile\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eCreate a multi-stage \u003ccode\u003eDockerfile\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Build stage\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003egolang:1.22-alpine\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eAS\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eWORKDIR\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e/build\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Install markata-go\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Copy source\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e . .\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Build site\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eARG\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eENV\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nv\"\u003e$MARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e markata-go build --clean\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Production stage\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003enginx:alpine\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Copy nginx config\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e nginx.conf /etc/nginx/conf.d/default.conf\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Copy built site\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e --from\u003cspan class=\"o\"\u003e=\u003c/span\u003ebuilder /build/output /usr/share/nginx/html\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Healthcheck\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eHEALTHCHECK\u003c/span\u003e --interval\u003cspan class=\"o\"\u003e=\u003c/span\u003e30s --timeout\u003cspan class=\"o\"\u003e=\u003c/span\u003e3s --start-period\u003cspan class=\"o\"\u003e=\u003c/span\u003e5s --retries\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    CMD wget --no-verbose --tries\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e --spider http://localhost/ \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"nb\"\u003eexit\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eEXPOSE\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e80\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eCMD\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;nginx\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;-g\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;daemon off;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"docker-nginx-conf\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocker nginx.conf\u003c/span\u003e \u003ca href=\"#docker-nginx-conf\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eCreate \u003ccode\u003enginx.conf\u003c/code\u003e for the container:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eserver\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elisten\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eserver_name\u003c/span\u003e \u003cspan class=\"s\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eroot\u003c/span\u003e \u003cspan class=\"s\"\u003e/usr/share/nginx/html\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eindex\u003c/span\u003e \u003cspan class=\"s\"\u003eindex.html\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Gzip\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003egzip\u003c/span\u003e \u003cspan class=\"no\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003egzip_vary\u003c/span\u003e \u003cspan class=\"no\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003egzip_types\u003c/span\u003e \u003cspan class=\"s\"\u003etext/plain\u003c/span\u003e \u003cspan class=\"s\"\u003etext/css\u003c/span\u003e \u003cspan class=\"s\"\u003eapplication/json\u003c/span\u003e \u003cspan class=\"s\"\u003eapplication/javascript\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e               \u003cspan class=\"s\"\u003etext/xml\u003c/span\u003e \u003cspan class=\"s\"\u003eapplication/xml\u003c/span\u003e \u003cspan class=\"s\"\u003eapplication/rss+xml\u003c/span\u003e \u003cspan class=\"s\"\u003eimage/svg+xml\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Security headers\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eadd_header\u003c/span\u003e \u003cspan class=\"s\"\u003eX-Frame-Options\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;DENY\u0026#34;\u003c/span\u003e \u003cspan class=\"s\"\u003ealways\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eadd_header\u003c/span\u003e \u003cspan class=\"s\"\u003eX-Content-Type-Options\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;nosniff\u0026#34;\u003c/span\u003e \u003cspan class=\"s\"\u003ealways\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# MIME types for txt/md files\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"p\"\u003e~\u003c/span\u003e \u003cspan class=\"sr\"\u003e\\.(txt|md)$\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003edefault_type\u003c/span\u003e \u003cspan class=\"s\"\u003etext/plain\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003echarset\u003c/span\u003e \u003cspan class=\"s\"\u003eutf-8\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Static caching\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"s\"\u003e/static/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eexpires\u003c/span\u003e \u003cspan class=\"s\"\u003e1y\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eadd_header\u003c/span\u003e \u003cspan class=\"s\"\u003eCache-Control\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;public,\u003c/span\u003e \u003cspan class=\"s\"\u003eimmutable\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Try exact file first (for /robots.txt), then index.html, then directory\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"s\"\u003e/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003etry_files\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri/index.html\u003c/span\u003e \u003cspan class=\"nv\"\u003e$uri/\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e404\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eerror_page\u003c/span\u003e \u003cspan class=\"mi\"\u003e404\u003c/span\u003e \u003cspan class=\"s\"\u003e/404.html\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"docker-compose-yml\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003edocker-compose.yml\u003c/span\u003e \u003ca href=\"#docker-compose-yml\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eFor easy deployment with Docker Compose:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;3.8\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eservices\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003esite\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eports\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;80:80\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erestart\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eunless-stopped\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehealthcheck\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003etest\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;CMD\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;wget\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;--spider\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;-q\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;http://localhost/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003einterval\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e30s\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003etimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e10s\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eretries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Optional: Caddy reverse proxy with auto-HTTPS\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecaddy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecaddy:alpine\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eports\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;80:80\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;443:443\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003evolumes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003e./Caddyfile:/etc/caddy/Caddyfile\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003ecaddy_data:/data\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003ecaddy_config:/config\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edepends_on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003esite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evolumes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecaddy_data\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecaddy_config\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"build-and-run\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild and Run\u003c/span\u003e \u003ca href=\"#build-and-run\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build image\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker build -t my-site --build-arg \u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com .\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run container\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker run -d -p 80:80 --name my-site my-site\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Or with docker-compose\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker-compose up -d\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"ci-cd-best-practices\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCI/CD Best Practices\u003c/span\u003e \u003ca href=\"#ci-cd-best-practices\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"caching-dependencies\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCaching Dependencies\u003c/span\u003e \u003ca href=\"#caching-dependencies\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"github-actions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGitHub Actions\u003c/span\u003e \u003ca href=\"#github-actions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-go@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ego-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1.22\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Caches Go modules automatically\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCache markata-go binary\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/cache@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e~/go/bin/markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go-${{ runner.os }}-${{ hashFiles(\u0026#39;go.sum\u0026#39;) }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    if [ ! -f ~/go/bin/markata-go ]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e      go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    fi\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"gitlab-ci\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGitLab CI\u003c/span\u003e \u003ca href=\"#gitlab-ci\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eGOPATH\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e$CI_PROJECT_DIR/.go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${CI_COMMIT_REF_SLUG}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003e.go/pkg/mod/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003e.go/bin/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egolang:1.22\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003ego install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eartifacts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003eoutput/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"environment-specific-builds-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment-Specific Builds\u003c/span\u003e \u003ca href=\"#environment-specific-builds-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate separate workflows or jobs for different environments:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-go@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ego-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1.22\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ego install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild (Production)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub.ref == \u0026#39;refs/heads/main\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild (Preview)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub.event_name == \u0026#39;pull_request\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://preview-${{ github.event.number }}.example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eUpload artifact\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/upload-artifact@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eoutput/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"preview-deployments\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePreview Deployments\u003c/span\u003e \u003ca href=\"#preview-deployments\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAutomatically deploy preview environments for pull requests:\u003c/p\u003e\n\u003ch4 id=\"netlify-automatic\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNetlify (automatic)\u003c/span\u003e \u003ca href=\"#netlify-automatic\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eNetlify automatically creates deploy previews for PRs.\u003c/p\u003e\n\u003ch4 id=\"vercel-automatic\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVercel (automatic)\u003c/span\u003e \u003ca href=\"#vercel-automatic\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eVercel automatically creates preview deployments for PRs.\u003c/p\u003e\n\u003ch4 id=\"github-pages-with-pr-previews\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGitHub Pages with PR Previews\u003c/span\u003e \u003ca href=\"#github-pages-with-pr-previews\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ePreview\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003etypes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003eopened, synchronize]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epreview\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epermissions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003epull-requests\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-go@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ego-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1.22\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e          markata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://username.github.io/repo/pr-${{ github.event.number }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy Preview\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epeaceiris/actions-gh-pages@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003egithub_token\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epublish_dir\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e./output\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003edestination_dir\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epr-${{ github.event.number }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eComment PR\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/github-script@v7\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            github.rest.issues.createComment({\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              issue_number: context.issue.number,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              owner: context.repo.owner,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              repo: context.repo.repo,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e              body: \u0026#39;🚀 Preview deployed to https://username.github.io/repo/pr-${{ github.event.number }}/\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e            })\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"build-validation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Validation\u003c/span\u003e \u003ca href=\"#build-validation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd validation steps before deployment:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eValidate HTML\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    npm install -g html-validate\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    html-validate \u0026#34;output/**/*.html\u0026#34; || true\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCheck for broken links\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    npm install -g linkinator\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    linkinator output --recurse --skip \u0026#34;^(?!https?://example.com)\u0026#34; || true\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eValidate feeds\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"sd\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    # Validate RSS\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    xmllint --noout output/blog/rss.xml\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    # Validate Atom\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sd\"\u003e    xmllint --noout output/blog/atom.xml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"complete-ci-cd-workflow\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComplete CI/CD Workflow\u003c/span\u003e \u003ca href=\"#complete-ci-cd-workflow\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eA full workflow with caching, validation, and deployment:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild and Deploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003epermissions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eread\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eid-token\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewrite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003econcurrency\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003egroup\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ github.workflow }}-${{ github.ref }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecancel-in-progress\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eCheckout\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003efetch-depth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# Full history for git dates\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-go@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ego-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1.22\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ego install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eValidate config\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go config validate\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild site\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build --clean -v\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ github.event_name == \u0026#39;push\u0026#39; \u0026amp;\u0026amp; \u0026#39;https://example.com\u0026#39; || \u0026#39;\u0026#39; }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eUpload artifact\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/upload-pages-artifact@v3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e./output\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edeploy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub.event_name == \u0026#39;push\u0026#39; \u0026amp;\u0026amp; github.ref == \u0026#39;refs/heads/main\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eneeds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub-pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${{ steps.deployment.outputs.page_url }}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy to GitHub Pages\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edeployment\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/deploy-pages@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"troubleshooting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTroubleshooting\u003c/span\u003e \u003ca href=\"#troubleshooting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"common-issues\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Issues\u003c/span\u003e \u003ca href=\"#common-issues\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eBuild fails with \u0026ldquo;command not found\u0026rdquo;\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eEnsure Go is in your PATH and markata-go is installed:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003ePATH\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nv\"\u003e$PATH\u003c/span\u003e:\u003cspan class=\"k\"\u003e$(\u003c/span\u003ego env GOPATH\u003cspan class=\"k\"\u003e)\u003c/span\u003e/bin\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eAssets not loading\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCheck that your \u003ccode\u003eurl\u003c/code\u003e config matches your deployment URL:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Must match actual deployment URL\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eRSS/Atom feeds show wrong URLs\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eThe base URL must be set correctly for feeds to work:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e404 errors on page refresh\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eEnsure your server is configured to serve \u003ccode\u003eindex.html\u003c/code\u003e for directory requests. All hosting platforms in this guide handle this automatically.\u003c/p\u003e\n\u003ch3 id=\"debugging-deployments\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDebugging Deployments\u003c/span\u003e \u003ca href=\"#debugging-deployments\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse verbose mode to debug build issues:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCheck the resolved configuration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config show --sources\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eValidate before deploying:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config validate\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext Steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCongratulations on deploying your site! Here are ways to enhance it further:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eShare your content:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/syndication/\"\u003eSyndication Guide\u003c/a\u003e - Automatically share posts to Mastodon, Twitter, and other platforms\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eAdd interactivity:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/search/\"\u003eSearch Guide\u003c/a\u003e - Add client-side search to your site\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/dynamic-content/\"\u003eDynamic Content Guide\u003c/a\u003e - Integrate with JavaScript frameworks\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eExtend functionality:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/plugin-development/\"\u003ePlugin Development Guide\u003c/a\u003e - Create custom plugins for advanced features\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfiguration Guide\u003c/a\u003e - Full configuration reference\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/feeds/\"\u003eFeeds Guide\u003c/a\u003e - RSS, Atom, and JSON feed configuration\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/troubleshooting/\"\u003eTroubleshooting\u003c/a\u003e - Common issues and solutions\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/quick-reference/\"\u003eQuick Reference\u003c/a\u003e - CLI commands and config snippets\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n## Deployment and Hosting Guide\n\nThis guide covers deploying markata-go sites to various hosting platforms, from managed services like GitHub Pages and Netlify to self-hosted solutions using nginx or Docker.\n\n\u003e **Prerequisites:** Before deploying, ensure you have:\n\u003e - A working markata-go site that builds successfully (`markata-go build`)\n\u003e - [Configuration](/docs/guides/configuration/) set up with your site URL\n\u003e - [Feeds](/docs/guides/feeds/) configured for RSS/Atom if you want syndication\n\n## Building for Production\n\n### Build Command\n\nBuild your site for production using the `build` command:\n\n```bash\n# Standard production build\nmarkata-go build\n\n# Clean build (removes output directory and build cache first)\nmarkata-go build --clean\n\n# Build with verbose output\nmarkata-go build -v\n\n# Build to a custom output directory\nmarkata-go build -o dist\n\n# Dry run (show what would be built without writing files)\nmarkata-go build --dry-run\n```\n\n### Output Directory Structure\n\nAfter building, your output directory (default: `output/`) contains the complete static site:\n\n```\noutput/\n├── index.html              # Home page (from empty-slug feed)\n├── blog/\n│   ├── index.html          # Blog feed page 1\n│   ├── page/2/index.html   # Blog feed page 2\n│   ├── rss.xml             # RSS feed\n│   └── atom.xml            # Atom feed\n├── tags/\n│   ├── go/\n│   │   ├── index.html      # Tag archive\n│   │   └── rss.xml         # Tag RSS feed\n│   └── tutorial/\n│       └── index.html\n├── my-first-post/\n│   └── index.html          # Individual post\n├── about/\n│   └── index.html          # Page\n├── static/                 # Copied assets\n│   ├── css/\n│   ├── js/\n│   └── images/\n└── sitemap.xml\n```\n\n### Clean Builds\n\nFor production deployments, use clean builds when you want to ensure no stale output or build-cache entries remain:\n\n```bash\nmarkata-go build --clean\n```\n\nTo remove only the generated output manually before a normal build:\n\n```bash\nrm -rf output \u0026\u0026 markata-go build\n```\n\n### Environment-Specific Builds\n\nUse environment variables to customize builds for different environments:\n\n```bash\n# Production\nMARKATA_GO_URL=https://example.com markata-go build\n\n# Staging\nMARKATA_GO_URL=https://staging.example.com markata-go build\n\n# Preview/development\nMARKATA_GO_URL=https://preview-123.example.com markata-go build\n```\n\n---\n\n## Deploying to GitHub Pages\n\nGitHub Pages is a free hosting service for static sites directly from a GitHub repository.\n\n### GitHub Actions Workflow (Recommended)\n\nCreate `.github/workflows/deploy.yml`:\n\n```yaml\nname: Deploy to GitHub Pages\n\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch:\n\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\nconcurrency:\n  group: \"pages\"\n  cancel-in-progress: false\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Setup Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: '1.22'\n          cache: true\n\n      - name: Install markata-go\n        run: go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\n      - name: Build site\n        run: markata-go build --clean\n        env:\n          MARKATA_GO_URL: ${{ vars.SITE_URL || 'https://username.github.io/repo-name' }}\n\n      - name: Upload artifact\n        uses: actions/upload-pages-artifact@v3\n        with:\n          path: ./output\n\n  deploy:\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    runs-on: ubuntu-latest\n    needs: build\n    steps:\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v4\n```\n\n### Repository Settings\n\n1. Go to your repository's **Settings** \u003e **Pages**\n2. Under **Source**, select **GitHub Actions**\n3. The workflow will deploy on every push to `main`\n\n### Custom Domains\n\nTo use a custom domain with GitHub Pages:\n\n1. Add a `CNAME` file to your `static/` directory:\n\n```\nexample.com\n```\n\n2. Configure DNS at your domain registrar:\n   - For apex domain: Add `A` records pointing to GitHub's IPs\n   - For subdomain: Add a `CNAME` record pointing to `username.github.io`\n\n3. Update your config:\n\n```toml\n[markata-go]\nurl = \"https://example.com\"\n```\n\n### Manual Deployment\n\nFor manual deployment without GitHub Actions:\n\n```bash\n# Build the site\nmarkata-go build --clean\n\n# Deploy using gh-pages branch\ncd output\ngit init\ngit add -A\ngit commit -m \"Deploy\"\ngit push -f git@github.com:username/repo.git main:gh-pages\n```\n\nOr use the `gh-pages` npm package:\n\n```bash\nnpm install -g gh-pages\nmarkata-go build --clean\ngh-pages -d output\n```\n\n---\n\n## Deploying to Netlify\n\nNetlify provides continuous deployment, serverless functions, and edge features.\n\n### netlify.toml Configuration\n\nCreate `netlify.toml` in your repository root:\n\n```toml\n[build]\n  command = \"go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026\u0026 markata-go build --clean\"\n  publish = \"output\"\n\n[build.environment]\n  GO_VERSION = \"1.22\"\n  MARKATA_GO_URL = \"https://example.netlify.app\"\n\n# Production context\n[context.production]\n  environment = { MARKATA_GO_URL = \"https://example.com\" }\n\n# Deploy previews\n[context.deploy-preview]\n  command = \"go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026\u0026 markata-go build\"\n\n[context.deploy-preview.environment]\n  # URL is set automatically by Netlify\n\n# Branch deploys\n[context.branch-deploy]\n  command = \"go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026\u0026 markata-go build\"\n\n# Headers\n[[headers]]\n  for = \"/*\"\n  [headers.values]\n    X-Frame-Options = \"DENY\"\n    X-Content-Type-Options = \"nosniff\"\n    Referrer-Policy = \"strict-origin-when-cross-origin\"\n\n[[headers]]\n  for = \"/static/*\"\n  [headers.values]\n    Cache-Control = \"public, max-age=31536000, immutable\"\n\n[[headers]]\n  for = \"/*.html\"\n  [headers.values]\n    Cache-Control = \"public, max-age=0, must-revalidate\"\n\n# Redirects\n[[redirects]]\n  from = \"/old-path/*\"\n  to = \"/new-path/:splat\"\n  status = 301\n\n[[redirects]]\n  from = \"/api/*\"\n  to = \"https://api.example.com/:splat\"\n  status = 200\n  force = true\n\n# SPA fallback (if needed)\n# [[redirects]]\n#   from = \"/*\"\n#   to = \"/index.html\"\n#   status = 200\n```\n\n### Build Settings via UI\n\nAlternatively, configure through the Netlify dashboard:\n\n1. **Base directory**: (leave empty or set if site is in subdirectory)\n2. **Build command**: `go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026\u0026 markata-go build --clean`\n3. **Publish directory**: `output`\n4. **Environment variables**:\n   - `GO_VERSION`: `1.22`\n   - `MARKATA_GO_URL`: `https://your-site.netlify.app`\n\n### Deploy via CLI\n\nInstall the Netlify CLI and deploy manually:\n\n```bash\n# Install CLI\nnpm install -g netlify-cli\n\n# Login\nnetlify login\n\n# Initialize (first time)\nnetlify init\n\n# Deploy preview\nmarkata-go build --clean\nnetlify deploy --dir=output\n\n# Deploy to production\nnetlify deploy --dir=output --prod\n```\n\n---\n\n## Deploying to Vercel\n\nVercel offers zero-configuration deployments with excellent performance.\n\n### vercel.json Configuration\n\nCreate `vercel.json` in your repository root:\n\n```json\n{\n  \"buildCommand\": \"go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026\u0026 markata-go build --clean\",\n  \"outputDirectory\": \"output\",\n  \"installCommand\": \"echo 'No npm dependencies'\",\n  \"framework\": null,\n  \"headers\": [\n    {\n      \"source\": \"/static/(.*)\",\n      \"headers\": [\n        {\n          \"key\": \"Cache-Control\",\n          \"value\": \"public, max-age=31536000, immutable\"\n        }\n      ]\n    },\n    {\n      \"source\": \"/(.*).html\",\n      \"headers\": [\n        {\n          \"key\": \"Cache-Control\",\n          \"value\": \"public, max-age=0, must-revalidate\"\n        }\n      ]\n    }\n  ],\n  \"redirects\": [\n    {\n      \"source\": \"/old-path/:path*\",\n      \"destination\": \"/new-path/:path*\",\n      \"permanent\": true\n    }\n  ],\n  \"rewrites\": [\n    {\n      \"source\": \"/api/:path*\",\n      \"destination\": \"https://api.example.com/:path*\"\n    }\n  ]\n}\n```\n\n### Environment Variables\n\nSet environment variables in the Vercel dashboard or via CLI:\n\n```bash\n# Via CLI\nvercel env add MARKATA_GO_URL production\n# Enter: https://example.com\n\nvercel env add MARKATA_GO_URL preview\n# Enter: (leave blank to use Vercel's preview URL)\n```\n\n### Deploy via CLI\n\n```bash\n# Install CLI\nnpm install -g vercel\n\n# Login\nvercel login\n\n# Deploy preview\nmarkata-go build --clean\nvercel --cwd output\n\n# Deploy to production\nvercel --cwd output --prod\n```\n\n### Using vercel.json with Go\n\nSince Vercel needs Go installed, use their Go runtime:\n\n```json\n{\n  \"build\": {\n    \"env\": {\n      \"GO_VERSION\": \"1.22\"\n    }\n  },\n  \"buildCommand\": \"curl -sSL https://go.dev/dl/go1.22.0.linux-amd64.tar.gz | tar -C /usr/local -xzf - \u0026\u0026 export PATH=$PATH:/usr/local/go/bin \u0026\u0026 go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026\u0026 ~/go/bin/markata-go build --clean\",\n  \"outputDirectory\": \"output\"\n}\n```\n\n---\n\n## Deploying to Cloudflare Pages\n\nCloudflare Pages offers fast global CDN deployment with Workers integration.\n\n### Build Configuration\n\nConfigure via the Cloudflare dashboard:\n\n1. **Framework preset**: None\n2. **Build command**:\n   ```\n   curl -sSL https://go.dev/dl/go1.22.0.linux-amd64.tar.gz | tar -xzf - \u0026\u0026 ./go/bin/go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest \u0026\u0026 ~/go/bin/markata-go build --clean\n   ```\n3. **Build output directory**: `output`\n4. **Root directory**: (leave empty)\n\n### Environment Variables\n\nSet in the Cloudflare dashboard under **Settings** \u003e **Environment variables**:\n\n| Variable | Production | Preview |\n|----------|------------|---------|\n| `MARKATA_GO_URL` | `https://example.com` | (leave empty) |\n| `GO_VERSION` | `1.22` | `1.22` |\n\n### _headers File\n\nCreate `static/_headers` for custom headers (copied to output):\n\n```\n/*\n  X-Frame-Options: DENY\n  X-Content-Type-Options: nosniff\n  Referrer-Policy: strict-origin-when-cross-origin\n\n/static/*\n  Cache-Control: public, max-age=31536000, immutable\n\n/*.html\n  Cache-Control: public, max-age=0, must-revalidate\n```\n\n### _redirects File\n\nCreate `static/_redirects` for redirects:\n\n```\n/old-path/* /new-path/:splat 301\n/blog/old-post /blog/new-post 301\n\n# Proxy example\n/api/* https://api.example.com/:splat 200\n```\n\n### Wrangler CLI Deployment\n\n```bash\n# Install wrangler\nnpm install -g wrangler\n\n# Login\nwrangler login\n\n# Build and deploy\nmarkata-go build --clean\nwrangler pages deploy output --project-name=my-site\n```\n\n---\n\n## Self-Hosting\n\n### Using nginx\n\nnginx configuration for serving a markata-go site:\n\n```nginx\nserver {\n    listen 80;\n    listen [::]:80;\n    server_name example.com www.example.com;\n\n    # Redirect HTTP to HTTPS\n    return 301 https://$server_name$request_uri;\n}\n\nserver {\n    listen 443 ssl http2;\n    listen [::]:443 ssl http2;\n    server_name example.com www.example.com;\n\n    # SSL configuration\n    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;\n    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;\n    ssl_session_timeout 1d;\n    ssl_session_cache shared:SSL:50m;\n    ssl_protocols TLSv1.2 TLSv1.3;\n    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;\n    ssl_prefer_server_ciphers off;\n\n    # HSTS\n    add_header Strict-Transport-Security \"max-age=63072000\" always;\n\n    # Document root\n    root /var/www/example.com/output;\n    index index.html;\n\n    # Security headers\n    add_header X-Frame-Options \"DENY\" always;\n    add_header X-Content-Type-Options \"nosniff\" always;\n    add_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\n\n    # Gzip compression\n    gzip on;\n    gzip_vary on;\n    gzip_proxied any;\n    gzip_comp_level 6;\n    gzip_types text/plain text/css text/xml application/json application/javascript\n               application/rss+xml application/atom+xml image/svg+xml;\n\n    # MIME types for txt/md files\n    location ~ \\.(txt|md)$ {\n        default_type text/plain;\n        charset utf-8;\n    }\n\n    # Static assets caching\n    location /static/ {\n        expires 1y;\n        add_header Cache-Control \"public, immutable\";\n    }\n\n    # HTML files - no caching\n    location ~* \\.html$ {\n        expires -1;\n        add_header Cache-Control \"no-store, no-cache, must-revalidate\";\n    }\n\n    # XML feeds\n    location ~* \\.(xml|rss|atom)$ {\n        expires 1h;\n        add_header Cache-Control \"public\";\n    }\n\n    # Try exact file first (for /robots.txt), then index.html, then directory\n    # This supports reversed redirects where canonical files are at /slug.txt\n    location / {\n        try_files $uri $uri/index.html $uri/ =404;\n    }\n\n    # Custom error pages\n    error_page 404 /404.html;\n    location = /404.html {\n        internal;\n    }\n}\n```\n\n**Testing the configuration:**\n\n```bash\n# Test nginx configuration\nsudo nginx -t\n\n# Reload nginx\nsudo systemctl reload nginx\n\n# Verify txt files are served with correct MIME type\ncurl -I https://example.com/robots.txt\n# Should show: Content-Type: text/plain; charset=utf-8\n\n# Verify HTML pages work\ncurl -I https://example.com/blog/\n# Should show: Content-Type: text/html\n```\n\n### Using Caddy\n\nCaddy provides automatic HTTPS and simpler configuration:\n\n```caddyfile\nexample.com {\n    root * /var/www/example.com/output\n    file_server\n\n    # Compression\n    encode gzip\n\n    # Security headers\n    header {\n        X-Frame-Options \"DENY\"\n        X-Content-Type-Options \"nosniff\"\n        Referrer-Policy \"strict-origin-when-cross-origin\"\n        Strict-Transport-Security \"max-age=63072000\"\n    }\n\n    # MIME types for txt/md files\n    @txtmd path *.txt *.md\n    header @txtmd Content-Type \"text/plain; charset=utf-8\"\n\n    # Static assets caching\n    @static path /static/*\n    header @static Cache-Control \"public, max-age=31536000, immutable\"\n\n    # HTML no-cache\n    @html path *.html\n    header @html Cache-Control \"no-cache, no-store, must-revalidate\"\n\n    # Try exact file first (for /robots.txt), then index.html, then directory\n    try_files {path} {path}/index.html {path}/\n\n    # Custom 404\n    handle_errors {\n        rewrite * /404.html\n        file_server\n    }\n}\n\n# Redirect www to non-www\nwww.example.com {\n    redir https://example.com{uri} permanent\n}\n```\n\n**Testing the configuration:**\n\n```bash\n# Validate Caddyfile\ncaddy validate --config /etc/caddy/Caddyfile\n\n# Reload Caddy\nsudo systemctl reload caddy\n\n# Verify txt files are served correctly\ncurl -I https://example.com/robots.txt\n# Should show: Content-Type: text/plain; charset=utf-8\n```\n\n### Docker Deployment\n\n#### Dockerfile\n\nCreate a multi-stage `Dockerfile`:\n\n```dockerfile\n# Build stage\nFROM golang:1.22-alpine AS builder\n\nWORKDIR /build\n\n# Install markata-go\nRUN go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\n# Copy source\nCOPY . .\n\n# Build site\nARG MARKATA_GO_URL=https://example.com\nENV MARKATA_GO_URL=$MARKATA_GO_URL\n\nRUN markata-go build --clean\n\n# Production stage\nFROM nginx:alpine\n\n# Copy nginx config\nCOPY nginx.conf /etc/nginx/conf.d/default.conf\n\n# Copy built site\nCOPY --from=builder /build/output /usr/share/nginx/html\n\n# Healthcheck\nHEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \\\n    CMD wget --no-verbose --tries=1 --spider http://localhost/ || exit 1\n\nEXPOSE 80\n\nCMD [\"nginx\", \"-g\", \"daemon off;\"]\n```\n\n#### Docker nginx.conf\n\nCreate `nginx.conf` for the container:\n\n```nginx\nserver {\n    listen 80;\n    server_name _;\n\n    root /usr/share/nginx/html;\n    index index.html;\n\n    # Gzip\n    gzip on;\n    gzip_vary on;\n    gzip_types text/plain text/css application/json application/javascript\n               text/xml application/xml application/rss+xml image/svg+xml;\n\n    # Security headers\n    add_header X-Frame-Options \"DENY\" always;\n    add_header X-Content-Type-Options \"nosniff\" always;\n\n    # MIME types for txt/md files\n    location ~ \\.(txt|md)$ {\n        default_type text/plain;\n        charset utf-8;\n    }\n\n    # Static caching\n    location /static/ {\n        expires 1y;\n        add_header Cache-Control \"public, immutable\";\n    }\n\n    # Try exact file first (for /robots.txt), then index.html, then directory\n    location / {\n        try_files $uri $uri/index.html $uri/ =404;\n    }\n\n    error_page 404 /404.html;\n}\n```\n\n#### docker-compose.yml\n\nFor easy deployment with Docker Compose:\n\n```yaml\nversion: '3.8'\n\nservices:\n  site:\n    build:\n      context: .\n      args:\n        MARKATA_GO_URL: https://example.com\n    ports:\n      - \"80:80\"\n    restart: unless-stopped\n    healthcheck:\n      test: [\"CMD\", \"wget\", \"--spider\", \"-q\", \"http://localhost/\"]\n      interval: 30s\n      timeout: 10s\n      retries: 3\n\n  # Optional: Caddy reverse proxy with auto-HTTPS\n  caddy:\n    image: caddy:alpine\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n    volumes:\n      - ./Caddyfile:/etc/caddy/Caddyfile\n      - caddy_data:/data\n      - caddy_config:/config\n    depends_on:\n      - site\n\nvolumes:\n  caddy_data:\n  caddy_config:\n```\n\n#### Build and Run\n\n```bash\n# Build image\ndocker build -t my-site --build-arg MARKATA_GO_URL=https://example.com .\n\n# Run container\ndocker run -d -p 80:80 --name my-site my-site\n\n# Or with docker-compose\ndocker-compose up -d\n```\n\n---\n\n## CI/CD Best Practices\n\n### Caching Dependencies\n\n#### GitHub Actions\n\n```yaml\n- name: Setup Go\n  uses: actions/setup-go@v5\n  with:\n    go-version: '1.22'\n    cache: true  # Caches Go modules automatically\n\n- name: Cache markata-go binary\n  uses: actions/cache@v4\n  with:\n    path: ~/go/bin/markata-go\n    key: markata-go-${{ runner.os }}-${{ hashFiles('go.sum') }}\n\n- name: Install markata-go\n  run: |\n    if [ ! -f ~/go/bin/markata-go ]; then\n      go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n    fi\n```\n\n#### GitLab CI\n\n```yaml\nvariables:\n  GOPATH: $CI_PROJECT_DIR/.go\n\ncache:\n  key: ${CI_COMMIT_REF_SLUG}\n  paths:\n    - .go/pkg/mod/\n    - .go/bin/\n\nbuild:\n  image: golang:1.22\n  script:\n    - go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n    - markata-go build --clean\n  artifacts:\n    paths:\n      - output/\n```\n\n### Environment-Specific Builds\n\nCreate separate workflows or jobs for different environments:\n\n```yaml\nname: Deploy\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Setup Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: '1.22'\n          cache: true\n\n      - name: Install markata-go\n        run: go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\n      - name: Build (Production)\n        if: github.ref == 'refs/heads/main'\n        run: markata-go build --clean\n        env:\n          MARKATA_GO_URL: https://example.com\n\n      - name: Build (Preview)\n        if: github.event_name == 'pull_request'\n        run: markata-go build --clean\n        env:\n          MARKATA_GO_URL: https://preview-${{ github.event.number }}.example.com\n\n      - name: Upload artifact\n        uses: actions/upload-artifact@v4\n        with:\n          name: site\n          path: output/\n```\n\n### Preview Deployments\n\nAutomatically deploy preview environments for pull requests:\n\n#### Netlify (automatic)\n\nNetlify automatically creates deploy previews for PRs.\n\n#### Vercel (automatic)\n\nVercel automatically creates preview deployments for PRs.\n\n#### GitHub Pages with PR Previews\n\n```yaml\nname: Preview\n\non:\n  pull_request:\n    types: [opened, synchronize]\n\njobs:\n  preview:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Setup Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: '1.22'\n          cache: true\n\n      - name: Build\n        run: |\n          go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n          markata-go build --clean\n        env:\n          MARKATA_GO_URL: https://username.github.io/repo/pr-${{ github.event.number }}\n\n      - name: Deploy Preview\n        uses: peaceiris/actions-gh-pages@v4\n        with:\n          github_token: ${{ secrets.GITHUB_TOKEN }}\n          publish_dir: ./output\n          destination_dir: pr-${{ github.event.number }}\n\n      - name: Comment PR\n        uses: actions/github-script@v7\n        with:\n          script: |\n            github.rest.issues.createComment({\n              issue_number: context.issue.number,\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              body: '🚀 Preview deployed to https://username.github.io/repo/pr-${{ github.event.number }}/'\n            })\n```\n\n### Build Validation\n\nAdd validation steps before deployment:\n\n```yaml\n- name: Build site\n  run: markata-go build --clean\n\n- name: Validate HTML\n  run: |\n    npm install -g html-validate\n    html-validate \"output/**/*.html\" || true\n\n- name: Check for broken links\n  run: |\n    npm install -g linkinator\n    linkinator output --recurse --skip \"^(?!https?://example.com)\" || true\n\n- name: Validate feeds\n  run: |\n    # Validate RSS\n    xmllint --noout output/blog/rss.xml\n    # Validate Atom\n    xmllint --noout output/blog/atom.xml\n```\n\n### Complete CI/CD Workflow\n\nA full workflow with caching, validation, and deployment:\n\n```yaml\nname: Build and Deploy\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0  # Full history for git dates\n\n      - name: Setup Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: '1.22'\n          cache: true\n\n      - name: Install markata-go\n        run: go install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\n      - name: Validate config\n        run: markata-go config validate\n\n      - name: Build site\n        run: markata-go build --clean -v\n        env:\n          MARKATA_GO_URL: ${{ github.event_name == 'push' \u0026\u0026 'https://example.com' || '' }}\n\n      - name: Upload artifact\n        uses: actions/upload-pages-artifact@v3\n        with:\n          path: ./output\n\n  deploy:\n    if: github.event_name == 'push' \u0026\u0026 github.ref == 'refs/heads/main'\n    needs: build\n    runs-on: ubuntu-latest\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    steps:\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v4\n```\n\n---\n\n## Troubleshooting\n\n### Common Issues\n\n**Build fails with \"command not found\"**\n\nEnsure Go is in your PATH and markata-go is installed:\n\n```bash\nexport PATH=$PATH:$(go env GOPATH)/bin\ngo install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n```\n\n**Assets not loading**\n\nCheck that your `url` config matches your deployment URL:\n\n```toml\n[markata-go]\nurl = \"https://example.com\"  # Must match actual deployment URL\n```\n\n**RSS/Atom feeds show wrong URLs**\n\nThe base URL must be set correctly for feeds to work:\n\n```bash\nMARKATA_GO_URL=https://example.com markata-go build\n```\n\n**404 errors on page refresh**\n\nEnsure your server is configured to serve `index.html` for directory requests. All hosting platforms in this guide handle this automatically.\n\n### Debugging Deployments\n\nUse verbose mode to debug build issues:\n\n```bash\nmarkata-go build --clean -v\n```\n\nCheck the resolved configuration:\n\n```bash\nmarkata-go config show --sources\n```\n\nValidate before deploying:\n\n```bash\nmarkata-go config validate\n```\n\n---\n\n## Next Steps\n\nCongratulations on deploying your site! Here are ways to enhance it further:\n\n**Share your content:**\n- [Syndication Guide](/docs/guides/syndication/) - Automatically share posts to Mastodon, Twitter, and other platforms\n\n**Add interactivity:**\n- [Search Guide](/docs/guides/search/) - Add client-side search to your site\n- [Dynamic Content Guide](/docs/guides/dynamic-content/) - Integrate with JavaScript frameworks\n\n**Extend functionality:**\n- [Plugin Development Guide](/docs/guides/plugin-development/) - Create custom plugins for advanced features\n\n---\n\n## See Also\n\n- [Configuration Guide](/docs/guides/configuration/) - Full configuration reference\n- [Feeds Guide](/docs/guides/feeds/) - RSS, Atom, and JSON feed configuration\n- [Troubleshooting](/docs/troubleshooting/) - Common issues and solutions\n- [Quick Reference](/docs/guides/quick-reference/) - CLI commands and config snippets\n",
      "summary": "Guide to deploying markata-go sites to GitHub Pages, Netlify, Vercel, and self-hosted solutions",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "deployment",
        "hosting"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/blogroll/",
      "url": "https://markata.dev/docs/guides/blogroll/",
      "title": "Blogroll \u0026 Reader Guide",
      "content_html": "\u003ch2 id=\"blogroll-reader\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBlogroll \u0026amp; Reader\u003c/span\u003e \u003ca href=\"#blogroll-reader\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe blogroll plugin lets you curate a list of blogs you follow and automatically fetch their RSS/Atom feeds to create:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003e/blogroll/\u003c/code\u003e\u003c/strong\u003e - A directory of blogs you follow, organized by category\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003e/reader/\u003c/code\u003e\u003c/strong\u003e - A river-of-news style page showing latest posts from all feeds\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThis is perfect for sharing your reading list, building community connections, or creating a personal feed reader built into your site.\u003c/p\u003e\n\u003ch2 id=\"quick-start\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Start\u003c/span\u003e \u003ca href=\"#quick-start\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd this to your \u003ccode\u003emarkata-go.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://simonwillison.net/atom/everything/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Simon Willison\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecategory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Technology\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRun \u003ccode\u003emarkata-go build\u003c/code\u003e and you\u0026rsquo;ll have:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/blogroll/\u003c/code\u003e - Lists Simon Willison\u0026rsquo;s blog\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/reader/\u003c/code\u003e - Shows his latest posts\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"manage-subscriptions-in-your-browser\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eManage subscriptions in your browser\u003c/span\u003e \u003ca href=\"#manage-subscriptions-in-your-browser\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eStart the local development server with \u003ccode\u003emarkata-go serve\u003c/code\u003e, then open\n\u003ca href=\"http://localhost:8000/_markata/subscriptions\"\u003e\u003ccode\u003e/_markata/subscriptions\u003c/code\u003e\u003c/a\u003e.\nThe Serve Control Center and local preview pages also link to this editor.\nPaste a public website URL and select \u003cstrong\u003eFind feed\u003c/strong\u003e to discover its advertised\nRSS/Atom/JSON Feed; review its title, category, type and tags, then subscribe.\nYou can search, edit or remove existing subscriptions without editing TOML.\u003c/p\u003e\n\u003cp\u003eThe editor writes only the \u003cstrong\u003eeffective owning TOML config file\u003c/strong\u003e, including\nwhen blogroll subscriptions live in an included config. It preserves other\nsections and comments. When a later included/merge config replaces the feed\nlist, the editor never silently writes to a shadowed earlier file. Global\nconfigs, merge overrides and non-TOML owners are read-only; edit those source\nfiles directly. The editor is only served to local loopback sessions, not\nincluded in production site output.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"basic-settings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Settings\u003c/span\u003e \u003ca href=\"#basic-settings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                    \u003cspan class=\"c\"\u003e# Enable the blogroll plugin\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cache/blogroll\u0026#34;\u003c/span\u003e      \u003cspan class=\"c\"\u003e# Where to cache fetched feeds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_duration\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;24h\u0026#34;\u003c/span\u003e            \u003cspan class=\"c\"\u003e# How long to cache (default: 24 hours)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etimeout\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e30\u003c/span\u003e                      \u003cspan class=\"c\"\u003e# HTTP request timeout in seconds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econcurrent_requests\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e           \u003cspan class=\"c\"\u003e# Max parallel feed fetches\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_entries_per_feed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\u003c/span\u003e         \u003cspan class=\"c\"\u003e# Global default entries per feed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"pagination-settings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePagination Settings\u003c/span\u003e \u003ca href=\"#pagination-settings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe reader page supports pagination to handle large numbers of entries:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\u003c/span\u003e               \u003cspan class=\"c\"\u003e# Entries per page (default: 50)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eorphan_threshold\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Min entries for separate page (default: 3)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epagination_type\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;manual\u0026#34;\u003c/span\u003e        \u003cspan class=\"c\"\u003e# \u0026#34;manual\u0026#34;, \u0026#34;htmx\u0026#34;, or \u0026#34;js\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePagination Types:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emanual\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTraditional page links with full page reloads\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehtmx\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSeamless AJAX-based navigation using HTMX\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ejs\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eClient-side JavaScript pagination\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe paginated reader generates:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e/reader/              # Page 1\n/reader/page/2/       # Page 2\n/reader/page/3/       # Page 3\n/reader/page/2/partial/   # HTMX partial for page 2\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"adding-feeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdding Feeds\u003c/span\u003e \u003ca href=\"#adding-feeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd feeds using the \u003ccode\u003e[[markata-go.blogroll.feeds]]\u003c/code\u003e array:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/feed.xml\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Required: RSS/Atom feed URL\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Example Blog\u0026#34;\u003c/span\u003e                   \u003cspan class=\"c\"\u003e# Optional: display name (auto-fetched if not set)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;A great blog about stuff\u0026#34;\u003c/span\u003e \u003cspan class=\"c\"\u003e# Optional: short description\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecategory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Technology\u0026#34;\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# Optional: groups feeds on blogroll page\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;written\u0026#34;\u003c/span\u003e                         \u003cspan class=\"c\"\u003e# Optional: written, video, or podcast\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;python\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;web\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# Optional: additional labels\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esite_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e         \u003cspan class=\"c\"\u003e# Optional: main website URL\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eimage_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/logo.png\u0026#34;\u003c/span\u003e \u003cspan class=\"c\"\u003e# Optional: logo/icon\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eactive\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e                            \u003cspan class=\"c\"\u003e# Optional: set false to disable without removing\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_entries\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\u003c/span\u003e                         \u003cspan class=\"c\"\u003e# Optional: override global max_entries_per_feed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003emarkata-go blogroll add \u0026lt;feed-url\u0026gt;\u003c/code\u003e now uses site metadata for the suggested title, description, and tags shown in the prompt. This works better for sources like YouTube, where the feed itself often lacks useful channel-level description and tag metadata.\u003c/p\u003e\n\u003cp\u003eIf your site composes multiple config files with \u003ccode\u003emarkata-go.include\u003c/code\u003e, \u003ccode\u003emarkata-go blogroll add\u003c/code\u003e tries to append the new feed to the file that already contains the blogroll section instead of rewriting the root config file.\u003c/p\u003e\n\u003cp\u003eYou can also pass common YouTube channel inputs and let markata-go resolve them to the underlying channel feed automatically:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go blogroll add yt:devtoolsfm\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go blogroll add https://www.youtube.com/@devtoolsfm\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go blogroll add https://www.youtube.com/watch?v\u003cspan class=\"o\"\u003e=\u003c/span\u003eaEkpFeJoKvk\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor a single YouTube video URL, markata-go resolves the owning channel and subscribes to that channel\u0026rsquo;s feed.\u003c/p\u003e\n\u003ch3 id=\"per-feed-entry-limits\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePer-Feed Entry Limits\u003c/span\u003e \u003ca href=\"#per-feed-entry-limits\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOverride the global \u003ccode\u003emax_entries_per_feed\u003c/code\u003e for individual feeds:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_entries_per_feed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\u003c/span\u003e         \u003cspan class=\"c\"\u003e# Global default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://prolific-blogger.com/feed.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Prolific Blogger\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_entries\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# Override: this site posts frequently\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://micro.blog/user.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Micro Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_entries\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e200\u003c/span\u003e                 \u003cspan class=\"c\"\u003e# Override: many small posts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://infrequent-poster.com/feed.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Infrequent Poster\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_entries\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# Override: rarely posts, save cache space\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://normal-blog.com/feed.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Normal Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Uses global default: 50 entries\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"feed-configuration-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed Configuration Reference\u003c/span\u003e \u003ca href=\"#feed-configuration-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eRequired\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eurl\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003eRSS or Atom feed URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eAuto-fetched\u003c/td\u003e\n\u003ctd\u003eDisplay name for the feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edescription\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eAuto-fetched\u003c/td\u003e\n\u003ctd\u003eShort description\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecategory\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003e\u0026ldquo;Uncategorized\u0026rdquo;\u003c/td\u003e\n\u003ctd\u003eGroups feeds together\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAdditional labels for filtering\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esite_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eAuto-fetched\u003c/td\u003e\n\u003ctd\u003eMain website URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eimage_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eAuto-fetched\u003c/td\u003e\n\u003ctd\u003eLogo or icon URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eactive\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSet to \u003ccode\u003efalse\u003c/code\u003e to disable\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emax_entries\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eGlobal default\u003c/td\u003e\n\u003ctd\u003eOverride max entries for this feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"custom-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Templates\u003c/span\u003e \u003ca href=\"#custom-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOverride the default templates:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blogroll.html\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Template for /blogroll/ page\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereader\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;reader.html\u0026#34;\u003c/span\u003e        \u003cspan class=\"c\"\u003e# Template for /reader/ page\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"example-building-a-reading-list\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample: Building a Reading List\u003c/span\u003e \u003ca href=\"#example-building-a-reading-list\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere\u0026rsquo;s a complete example with multiple feeds organized by category:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_duration\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2h\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_entries_per_feed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e25\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# TECHNOLOGY\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://simonwillison.net/atom/everything/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Simon Willison\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Creator of Datasette, Django co-creator, AI/LLM enthusiast\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecategory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Technology\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;python\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ai\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;llm\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;sqlite\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esite_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://simonwillison.net\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://jvns.ca/atom.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Julia Evans\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Making hard things easy to understand\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecategory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Technology\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;linux\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;networking\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;zines\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esite_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://jvns.ca\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://danluu.com/atom.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Dan Luu\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Deep dives into computer systems\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecategory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Technology\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;systems\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;performance\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esite_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://danluu.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://blog.codinghorror.com/rss/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Coding Horror\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Jeff Atwood on programming and human factors\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecategory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Technology\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;programming\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;software\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esite_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://blog.codinghorror.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# DESIGN\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://alistapart.com/main/feed/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;A List Apart\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;For people who make websites\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecategory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Design\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;web\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ux\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;accessibility\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esite_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://alistapart.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://css-tricks.com/feed/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;CSS-Tricks\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Tips, tricks, and techniques on using CSS\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecategory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Design\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;css\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;frontend\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esite_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://css-tricks.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# PERSONAL\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://austinkleon.com/feed/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Austin Kleon\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Writer and artist\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecategory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Personal\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;creativity\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;writing\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esite_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://austinkleon.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"adding-simon-willison\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdding Simon Willison\u003c/span\u003e \u003ca href=\"#adding-simon-willison\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSimon Willison is a prolific blogger known for creating Datasette, co-creating Django, and writing extensively about AI/LLMs. His feed URL is:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ehttps://simonwillison.net/atom/everything/\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eAdd him to your blogroll:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://simonwillison.net/atom/everything/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Simon Willison\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Creator of Datasette, Django co-creator, AI/LLM enthusiast\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecategory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Technology\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;python\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ai\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;llm\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;sqlite\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;datasette\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esite_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://simonwillison.net\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSimon also has topic-specific feeds if you want to subscribe to specific content:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ehttps://simonwillison.net/atom/entries/\u003c/code\u003e - Blog entries only\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehttps://simonwillison.net/atom/links/\u003c/code\u003e - Links/bookmarks only\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"finding-feed-urls\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFinding Feed URLs\u003c/span\u003e \u003ca href=\"#finding-feed-urls\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMost blogs have RSS/Atom feeds. Here\u0026rsquo;s how to find them:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eLook for feed icons\u003c/strong\u003e - Usually in the header, footer, or sidebar\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCheck common paths:\u003c/strong\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/feed/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/rss/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/atom.xml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/feed.xml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/rss.xml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/index.xml\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eView page source\u003c/strong\u003e - Search for \u003ccode\u003eapplication/rss+xml\u003c/code\u003e or \u003ccode\u003eapplication/atom+xml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUse browser extensions\u003c/strong\u003e - Feed discovery extensions can help\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"common-feed-url-patterns\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon Feed URL Patterns\u003c/span\u003e \u003ca href=\"#common-feed-url-patterns\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePlatform\u003c/th\u003e\n\u003cth\u003eFeed URL Pattern\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eWordPress\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/feed/\u003c/code\u003e or \u003ccode\u003e/feed/rss/\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGhost\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/rss/\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSubstack\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/feed\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMedium\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/feed\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJekyll\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/feed.xml\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHugo\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/index.xml\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003edev.to\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/feed\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGitHub Releases\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/releases.atom\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"generated-pages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGenerated Pages\u003c/span\u003e \u003ca href=\"#generated-pages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"blogroll-page-blogroll\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBlogroll Page (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e/blogroll/\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#blogroll-page-blogroll\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe blogroll page lists all feeds grouped by category:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e/blogroll/\n  index.html\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eDefault layout:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHeader with title and feed count\u003c/li\u003e\n\u003cli\u003eFeeds grouped by category\u003c/li\u003e\n\u003cli\u003eEach feed shows: title, description, post count\u003c/li\u003e\n\u003cli\u003eLinks to the original site\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"reader-page-reader\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReader Page (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e/reader/\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#reader-page-reader\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe reader page shows the latest posts from all feeds in reverse chronological order, grouped by day, with pagination:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e/reader/\n  index.html              # Page 1\n  partial/\n    index.html            # Page 1 partial (HTMX)\n  page/\n    2/\n      index.html          # Page 2\n      partial/\n        index.html        # Page 2 partial (HTMX)\n    3/\n      index.html\n      partial/\n        index.html\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eDefault layout:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEditorial header with page stats\u003c/li\u003e\n\u003cli\u003eType switch links between the full reader and any typed readers\u003c/li\u003e\n\u003cli\u003eEntries grouped by day with a large date rail\u003c/li\u003e\n\u003cli\u003eTwo-column entry grid on desktop, single column on mobile\u003c/li\u003e\n\u003cli\u003eEach entry shows: source favicon, source name, date, title, description, optional image\u003c/li\u003e\n\u003cli\u003eLinks to the original article\u003c/li\u003e\n\u003cli\u003eHacker News and Lobsters discussion URLs are normalized to the outbound article URL when one is available. Lobsters RSS feeds that already link directly to articles retain their discussion permalinks from the GUID or comments field. The original discussions remain available as \u0026ldquo;Found on HN\u0026rdquo; or \u0026ldquo;Found on Lobsters\u0026rdquo;, alongside the feed source label\u003c/li\u003e\n\u003cli\u003ePagination navigation (when more than one page)\u003c/li\u003e\n\u003cli\u003eOffscreen reader cards after the first four in each day group may skip layout and paint in supporting browsers via CSS \u003ccode\u003econtent-visibility\u003c/code\u003e; the full HTML, links, and no-JavaScript navigation remain available. Preview images and source icons load lazily and decode asynchronously.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eGhost-hosted PNG, JPEG, and WebP previews with an existing \u003ccode\u003estorage.ghost.io\u003c/code\u003e\nwidth URL include responsive candidates. The browser selects a width for the\ncard and screen density, including when JavaScript is disabled. The original\nimage remains the fallback; other providers and GIF/SVG previews keep their\nexisting URLs. Custom reader templates can use \u003ccode\u003eentry.image_srcset\u003c/code\u003e with\n\u003ccode\u003esizes=\u0026quot;100vw\u0026quot;\u003c/code\u003e on lazy images.\u003c/p\u003e\n\u003ch3 id=\"community-aggregators-lobsters-lemmy-and-reddit\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommunity aggregators: Lobsters, Lemmy and Reddit\u003c/span\u003e \u003ca href=\"#community-aggregators-lobsters-lemmy-and-reddit\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe reader preserves the original discussion permalink alongside a linked external article. For Lemmy community RSS feeds, \u003ccode\u003e\u0026lt;link\u0026gt;\u003c/code\u003e normally points to the article, and a \u003ccode\u003e\u0026lt;guid\u0026gt;\u003c/code\u003e or \u003ccode\u003e\u0026lt;comments\u0026gt;\u003c/code\u003e permalink can point to the Lemmy discussion. For Reddit\u0026rsquo;s Atom feeds, posts remain linked to Reddit unless an explicit \u003ccode\u003e[link]\u003c/code\u003e anchor in the entry content provides an external article URL; text-only posts remain on Reddit. Unknown or blocked feeds retain the normal fallback behavior, and arbitrary links in a post body are not promoted to articles.\u003c/p\u003e\n\u003cp\u003eExample subscriptions:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://lemmy.world/feeds/c/selfhosted.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Lemmy: Selfhosted\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://www.reddit.com/r/selfhosted/.rss\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Reddit: Selfhosted\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eReddit deprecation:\u003c/strong\u003e Reddit \u003ca href=\"https://www.reddit.com/r/modnews/comments/1wubgvt/\"\u003eannounced\u003c/a\u003e that its native RSS feeds will stop working on \u003cstrong\u003eNovember 13, 2026\u003c/strong\u003e. The Reddit example is temporary and should not be relied on for new long-term subscriptions; no unauthenticated replacement is promised. Lemmy provides supported native RSS feeds. Feed refreshes may also be rate-limited by individual communities.\u003c/p\u003e\n\u003cp\u003eIf you assign feed types, markata-go also generates typed reader pages:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/reader/           # all feeds\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/reader/written/   # written feeds only\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/reader/video/     # video feeds only\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/reader/podcast/   # podcast feeds only\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eDeterministic ordering:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eMost recent publish/update date first\u003c/li\u003e\n\u003cli\u003eFeed URL (ascending)\u003c/li\u003e\n\u003cli\u003eEntry ID (ascending)\u003c/li\u003e\n\u003cli\u003eTitle (ascending)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"custom-templates-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Templates\u003c/span\u003e \u003ca href=\"#custom-templates-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCreate custom templates for full control over the appearance.\u003c/p\u003e\n\u003ch3 id=\"blogroll-template\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBlogroll Template\u003c/span\u003e \u003ca href=\"#blogroll-template\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003etemplates/blogroll.html\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% extends \u0026#34;base.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emain\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;blogroll\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;subtitle\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ feed_count }} blogs I follow\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% for category in categories %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;category\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ category.Slug }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ category.Name }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;feed-grid\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {% for feed in category.Feeds %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;feed-card\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% if feed.ImageURL %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.ImageURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.Title }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;feed-icon\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          {% if feed.SiteURL %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.SiteURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etarget\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;_blank\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;noopener\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ feed.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          {% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          {{ feed.Title }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% if feed.Description %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ feed.Description }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;meta\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post-count\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ feed.EntryCount }} posts\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ feed.FeedURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;feed-link\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;RSS Feed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esvg\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- RSS icon --\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esvg\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"reader-template\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReader Template\u003c/span\u003e \u003ca href=\"#reader-template\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate \u003ccode\u003etemplates/reader.html\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% extends \u0026#34;base.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-page\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-subtitle\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eLatest posts from blogs I follow\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-stream posts-list\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% for day in day_groups %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-day\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003easide\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-day-rail\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e\u003cspan class=\"err\"\u003e{%\u003c/span\u003e \u003cspan class=\"na\"\u003eif\u003c/span\u003e \u003cspan class=\"na\"\u003eday\u003c/span\u003e\u003cspan class=\"err\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003edate_iso\u003c/span\u003e \u003cspan class=\"err\"\u003e%}\u003c/span\u003e \u003cspan class=\"na\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ day.date_iso }}\u0026#34;\u003c/span\u003e\u003cspan class=\"err\"\u003e{%\u003c/span\u003e \u003cspan class=\"na\"\u003eendif\u003c/span\u003e \u003cspan class=\"err\"\u003e%}\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-day-weekday\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ day.weekday }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-day-title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ day.title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          {% if day.year %}\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-day-year\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ day.year }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-day-count\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ day.count }} stories\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003easide\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-day-entries\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% for entry in day.entries %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-entry{% if entry.image_url %} has-image{% endif %}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-entry-meta-row\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ entry.feed_url }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etarget\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;_blank\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;noopener noreferrer\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-entry-source-link\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              {% if entry.source_icon_url %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ entry.source_icon_url }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-entry-source-icon\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;16\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;16\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              {% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-entry-source-icon reader-entry-source-icon--fallback\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003earia-hidden\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-entry-source\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ entry.feed_title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% if entry.published_datetime %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e \u003cspan class=\"na\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ entry.published_datetime }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ entry.published_label }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          {% if entry.original_url %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-entry-found-on\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eFound on HN: \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ entry.original_url }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etarget\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;_blank\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;noopener noreferrer\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003ediscussion\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-entry-title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ entry.url }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etarget\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;_blank\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;noopener noreferrer\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ entry.title }}\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;visually-hidden\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e(opens in new tab)\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          {% if entry.description %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-entry-description\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ entry.description|striptags|truncate:200 }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          {% if entry.image_url %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ entry.url }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etarget\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;_blank\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;noopener noreferrer\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-entry-image-link\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ entry.image_url }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reader-entry-image\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;960\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;540\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esection\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"template-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Variables\u003c/span\u003e \u003ca href=\"#template-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"blogroll-template-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBlogroll Template Variables\u003c/span\u003e \u003ca href=\"#blogroll-template-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003ePage title (\u0026ldquo;Blogroll\u0026rdquo;)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edescription\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003ePage description\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeeds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]ExternalFeed\u003c/td\u003e\n\u003ctd\u003eAll feeds\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecategories\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]BlogrollCategory\u003c/td\u003e\n\u003ctd\u003eFeeds grouped by category\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeed_count\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eTotal number of feeds\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"reader-template-variables\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReader Template Variables\u003c/span\u003e \u003ca href=\"#reader-template-variables\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eVariable\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003ePage title (\u0026ldquo;Reader\u0026rdquo;)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edescription\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003ePage description\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eentries\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]ExternalEntry\u003c/td\u003e\n\u003ctd\u003eEntries for current page (newest first)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eday_groups\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]ReaderDayGroup\u003c/td\u003e\n\u003ctd\u003eEntries grouped by day for the curated layout\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eentry_count\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eTotal number of entries across all pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epage\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReaderPage\u003c/td\u003e\n\u003ctd\u003ePagination information\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epagination_type\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003ePagination type (\u0026ldquo;manual\u0026rdquo;, \u0026ldquo;htmx\u0026rdquo;, \u0026ldquo;js\u0026rdquo;)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eoriginal_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eOriginal discussion link when a feed entry was normalized\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"readerpage-fields\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReaderPage Fields\u003c/span\u003e \u003ca href=\"#readerpage-fields\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enumber\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eCurrent page number (1-indexed)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehas_prev\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eTrue if previous page exists\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehas_next\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003eTrue if next page exists\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eprev_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eURL of previous page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enext_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eURL of next page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etotal_pages\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eTotal number of pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etotal_items\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eTotal number of entries\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eitems_per_page\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eEntries per page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epage_urls\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003eURLs for all pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epagination_type\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003ePagination type\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"readerdaygroup-fields\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReaderDayGroup Fields\u003c/span\u003e \u003ca href=\"#readerdaygroup-fields\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edate_iso\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eISO-8601 day timestamp for the rail\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eweekday\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eShort weekday label\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eShort month/day label\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eyear\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eYear label\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eEntries in the day group\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eentries\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]map[string]interface\u003c/td\u003e\n\u003ctd\u003eEntry maps for the group\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"externalfeed-fields\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExternalFeed Fields\u003c/span\u003e \u003ca href=\"#externalfeed-fields\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eTitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eFeed title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eDescription\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eFeed description\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eSiteURL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eMain website URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eFeedURL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eRSS/Atom feed URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eImageURL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eFeed logo/icon\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCategory\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eFeed category\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eTags\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003eFeed tags\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eEntryCount\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eNumber of entries\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eEntries\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]ExternalEntry\u003c/td\u003e\n\u003ctd\u003eFeed entries\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eLastFetched\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e*time.Time\u003c/td\u003e\n\u003ctd\u003eWhen feed was last fetched\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eLastUpdated\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e*time.Time\u003c/td\u003e\n\u003ctd\u003eFeed\u0026rsquo;s last update date\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eError\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eError message if fetch failed\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"externalentry-fields\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExternalEntry Fields\u003c/span\u003e \u003ca href=\"#externalentry-fields\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eTitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eEntry title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eURL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eLink to full article\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eDescription\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSummary or excerpt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eContent\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eFull content (HTML)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eAuthor\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eEntry author\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ePublished\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e*time.Time\u003c/td\u003e\n\u003ctd\u003ePublication date\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eUpdated\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e*time.Time\u003c/td\u003e\n\u003ctd\u003eLast update date\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCategories\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003eEntry categories/tags\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eImageURL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eFeatured image\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eReadingTime\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eEstimated reading time (minutes)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eFeedURL\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSource feed URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eFeedTitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eSource feed title\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eReader entry maps also include \u003ccode\u003esource_icon_url\u003c/code\u003e, \u003ccode\u003epublished_datetime\u003c/code\u003e, \u003ccode\u003epublished_label\u003c/code\u003e, and \u003ccode\u003edate_key\u003c/code\u003e for the redesigned layout.\u003c/p\u003e\n\u003ch3 id=\"blogrollcategory-fields\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBlogrollCategory Fields\u003c/span\u003e \u003ca href=\"#blogrollcategory-fields\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eName\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eCategory name\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eSlug\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eURL-safe identifier\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eFeeds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]ExternalFeed\u003c/td\u003e\n\u003ctd\u003eFeeds in this category\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"caching\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCaching\u003c/span\u003e \u003ca href=\"#caching\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe blogroll plugin caches fetched feeds to avoid hitting external servers on every build.\u003c/p\u003e\n\u003ch3 id=\"cache-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCache Configuration\u003c/span\u003e \u003ca href=\"#cache-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cache/blogroll\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Cache directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_duration\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;24h\u0026#34;\u003c/span\u003e          \u003cspan class=\"c\"\u003e# How long to cache feeds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erefresh_on_build\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e         \u003cspan class=\"c\"\u003e# Reuse cache during builds; refresh with `reader update`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"cache-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCache Behavior\u003c/span\u003e \u003ca href=\"#cache-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go reader update\u003c/code\u003e is the explicit cache refresh command for blogroll and reader feeds\u003c/li\u003e\n\u003cli\u003eWhen \u003ccode\u003erefresh_on_build = false\u003c/code\u003e, normal builds reuse cached feed data and do not make remote refresh requests\u003c/li\u003e\n\u003cli\u003eWhen \u003ccode\u003erefresh_on_build = true\u003c/code\u003e, builds use cached feeds until \u003ccode\u003ecache_duration\u003c/code\u003e expires, then refresh as needed\u003c/li\u003e\n\u003cli\u003eExpiration is based on the cached feed\u0026rsquo;s recorded fetch time, not file mtimes\u003c/li\u003e\n\u003cli\u003eIf a refresh fails, the stale cached feed is reused instead of failing open\u003c/li\u003e\n\u003cli\u003eExplicit config overrides like \u003ccode\u003etitle\u003c/code\u003e, \u003ccode\u003edescription\u003c/code\u003e, \u003ccode\u003esite_url\u003c/code\u003e, \u003ccode\u003eimage_url\u003c/code\u003e, \u003ccode\u003ehandle\u003c/code\u003e, aliases, category, and tags are reapplied even when cached feed data is reused\u003c/li\u003e\n\u003cli\u003eDelete \u003ccode\u003ecache/blogroll/\u003c/code\u003e to force a fresh fetch\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"cache-duration-examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCache Duration Examples\u003c/span\u003e \u003ca href=\"#cache-duration-examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_duration\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;30m\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# 30 minutes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_duration\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1h\u0026#34;\u003c/span\u003e     \u003cspan class=\"c\"\u003e# 1 hour\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_duration\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;6h\u0026#34;\u003c/span\u003e     \u003cspan class=\"c\"\u003e# 6 hours\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_duration\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;24h\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# 1 day (default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_duration\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;168h\u0026#34;\u003c/span\u003e   \u003cspan class=\"c\"\u003e# 1 week\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eRecommendations:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDevelopment: \u003ccode\u003e\u0026quot;30m\u0026quot;\u003c/code\u003e to \u003ccode\u003e\u0026quot;1h\u0026quot;\u003c/code\u003e - Good balance without hammering feeds\u003c/li\u003e\n\u003cli\u003eProduction: \u003ccode\u003e\u0026quot;24h\u0026quot;\u003c/code\u003e to \u003ccode\u003e\u0026quot;168h\u0026quot;\u003c/code\u003e - Prioritize build speed and stable caches\u003c/li\u003e\n\u003cli\u003eHigh-traffic: \u003ccode\u003e\u0026quot;24h\u0026quot;\u003c/code\u003e or more - Reduce external requests\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"error-handling\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eError Handling\u003c/span\u003e \u003ca href=\"#error-handling\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen a feed fails to fetch, the plugin:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eRecords the error in \u003ccode\u003efeed.Error\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eContinues processing other feeds\u003c/li\u003e\n\u003cli\u003eIncludes the feed in the blogroll (with error indicator)\u003c/li\u003e\n\u003cli\u003eUses cached data if available\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"handling-errors-in-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHandling Errors in Templates\u003c/span\u003e \u003ca href=\"#handling-errors-in-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for feed in feeds %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;feed-card {% if feed.Error %}feed-error{% endif %}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ feed.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% if feed.Error %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;error\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eUnable to fetch: {{ feed.Error }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ feed.EntryCount }} posts\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"screenshot-service-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eScreenshot Service Integration\u003c/span\u003e \u003ca href=\"#screenshot-service-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMany RSS feed entries don\u0026rsquo;t include featured images. The \u003ccode\u003efallback_image_service\u003c/code\u003e option lets you automatically generate preview images using screenshot services.\u003c/p\u003e\n\u003ch3 id=\"configuration-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSet a URL template with \u003ccode\u003e{url}\u003c/code\u003e as a placeholder for the entry URL:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efallback_image_service\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://shots.so/s/{url}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen an entry doesn\u0026rsquo;t have an \u003ccode\u003eimage_url\u003c/code\u003e, markata-go will:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eURL-encode the entry\u0026rsquo;s URL\u003c/li\u003e\n\u003cli\u003eReplace \u003ccode\u003e{url}\u003c/code\u003e in the template with the encoded URL\u003c/li\u003e\n\u003cli\u003eUse the resulting URL as the fallback image\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"popular-screenshot-services\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePopular Screenshot Services\u003c/span\u003e \u003ca href=\"#popular-screenshot-services\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"shots-so-free\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eshots.so (Free)\u003c/span\u003e \u003ca href=\"#shots-so-free\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003e\u003ca href=\"https://shots.so/\"\u003eshots.so\u003c/a\u003e provides free website screenshots with no API key required:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efallback_image_service\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://shots.so/s/{url}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFeatures:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNo registration or API key needed\u003c/li\u003e\n\u003cli\u003eAutomatic caching of screenshots\u003c/li\u003e\n\u003cli\u003eCustomizable viewport and device type\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFor custom parameters:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efallback_image_service\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://shots.so/s/{url}?width=1200\u0026amp;height=630\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"api-flash\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAPI Flash\u003c/span\u003e \u003ca href=\"#api-flash\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003e\u003ca href=\"https://apiflash.com/\"\u003eAPI Flash\u003c/a\u003e offers high-quality screenshots with customization:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efallback_image_service\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://api.apiflash.com/v1/urltoimage?access_key=YOUR_ACCESS_KEY\u0026amp;url={url}\u0026amp;width=1200\u0026amp;height=630\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFeatures:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRequires API key (free tier available)\u003c/li\u003e\n\u003cli\u003eExtensive customization options\u003c/li\u003e\n\u003cli\u003eReliable caching and CDN delivery\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eGet your access key from \u003ca href=\"https://apiflash.com/\"\u003eapiflash.com\u003c/a\u003e.\u003c/p\u003e\n\u003ch4 id=\"screenshotone\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eScreenshotOne\u003c/span\u003e \u003ca href=\"#screenshotone\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003e\u003ca href=\"https://screenshotone.com/\"\u003eScreenshotOne\u003c/a\u003e provides API-based screenshot generation:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efallback_image_service\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://api.screenshotone.com/take?access_key=YOUR_ACCESS_KEY\u0026amp;url={url}\u0026amp;viewport_width=1200\u0026amp;viewport_height=630\u0026amp;image_quality=80\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFeatures:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAPI key required (free tier available)\u003c/li\u003e\n\u003cli\u003eAdvanced rendering options\u003c/li\u003e\n\u003cli\u003eGDPR compliant\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eGet your access key from \u003ca href=\"https://screenshotone.com/\"\u003escreenshotone.com\u003c/a\u003e.\u003c/p\u003e\n\u003ch3 id=\"url-encoding\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eURL Encoding\u003c/span\u003e \u003ca href=\"#url-encoding\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe \u003ccode\u003e{url}\u003c/code\u003e placeholder is automatically URL-encoded, so you don\u0026rsquo;t need to manually encode it. For example:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eEntry URL: https://example.com/blog/post?id=123\u0026amp;ref=home\nEncoded:   https%3A%2F%2Fexample.com%2Fblog%2Fpost%3Fid%3D123%26ref%3Dhome\nResult:    https://shots.so/s/https%3A%2F%2Fexample.com%2Fblog%2Fpost%3Fid%3D123%26ref%3Dhome\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"rate-limits-and-caching\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRate Limits and Caching\u003c/span\u003e \u003ca href=\"#rate-limits-and-caching\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eImportant considerations:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eRate Limits\u003c/strong\u003e - Most screenshot services have rate limits on their free tiers. If you have many feeds with many entries, you may hit these limits during builds.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eBuild Time\u003c/strong\u003e - Screenshot services generate images on-demand, which can slow down your first build. Subsequent builds are faster as services cache screenshots.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eService Caching\u003c/strong\u003e - Screenshots are typically cached by the service, so the same URL will return quickly on subsequent requests.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eLocal Caching\u003c/strong\u003e - Consider the blogroll plugin\u0026rsquo;s \u003ccode\u003ecache_duration\u003c/code\u003e setting to reduce build frequency and screenshot service requests:\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_duration\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;6h\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Reduces rebuild frequency\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efallback_image_service\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://shots.so/s/{url}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003col start=\"5\"\u003e\n\u003cli\u003e\u003cstrong\u003eCost Considerations\u003c/strong\u003e - For high-traffic sites or large blogrolls, consider:\n\u003cul\u003e\n\u003cli\u003eUsing services with generous free tiers (like shots.so)\u003c/li\u003e\n\u003cli\u003eLimiting \u003ccode\u003emax_entries_per_feed\u003c/code\u003e to reduce screenshot requests\u003c/li\u003e\n\u003cli\u003eIncreasing \u003ccode\u003ecache_duration\u003c/code\u003e to minimize rebuilds\u003c/li\u003e\n\u003cli\u003eUpgrading to paid tiers for higher rate limits\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"example-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample Configuration\u003c/span\u003e \u003ca href=\"#example-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_duration\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;6h\u0026#34;\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Cache for 6 hours to reduce rebuilds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_entries_per_feed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\u003c/span\u003e          \u003cspan class=\"c\"\u003e# Limit entries to reduce screenshot requests\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efallback_image_service\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://shots.so/s/{url}?width=1200\u0026amp;height=630\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://simonwillison.net/atom/everything/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Simon Willison\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecategory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Technology\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWith this configuration, the Reader uses a preview hierarchy for entries without article images:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003earticle image from the feed entry\u003c/li\u003e\n\u003cli\u003esource image from the feed avatar/logo\u003c/li\u003e\n\u003cli\u003escreenshot fallback from \u003ccode\u003efallback_image_service\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ebranded source tile when no image is available\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThis keeps the Reader more consistent and reduces the visual noise from arbitrary webpage screenshots.\u003c/p\u003e\n\u003cp\u003eYouTube feeds also use the per-video thumbnail automatically, so video channels show the actual video art in \u003ccode\u003e/reader/\u003c/code\u003e instead of a generic source tile or screenshot.\u003c/p\u003e\n\u003ch2 id=\"performance-tips\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePerformance Tips\u003c/span\u003e \u003ca href=\"#performance-tips\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"optimize-build-times\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOptimize Build Times\u003c/span\u003e \u003ca href=\"#optimize-build-times\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eIncrease cache duration\u003c/strong\u003e for production builds\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLimit \u003ccode\u003emax_entries_per_feed\u003c/code\u003e\u003c/strong\u003e if you only need recent posts\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eReduce \u003ccode\u003econcurrent_requests\u003c/code\u003e\u003c/strong\u003e if you\u0026rsquo;re hitting rate limits\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDisable inactive feeds\u003c/strong\u003e with \u003ccode\u003eactive = false\u003c/code\u003e instead of removing them\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"example-production-config\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample Production Config\u003c/span\u003e \u003ca href=\"#example-production-config\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cache/blogroll\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_duration\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;6h\u0026#34;\u003c/span\u003e           \u003cspan class=\"c\"\u003e# Cache for 6 hours\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etimeout\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e15\u003c/span\u003e                    \u003cspan class=\"c\"\u003e# Shorter timeout\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econcurrent_requests\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e         \u003cspan class=\"c\"\u003e# Be nice to servers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_entries_per_feed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\u003c/span\u003e       \u003cspan class=\"c\"\u003e# Only recent posts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"configuration-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration Reference\u003c/span\u003e \u003ca href=\"#configuration-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"full-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFull Configuration\u003c/span\u003e \u003ca href=\"#full-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Enable/disable the entire feature\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Cache settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cache/blogroll\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_duration\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1h\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# HTTP settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etimeout\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e30\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econcurrent_requests\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_entries_per_feed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Pagination settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eorphan_threshold\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epagination_type\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;manual\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# \u0026#34;manual\u0026#34;, \u0026#34;htmx\u0026#34;, or \u0026#34;js\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Screenshot service for last-resort Reader previews\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efallback_image_service\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e   \u003cspan class=\"c\"\u003e# Used only after article and source images are exhausted\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Custom templates\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blogroll.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereader\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;reader.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Feeds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/feed.xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Example\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Description\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecategory\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Category\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etags\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tag1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tag2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esite_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eimage_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/logo.png\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eactive\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_entries\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Override global max_entries_per_feed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"configuration-fields\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration Fields\u003c/span\u003e \u003ca href=\"#configuration-fields\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable blogroll plugin\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecache_dir\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;cache/blogroll\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCache directory\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecache_duration\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;24h\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCache TTL (Go duration)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erefresh_on_build\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAllow builds to refresh remote blogroll feeds\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etimeout\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e30\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHTTP timeout in seconds\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econcurrent_requests\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e5\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMax parallel fetches\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emax_entries_per_feed\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e50\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGlobal max entries per feed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eitems_per_page\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e50\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEntries per reader page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eorphan_threshold\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e3\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMin entries for separate page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epagination_type\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;manual\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePagination style\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efallback_image_service\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLast-resort screenshot template for Reader previews\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeeds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]Feed\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eList of feeds\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etemplates.blogroll\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;blogroll.html\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBlogroll template\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etemplates.reader\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;reader.html\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReader template\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"fast-builds-during-development\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFast Builds During Development\u003c/span\u003e \u003ca href=\"#fast-builds-during-development\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen working on large sites with many blogroll feeds, the best default is usually to keep blogroll pages enabled while separating refresh from normal builds.\u003c/p\u003e\n\u003ch3 id=\"keep-blogroll-pages-skip-refresh-during-builds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKeep Blogroll Pages, Skip Refresh During Builds\u003c/span\u003e \u003ca href=\"#keep-blogroll-pages-skip-refresh-during-builds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eblogroll\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erefresh_on_build\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen refresh on demand:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go reader update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor one-off runs, you can also set:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_BLOGROLL_REFRESH_ON_BUILD\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003efalse\u003c/span\u003e markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf you want the smallest possible loop, you can still disable the plugin entirely:\u003c/p\u003e\n\u003ch3 id=\"disable-blogroll-via-environment-variable\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDisable Blogroll Via Environment Variable\u003c/span\u003e \u003ca href=\"#disable-blogroll-via-environment-variable\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build without fetching blogroll feeds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_BLOGROLL_ENABLED\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003efalse\u003c/span\u003e markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Or combine with glob patterns to build just one post\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_GLOB_PATTERNS\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;posts/my-draft.md\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_BLOGROLL_ENABLED\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003efalse\u003c/span\u003e markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"using-a-local-env-file\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsing a Local .env File\u003c/span\u003e \u003ca href=\"#using-a-local-env-file\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate a \u003ccode\u003e.env.local\u003c/code\u003e file (and add it to \u003ccode\u003e.gitignore\u003c/code\u003e):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# .env.local\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_BLOGROLL_ENABLED\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen source it before building:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003esource\u003c/span\u003e .env.local \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"when-to-use-fast-builds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhen to Use Fast Builds\u003c/span\u003e \u003ca href=\"#when-to-use-fast-builds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eUse fast builds when:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWriting or editing posts (blogroll content doesn\u0026rsquo;t affect your writing)\u003c/li\u003e\n\u003cli\u003eTesting template changes\u003c/li\u003e\n\u003cli\u003eRunning local development server\u003c/li\u003e\n\u003cli\u003eDebugging build issues\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eUse full builds when:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDeploying to production\u003c/li\u003e\n\u003cli\u003eTesting blogroll template changes\u003c/li\u003e\n\u003cli\u003eVerifying complete site output\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"build-time-impact\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Time Impact\u003c/span\u003e \u003ca href=\"#build-time-impact\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBlogroll fetch times depend on:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNumber of feeds configured\u003c/li\u003e\n\u003cli\u003eFeed response times\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econcurrent_requests\u003c/code\u003e setting (default: 5 parallel)\u003c/li\u003e\n\u003cli\u003eCache hit rate\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFor a blogroll with 20 feeds, expect:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eFirst build:\u003c/strong\u003e 5-15 seconds (fetching all feeds)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCached build:\u003c/strong\u003e 0.5-2 seconds (using cached feeds)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDisabled:\u003c/strong\u003e 0 seconds (blogroll plugin skipped entirely)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"next-steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNext Steps\u003c/span\u003e \u003ca href=\"#next-steps\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/feeds/\"\u003eFeeds Guide\u003c/a\u003e - Create feeds from your own content\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/templates/\"\u003eTemplates Guide\u003c/a\u003e - Customize blogroll appearance\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/syndication-feeds/\"\u003eSyndication Guide\u003c/a\u003e - Share your own content via RSS\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/configuration/\"\u003eConfiguration Guide\u003c/a\u003e - Full configuration reference\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/docs/guides/themes/\"\u003eThemes Guide\u003c/a\u003e - Style your blogroll with themes\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n## Blogroll \u0026 Reader\n\nThe blogroll plugin lets you curate a list of blogs you follow and automatically fetch their RSS/Atom feeds to create:\n\n- **`/blogroll/`** - A directory of blogs you follow, organized by category\n- **`/reader/`** - A river-of-news style page showing latest posts from all feeds\n\nThis is perfect for sharing your reading list, building community connections, or creating a personal feed reader built into your site.\n\n## Quick Start\n\nAdd this to your `markata-go.toml`:\n\n```toml\n[markata-go.blogroll]\nenabled = true\n\n[[markata-go.blogroll.feeds]]\nurl = \"https://simonwillison.net/atom/everything/\"\ntitle = \"Simon Willison\"\ncategory = \"Technology\"\n```\n\nRun `markata-go build` and you'll have:\n- `/blogroll/` - Lists Simon Willison's blog\n- `/reader/` - Shows his latest posts\n\n## Manage subscriptions in your browser\n\nStart the local development server with `markata-go serve`, then open\n[`/_markata/subscriptions`](http://localhost:8000/_markata/subscriptions).\nThe Serve Control Center and local preview pages also link to this editor.\nPaste a public website URL and select **Find feed** to discover its advertised\nRSS/Atom/JSON Feed; review its title, category, type and tags, then subscribe.\nYou can search, edit or remove existing subscriptions without editing TOML.\n\nThe editor writes only the **effective owning TOML config file**, including\nwhen blogroll subscriptions live in an included config. It preserves other\nsections and comments. When a later included/merge config replaces the feed\nlist, the editor never silently writes to a shadowed earlier file. Global\nconfigs, merge overrides and non-TOML owners are read-only; edit those source\nfiles directly. The editor is only served to local loopback sessions, not\nincluded in production site output.\n\n## Configuration\n\n### Basic Settings\n\n```toml\n[markata-go.blogroll]\nenabled = true                    # Enable the blogroll plugin\ncache_dir = \"cache/blogroll\"      # Where to cache fetched feeds\ncache_duration = \"24h\"            # How long to cache (default: 24 hours)\ntimeout = 30                      # HTTP request timeout in seconds\nconcurrent_requests = 5           # Max parallel feed fetches\nmax_entries_per_feed = 50         # Global default entries per feed\n```\n\n### Pagination Settings\n\nThe reader page supports pagination to handle large numbers of entries:\n\n```toml\n[markata-go.blogroll]\nenabled = true\nitems_per_page = 50               # Entries per page (default: 50)\norphan_threshold = 3              # Min entries for separate page (default: 3)\npagination_type = \"manual\"        # \"manual\", \"htmx\", or \"js\"\n```\n\n**Pagination Types:**\n\n| Type | Description |\n|------|-------------|\n| `manual` | Traditional page links with full page reloads |\n| `htmx` | Seamless AJAX-based navigation using HTMX |\n| `js` | Client-side JavaScript pagination |\n\nThe paginated reader generates:\n```\n/reader/              # Page 1\n/reader/page/2/       # Page 2\n/reader/page/3/       # Page 3\n/reader/page/2/partial/   # HTMX partial for page 2\n```\n\n### Adding Feeds\n\nAdd feeds using the `[[markata-go.blogroll.feeds]]` array:\n\n```toml\n[[markata-go.blogroll.feeds]]\nurl = \"https://example.com/feed.xml\"    # Required: RSS/Atom feed URL\ntitle = \"Example Blog\"                   # Optional: display name (auto-fetched if not set)\ndescription = \"A great blog about stuff\" # Optional: short description\ncategory = \"Technology\"                  # Optional: groups feeds on blogroll page\ntype = \"written\"                         # Optional: written, video, or podcast\ntags = [\"python\", \"web\"]                 # Optional: additional labels\nsite_url = \"https://example.com\"         # Optional: main website URL\nimage_url = \"https://example.com/logo.png\" # Optional: logo/icon\nactive = true                            # Optional: set false to disable without removing\nmax_entries = 50                         # Optional: override global max_entries_per_feed\n```\n\n`markata-go blogroll add \u003cfeed-url\u003e` now uses site metadata for the suggested title, description, and tags shown in the prompt. This works better for sources like YouTube, where the feed itself often lacks useful channel-level description and tag metadata.\n\nIf your site composes multiple config files with `markata-go.include`, `markata-go blogroll add` tries to append the new feed to the file that already contains the blogroll section instead of rewriting the root config file.\n\nYou can also pass common YouTube channel inputs and let markata-go resolve them to the underlying channel feed automatically:\n\n```bash\nmarkata-go blogroll add yt:devtoolsfm\nmarkata-go blogroll add https://www.youtube.com/@devtoolsfm\nmarkata-go blogroll add https://www.youtube.com/watch?v=aEkpFeJoKvk\n```\n\nFor a single YouTube video URL, markata-go resolves the owning channel and subscribes to that channel's feed.\n\n### Per-Feed Entry Limits\n\nOverride the global `max_entries_per_feed` for individual feeds:\n\n```toml\n[markata-go.blogroll]\nenabled = true\nmax_entries_per_feed = 50         # Global default\n\n[[markata-go.blogroll.feeds]]\nurl = \"https://prolific-blogger.com/feed.xml\"\ntitle = \"Prolific Blogger\"\nmax_entries = 100                 # Override: this site posts frequently\n\n[[markata-go.blogroll.feeds]]\nurl = \"https://micro.blog/user.xml\"\ntitle = \"Micro Blog\"\nmax_entries = 200                 # Override: many small posts\n\n[[markata-go.blogroll.feeds]]\nurl = \"https://infrequent-poster.com/feed.xml\"\ntitle = \"Infrequent Poster\"\nmax_entries = 10                  # Override: rarely posts, save cache space\n\n[[markata-go.blogroll.feeds]]\nurl = \"https://normal-blog.com/feed.xml\"\ntitle = \"Normal Blog\"\n# Uses global default: 50 entries\n```\n\n### Feed Configuration Reference\n\n| Field | Required | Default | Description |\n|-------|----------|---------|-------------|\n| `url` | Yes | - | RSS or Atom feed URL |\n| `title` | No | Auto-fetched | Display name for the feed |\n| `description` | No | Auto-fetched | Short description |\n| `category` | No | \"Uncategorized\" | Groups feeds together |\n| `tags` | No | `[]` | Additional labels for filtering |\n| `site_url` | No | Auto-fetched | Main website URL |\n| `image_url` | No | Auto-fetched | Logo or icon URL |\n| `active` | No | `true` | Set to `false` to disable |\n| `max_entries` | No | Global default | Override max entries for this feed |\n\n### Custom Templates\n\nOverride the default templates:\n\n```toml\n[markata-go.blogroll.templates]\nblogroll = \"blogroll.html\"    # Template for /blogroll/ page\nreader = \"reader.html\"        # Template for /reader/ page\n```\n\n## Example: Building a Reading List\n\nHere's a complete example with multiple feeds organized by category:\n\n```toml\n[markata-go.blogroll]\nenabled = true\ncache_duration = \"2h\"\nmax_entries_per_feed = 25\n\n# =============================================================================\n# TECHNOLOGY\n# =============================================================================\n\n[[markata-go.blogroll.feeds]]\nurl = \"https://simonwillison.net/atom/everything/\"\ntitle = \"Simon Willison\"\ndescription = \"Creator of Datasette, Django co-creator, AI/LLM enthusiast\"\ncategory = \"Technology\"\ntags = [\"python\", \"ai\", \"llm\", \"sqlite\"]\nsite_url = \"https://simonwillison.net\"\n\n[[markata-go.blogroll.feeds]]\nurl = \"https://jvns.ca/atom.xml\"\ntitle = \"Julia Evans\"\ndescription = \"Making hard things easy to understand\"\ncategory = \"Technology\"\ntags = [\"linux\", \"networking\", \"zines\"]\nsite_url = \"https://jvns.ca\"\n\n[[markata-go.blogroll.feeds]]\nurl = \"https://danluu.com/atom.xml\"\ntitle = \"Dan Luu\"\ndescription = \"Deep dives into computer systems\"\ncategory = \"Technology\"\ntags = [\"systems\", \"performance\"]\nsite_url = \"https://danluu.com\"\n\n[[markata-go.blogroll.feeds]]\nurl = \"https://blog.codinghorror.com/rss/\"\ntitle = \"Coding Horror\"\ndescription = \"Jeff Atwood on programming and human factors\"\ncategory = \"Technology\"\ntags = [\"programming\", \"software\"]\nsite_url = \"https://blog.codinghorror.com\"\n\n# =============================================================================\n# DESIGN\n# =============================================================================\n\n[[markata-go.blogroll.feeds]]\nurl = \"https://alistapart.com/main/feed/\"\ntitle = \"A List Apart\"\ndescription = \"For people who make websites\"\ncategory = \"Design\"\ntags = [\"web\", \"ux\", \"accessibility\"]\nsite_url = \"https://alistapart.com\"\n\n[[markata-go.blogroll.feeds]]\nurl = \"https://css-tricks.com/feed/\"\ntitle = \"CSS-Tricks\"\ndescription = \"Tips, tricks, and techniques on using CSS\"\ncategory = \"Design\"\ntags = [\"css\", \"frontend\"]\nsite_url = \"https://css-tricks.com\"\n\n# =============================================================================\n# PERSONAL\n# =============================================================================\n\n[[markata-go.blogroll.feeds]]\nurl = \"https://austinkleon.com/feed/\"\ntitle = \"Austin Kleon\"\ndescription = \"Writer and artist\"\ncategory = \"Personal\"\ntags = [\"creativity\", \"writing\"]\nsite_url = \"https://austinkleon.com\"\n```\n\n## Adding Simon Willison\n\nSimon Willison is a prolific blogger known for creating Datasette, co-creating Django, and writing extensively about AI/LLMs. His feed URL is:\n\n```\nhttps://simonwillison.net/atom/everything/\n```\n\nAdd him to your blogroll:\n\n```toml\n[[markata-go.blogroll.feeds]]\nurl = \"https://simonwillison.net/atom/everything/\"\ntitle = \"Simon Willison\"\ndescription = \"Creator of Datasette, Django co-creator, AI/LLM enthusiast\"\ncategory = \"Technology\"\ntags = [\"python\", \"ai\", \"llm\", \"sqlite\", \"datasette\"]\nsite_url = \"https://simonwillison.net\"\n```\n\nSimon also has topic-specific feeds if you want to subscribe to specific content:\n- `https://simonwillison.net/atom/entries/` - Blog entries only\n- `https://simonwillison.net/atom/links/` - Links/bookmarks only\n\n## Finding Feed URLs\n\nMost blogs have RSS/Atom feeds. Here's how to find them:\n\n1. **Look for feed icons** - Usually in the header, footer, or sidebar\n2. **Check common paths:**\n   - `/feed/`\n   - `/rss/`\n   - `/atom.xml`\n   - `/feed.xml`\n   - `/rss.xml`\n   - `/index.xml`\n3. **View page source** - Search for `application/rss+xml` or `application/atom+xml`\n4. **Use browser extensions** - Feed discovery extensions can help\n\n### Common Feed URL Patterns\n\n| Platform | Feed URL Pattern |\n|----------|-----------------|\n| WordPress | `/feed/` or `/feed/rss/` |\n| Ghost | `/rss/` |\n| Substack | `/feed` |\n| Medium | `/feed` |\n| Jekyll | `/feed.xml` |\n| Hugo | `/index.xml` |\n| dev.to | `/feed` |\n| GitHub Releases | `/releases.atom` |\n\n## Generated Pages\n\n### Blogroll Page (`/blogroll/`)\n\nThe blogroll page lists all feeds grouped by category:\n\n```\n/blogroll/\n  index.html\n```\n\n**Default layout:**\n- Header with title and feed count\n- Feeds grouped by category\n- Each feed shows: title, description, post count\n- Links to the original site\n\n### Reader Page (`/reader/`)\n\nThe reader page shows the latest posts from all feeds in reverse chronological order, grouped by day, with pagination:\n\n```\n/reader/\n  index.html              # Page 1\n  partial/\n    index.html            # Page 1 partial (HTMX)\n  page/\n    2/\n      index.html          # Page 2\n      partial/\n        index.html        # Page 2 partial (HTMX)\n    3/\n      index.html\n      partial/\n        index.html\n```\n\n**Default layout:**\n- Editorial header with page stats\n- Type switch links between the full reader and any typed readers\n- Entries grouped by day with a large date rail\n- Two-column entry grid on desktop, single column on mobile\n- Each entry shows: source favicon, source name, date, title, description, optional image\n- Links to the original article\n- Hacker News and Lobsters discussion URLs are normalized to the outbound article URL when one is available. Lobsters RSS feeds that already link directly to articles retain their discussion permalinks from the GUID or comments field. The original discussions remain available as \"Found on HN\" or \"Found on Lobsters\", alongside the feed source label\n- Pagination navigation (when more than one page)\n- Offscreen reader cards after the first four in each day group may skip layout and paint in supporting browsers via CSS `content-visibility`; the full HTML, links, and no-JavaScript navigation remain available. Preview images and source icons load lazily and decode asynchronously.\n\nGhost-hosted PNG, JPEG, and WebP previews with an existing `storage.ghost.io`\nwidth URL include responsive candidates. The browser selects a width for the\ncard and screen density, including when JavaScript is disabled. The original\nimage remains the fallback; other providers and GIF/SVG previews keep their\nexisting URLs. Custom reader templates can use `entry.image_srcset` with\n`sizes=\"100vw\"` on lazy images.\n\n### Community aggregators: Lobsters, Lemmy and Reddit\n\nThe reader preserves the original discussion permalink alongside a linked external article. For Lemmy community RSS feeds, `\u003clink\u003e` normally points to the article, and a `\u003cguid\u003e` or `\u003ccomments\u003e` permalink can point to the Lemmy discussion. For Reddit's Atom feeds, posts remain linked to Reddit unless an explicit `[link]` anchor in the entry content provides an external article URL; text-only posts remain on Reddit. Unknown or blocked feeds retain the normal fallback behavior, and arbitrary links in a post body are not promoted to articles.\n\nExample subscriptions:\n\n```toml\n[[markata-go.blogroll.feeds]]\nurl = \"https://lemmy.world/feeds/c/selfhosted.xml\"\ntitle = \"Lemmy: Selfhosted\"\n\n[[markata-go.blogroll.feeds]]\nurl = \"https://www.reddit.com/r/selfhosted/.rss\"\ntitle = \"Reddit: Selfhosted\"\n```\n\n**Reddit deprecation:** Reddit [announced](https://www.reddit.com/r/modnews/comments/1wubgvt/) that its native RSS feeds will stop working on **November 13, 2026**. The Reddit example is temporary and should not be relied on for new long-term subscriptions; no unauthenticated replacement is promised. Lemmy provides supported native RSS feeds. Feed refreshes may also be rate-limited by individual communities.\n\nIf you assign feed types, markata-go also generates typed reader pages:\n\n```text\n/reader/           # all feeds\n/reader/written/   # written feeds only\n/reader/video/     # video feeds only\n/reader/podcast/   # podcast feeds only\n```\n\n**Deterministic ordering:**\n1. Most recent publish/update date first\n2. Feed URL (ascending)\n3. Entry ID (ascending)\n4. Title (ascending)\n\n## Custom Templates\n\nCreate custom templates for full control over the appearance.\n\n### Blogroll Template\n\nCreate `templates/blogroll.html`:\n\n```html\n{% extends \"base.html\" %}\n\n{% block content %}\n\u003cmain class=\"blogroll\"\u003e\n  \u003ch1\u003e{{ title }}\u003c/h1\u003e\n  \u003cp class=\"subtitle\"\u003e{{ feed_count }} blogs I follow\u003c/p\u003e\n\n  {% for category in categories %}\n  \u003csection class=\"category\" id=\"{{ category.Slug }}\"\u003e\n    \u003ch2\u003e{{ category.Name }}\u003c/h2\u003e\n    \u003cdiv class=\"feed-grid\"\u003e\n      {% for feed in category.Feeds %}\n      \u003carticle class=\"feed-card\"\u003e\n        {% if feed.ImageURL %}\n        \u003cimg src=\"{{ feed.ImageURL }}\" alt=\"{{ feed.Title }}\" class=\"feed-icon\"\u003e\n        {% endif %}\n        \u003ch3\u003e\n          {% if feed.SiteURL %}\n          \u003ca href=\"{{ feed.SiteURL }}\" target=\"_blank\" rel=\"noopener\"\u003e{{ feed.Title }}\u003c/a\u003e\n          {% else %}\n          {{ feed.Title }}\n          {% endif %}\n        \u003c/h3\u003e\n        {% if feed.Description %}\n        \u003cp class=\"description\"\u003e{{ feed.Description }}\u003c/p\u003e\n        {% endif %}\n        \u003cdiv class=\"meta\"\u003e\n          \u003cspan class=\"post-count\"\u003e{{ feed.EntryCount }} posts\u003c/span\u003e\n          \u003ca href=\"{{ feed.FeedURL }}\" class=\"feed-link\" title=\"RSS Feed\"\u003e\n            \u003csvg\u003e\u003c!-- RSS icon --\u003e\u003c/svg\u003e\n          \u003c/a\u003e\n        \u003c/div\u003e\n      \u003c/article\u003e\n      {% endfor %}\n    \u003c/div\u003e\n  \u003c/section\u003e\n  {% endfor %}\n\u003c/main\u003e\n{% endblock %}\n```\n\n### Reader Template\n\nCreate `templates/reader.html`:\n\n```html\n{% extends \"base.html\" %}\n\n{% block content %}\n\u003cdiv class=\"reader-page\"\u003e\n  \u003ch1\u003e{{ title }}\u003c/h1\u003e\n  \u003cp class=\"reader-subtitle\"\u003eLatest posts from blogs I follow\u003c/p\u003e\n\n  \u003cdiv class=\"reader-stream posts-list\"\u003e\n    {% for day in day_groups %}\n    \u003csection class=\"reader-day\"\u003e\n      \u003caside class=\"reader-day-rail\"\u003e\n        \u003ctime{% if day.date_iso %} datetime=\"{{ day.date_iso }}\"{% endif %}\u003e\n          \u003cspan class=\"reader-day-weekday\"\u003e{{ day.weekday }}\u003c/span\u003e\n          \u003cspan class=\"reader-day-title\"\u003e{{ day.title }}\u003c/span\u003e\n          {% if day.year %}\u003cspan class=\"reader-day-year\"\u003e{{ day.year }}\u003c/span\u003e{% endif %}\n        \u003c/time\u003e\n        \u003cspan class=\"reader-day-count\"\u003e{{ day.count }} stories\u003c/span\u003e\n      \u003c/aside\u003e\n\n      \u003cdiv class=\"reader-day-entries\"\u003e\n        {% for entry in day.entries %}\n        \u003carticle class=\"reader-entry{% if entry.image_url %} has-image{% endif %}\"\u003e\n          \u003cdiv class=\"reader-entry-meta-row\"\u003e\n            \u003ca href=\"{{ entry.feed_url }}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"reader-entry-source-link\"\u003e\n              {% if entry.source_icon_url %}\n              \u003cimg src=\"{{ entry.source_icon_url }}\" alt=\"\" class=\"reader-entry-source-icon\" width=\"16\" height=\"16\" loading=\"lazy\"\u003e\n              {% else %}\n              \u003cspan class=\"reader-entry-source-icon reader-entry-source-icon--fallback\" aria-hidden=\"true\"\u003e\u003c/span\u003e\n              {% endif %}\n              \u003cspan class=\"reader-entry-source\"\u003e{{ entry.feed_title }}\u003c/span\u003e\n            \u003c/a\u003e\n            {% if entry.published_datetime %}\n            \u003ctime datetime=\"{{ entry.published_datetime }}\"\u003e{{ entry.published_label }}\u003c/time\u003e\n            {% endif %}\n          \u003c/div\u003e\n\n          {% if entry.original_url %}\n          \u003cdiv class=\"reader-entry-found-on\"\u003eFound on HN: \u003ca href=\"{{ entry.original_url }}\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ediscussion\u003c/a\u003e\u003c/div\u003e\n          {% endif %}\n\n          \u003ch2 class=\"reader-entry-title\"\u003e\n            \u003ca href=\"{{ entry.url }}\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e{{ entry.title }}\u003cspan class=\"visually-hidden\"\u003e(opens in new tab)\u003c/span\u003e\u003c/a\u003e\n          \u003c/h2\u003e\n\n          {% if entry.description %}\n          \u003cp class=\"reader-entry-description\"\u003e{{ entry.description|striptags|truncate:200 }}\u003c/p\u003e\n          {% endif %}\n\n          {% if entry.image_url %}\n          \u003ca href=\"{{ entry.url }}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"reader-entry-image-link\"\u003e\n            \u003cimg src=\"{{ entry.image_url }}\" alt=\"\" class=\"reader-entry-image\" width=\"960\" height=\"540\" loading=\"lazy\"\u003e\n          \u003c/a\u003e\n          {% endif %}\n        \u003c/article\u003e\n        {% endfor %}\n      \u003c/div\u003e\n    \u003c/section\u003e\n    {% endfor %}\n  \u003c/div\u003e\n\u003c/div\u003e\n{% endblock %}\n```\n\n## Template Variables\n\n### Blogroll Template Variables\n\n| Variable | Type | Description |\n|----------|------|-------------|\n| `title` | string | Page title (\"Blogroll\") |\n| `description` | string | Page description |\n| `feeds` | []ExternalFeed | All feeds |\n| `categories` | []BlogrollCategory | Feeds grouped by category |\n| `feed_count` | int | Total number of feeds |\n\n### Reader Template Variables\n\n| Variable | Type | Description |\n|----------|------|-------------|\n| `title` | string | Page title (\"Reader\") |\n| `description` | string | Page description |\n| `entries` | []ExternalEntry | Entries for current page (newest first) |\n| `day_groups` | []ReaderDayGroup | Entries grouped by day for the curated layout |\n| `entry_count` | int | Total number of entries across all pages |\n| `page` | ReaderPage | Pagination information |\n| `pagination_type` | string | Pagination type (\"manual\", \"htmx\", \"js\") |\n| `original_url` | string | Original discussion link when a feed entry was normalized |\n\n### ReaderPage Fields\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `number` | int | Current page number (1-indexed) |\n| `has_prev` | bool | True if previous page exists |\n| `has_next` | bool | True if next page exists |\n| `prev_url` | string | URL of previous page |\n| `next_url` | string | URL of next page |\n| `total_pages` | int | Total number of pages |\n| `total_items` | int | Total number of entries |\n| `items_per_page` | int | Entries per page |\n| `page_urls` | []string | URLs for all pages |\n| `pagination_type` | string | Pagination type |\n\n### ReaderDayGroup Fields\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `date_iso` | string | ISO-8601 day timestamp for the rail |\n| `weekday` | string | Short weekday label |\n| `title` | string | Short month/day label |\n| `year` | string | Year label |\n| `count` | int | Entries in the day group |\n| `entries` | []map[string]interface{} | Entry maps for the group |\n\n### ExternalFeed Fields\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `Title` | string | Feed title |\n| `Description` | string | Feed description |\n| `SiteURL` | string | Main website URL |\n| `FeedURL` | string | RSS/Atom feed URL |\n| `ImageURL` | string | Feed logo/icon |\n| `Category` | string | Feed category |\n| `Tags` | []string | Feed tags |\n| `EntryCount` | int | Number of entries |\n| `Entries` | []ExternalEntry | Feed entries |\n| `LastFetched` | *time.Time | When feed was last fetched |\n| `LastUpdated` | *time.Time | Feed's last update date |\n| `Error` | string | Error message if fetch failed |\n\n### ExternalEntry Fields\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `Title` | string | Entry title |\n| `URL` | string | Link to full article |\n| `Description` | string | Summary or excerpt |\n| `Content` | string | Full content (HTML) |\n| `Author` | string | Entry author |\n| `Published` | *time.Time | Publication date |\n| `Updated` | *time.Time | Last update date |\n| `Categories` | []string | Entry categories/tags |\n| `ImageURL` | string | Featured image |\n| `ReadingTime` | int | Estimated reading time (minutes) |\n| `FeedURL` | string | Source feed URL |\n| `FeedTitle` | string | Source feed title |\n\nReader entry maps also include `source_icon_url`, `published_datetime`, `published_label`, and `date_key` for the redesigned layout.\n\n### BlogrollCategory Fields\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `Name` | string | Category name |\n| `Slug` | string | URL-safe identifier |\n| `Feeds` | []ExternalFeed | Feeds in this category |\n\n## Caching\n\nThe blogroll plugin caches fetched feeds to avoid hitting external servers on every build.\n\n### Cache Configuration\n\n```toml\n[markata-go.blogroll]\ncache_dir = \"cache/blogroll\"    # Cache directory\ncache_duration = \"24h\"          # How long to cache feeds\nrefresh_on_build = false         # Reuse cache during builds; refresh with `reader update`\n```\n\n### Cache Behavior\n\n1. `markata-go reader update` is the explicit cache refresh command for blogroll and reader feeds\n2. When `refresh_on_build = false`, normal builds reuse cached feed data and do not make remote refresh requests\n3. When `refresh_on_build = true`, builds use cached feeds until `cache_duration` expires, then refresh as needed\n4. Expiration is based on the cached feed's recorded fetch time, not file mtimes\n5. If a refresh fails, the stale cached feed is reused instead of failing open\n6. Explicit config overrides like `title`, `description`, `site_url`, `image_url`, `handle`, aliases, category, and tags are reapplied even when cached feed data is reused\n7. Delete `cache/blogroll/` to force a fresh fetch\n\n### Cache Duration Examples\n\n```toml\ncache_duration = \"30m\"    # 30 minutes\ncache_duration = \"1h\"     # 1 hour\ncache_duration = \"6h\"     # 6 hours\ncache_duration = \"24h\"    # 1 day (default)\ncache_duration = \"168h\"   # 1 week\n```\n\n**Recommendations:**\n- Development: `\"30m\"` to `\"1h\"` - Good balance without hammering feeds\n- Production: `\"24h\"` to `\"168h\"` - Prioritize build speed and stable caches\n- High-traffic: `\"24h\"` or more - Reduce external requests\n\n## Error Handling\n\nWhen a feed fails to fetch, the plugin:\n\n1. Records the error in `feed.Error`\n2. Continues processing other feeds\n3. Includes the feed in the blogroll (with error indicator)\n4. Uses cached data if available\n\n### Handling Errors in Templates\n\n```html\n{% for feed in feeds %}\n\u003carticle class=\"feed-card {% if feed.Error %}feed-error{% endif %}\"\u003e\n  \u003ch3\u003e{{ feed.Title }}\u003c/h3\u003e\n  {% if feed.Error %}\n  \u003cp class=\"error\"\u003eUnable to fetch: {{ feed.Error }}\u003c/p\u003e\n  {% else %}\n  \u003cp\u003e{{ feed.EntryCount }} posts\u003c/p\u003e\n  {% endif %}\n\u003c/article\u003e\n{% endfor %}\n```\n\n## Screenshot Service Integration\n\nMany RSS feed entries don't include featured images. The `fallback_image_service` option lets you automatically generate preview images using screenshot services.\n\n### Configuration\n\nSet a URL template with `{url}` as a placeholder for the entry URL:\n\n```toml\n[blogroll]\nenabled = true\nfallback_image_service = \"https://shots.so/s/{url}\"\n```\n\nWhen an entry doesn't have an `image_url`, markata-go will:\n1. URL-encode the entry's URL\n2. Replace `{url}` in the template with the encoded URL\n3. Use the resulting URL as the fallback image\n\n### Popular Screenshot Services\n\n#### shots.so (Free)\n\n[shots.so](https://shots.so/) provides free website screenshots with no API key required:\n\n```toml\nfallback_image_service = \"https://shots.so/s/{url}\"\n```\n\nFeatures:\n- No registration or API key needed\n- Automatic caching of screenshots\n- Customizable viewport and device type\n\nFor custom parameters:\n\n```toml\nfallback_image_service = \"https://shots.so/s/{url}?width=1200\u0026height=630\"\n```\n\n#### API Flash\n\n[API Flash](https://apiflash.com/) offers high-quality screenshots with customization:\n\n```toml\nfallback_image_service = \"https://api.apiflash.com/v1/urltoimage?access_key=YOUR_ACCESS_KEY\u0026url={url}\u0026width=1200\u0026height=630\"\n```\n\nFeatures:\n- Requires API key (free tier available)\n- Extensive customization options\n- Reliable caching and CDN delivery\n\nGet your access key from [apiflash.com](https://apiflash.com/).\n\n#### ScreenshotOne\n\n[ScreenshotOne](https://screenshotone.com/) provides API-based screenshot generation:\n\n```toml\nfallback_image_service = \"https://api.screenshotone.com/take?access_key=YOUR_ACCESS_KEY\u0026url={url}\u0026viewport_width=1200\u0026viewport_height=630\u0026image_quality=80\"\n```\n\nFeatures:\n- API key required (free tier available)\n- Advanced rendering options\n- GDPR compliant\n\nGet your access key from [screenshotone.com](https://screenshotone.com/).\n\n### URL Encoding\n\nThe `{url}` placeholder is automatically URL-encoded, so you don't need to manually encode it. For example:\n\n```\nEntry URL: https://example.com/blog/post?id=123\u0026ref=home\nEncoded:   https%3A%2F%2Fexample.com%2Fblog%2Fpost%3Fid%3D123%26ref%3Dhome\nResult:    https://shots.so/s/https%3A%2F%2Fexample.com%2Fblog%2Fpost%3Fid%3D123%26ref%3Dhome\n```\n\n### Rate Limits and Caching\n\n**Important considerations:**\n\n1. **Rate Limits** - Most screenshot services have rate limits on their free tiers. If you have many feeds with many entries, you may hit these limits during builds.\n\n2. **Build Time** - Screenshot services generate images on-demand, which can slow down your first build. Subsequent builds are faster as services cache screenshots.\n\n3. **Service Caching** - Screenshots are typically cached by the service, so the same URL will return quickly on subsequent requests.\n\n4. **Local Caching** - Consider the blogroll plugin's `cache_duration` setting to reduce build frequency and screenshot service requests:\n\n```toml\n[blogroll]\ncache_duration = \"6h\"    # Reduces rebuild frequency\nfallback_image_service = \"https://shots.so/s/{url}\"\n```\n\n5. **Cost Considerations** - For high-traffic sites or large blogrolls, consider:\n   - Using services with generous free tiers (like shots.so)\n   - Limiting `max_entries_per_feed` to reduce screenshot requests\n   - Increasing `cache_duration` to minimize rebuilds\n   - Upgrading to paid tiers for higher rate limits\n\n### Example Configuration\n\n```toml\n[blogroll]\nenabled = true\ncache_duration = \"6h\"              # Cache for 6 hours to reduce rebuilds\nmax_entries_per_feed = 20          # Limit entries to reduce screenshot requests\nfallback_image_service = \"https://shots.so/s/{url}?width=1200\u0026height=630\"\n\n[[blogroll.feeds]]\nurl = \"https://simonwillison.net/atom/everything/\"\ntitle = \"Simon Willison\"\ncategory = \"Technology\"\n```\n\nWith this configuration, the Reader uses a preview hierarchy for entries without article images:\n\n1. article image from the feed entry\n2. source image from the feed avatar/logo\n3. screenshot fallback from `fallback_image_service`\n4. branded source tile when no image is available\n\nThis keeps the Reader more consistent and reduces the visual noise from arbitrary webpage screenshots.\n\nYouTube feeds also use the per-video thumbnail automatically, so video channels show the actual video art in `/reader/` instead of a generic source tile or screenshot.\n\n## Performance Tips\n\n### Optimize Build Times\n\n1. **Increase cache duration** for production builds\n2. **Limit `max_entries_per_feed`** if you only need recent posts\n3. **Reduce `concurrent_requests`** if you're hitting rate limits\n4. **Disable inactive feeds** with `active = false` instead of removing them\n\n### Example Production Config\n\n```toml\n[markata-go.blogroll]\nenabled = true\ncache_dir = \"cache/blogroll\"\ncache_duration = \"6h\"           # Cache for 6 hours\ntimeout = 15                    # Shorter timeout\nconcurrent_requests = 3         # Be nice to servers\nmax_entries_per_feed = 20       # Only recent posts\n```\n\n## Configuration Reference\n\n### Full Configuration\n\n```toml\n[markata-go.blogroll]\n# Enable/disable the entire feature\nenabled = true\n\n# Cache settings\ncache_dir = \"cache/blogroll\"\ncache_duration = \"1h\"\n\n# HTTP settings\ntimeout = 30\nconcurrent_requests = 5\nmax_entries_per_feed = 50\n\n# Pagination settings\nitems_per_page = 50\norphan_threshold = 3\npagination_type = \"manual\"    # \"manual\", \"htmx\", or \"js\"\n\n# Screenshot service for last-resort Reader previews\nfallback_image_service = \"\"   # Used only after article and source images are exhausted\n\n# Custom templates\n[blogroll.templates]\nblogroll = \"blogroll.html\"\nreader = \"reader.html\"\n\n# Feeds\n[[markata-go.blogroll.feeds]]\nurl = \"https://example.com/feed.xml\"\ntitle = \"Example\"\ndescription = \"Description\"\ncategory = \"Category\"\ntags = [\"tag1\", \"tag2\"]\nsite_url = \"https://example.com\"\nimage_url = \"https://example.com/logo.png\"\nactive = true\nmax_entries = 50              # Override global max_entries_per_feed\n```\n\n### Configuration Fields\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | bool | `false` | Enable blogroll plugin |\n| `cache_dir` | string | `\"cache/blogroll\"` | Cache directory |\n| `cache_duration` | string | `\"24h\"` | Cache TTL (Go duration) |\n| `refresh_on_build` | bool | `false` | Allow builds to refresh remote blogroll feeds |\n| `timeout` | int | `30` | HTTP timeout in seconds |\n| `concurrent_requests` | int | `5` | Max parallel fetches |\n| `max_entries_per_feed` | int | `50` | Global max entries per feed |\n| `items_per_page` | int | `50` | Entries per reader page |\n| `orphan_threshold` | int | `3` | Min entries for separate page |\n| `pagination_type` | string | `\"manual\"` | Pagination style |\n| `fallback_image_service` | string | `\"\"` | Last-resort screenshot template for Reader previews |\n| `feeds` | []Feed | `[]` | List of feeds |\n| `templates.blogroll` | string | `\"blogroll.html\"` | Blogroll template |\n| `templates.reader` | string | `\"reader.html\"` | Reader template |\n\n---\n\n## Fast Builds During Development\n\nWhen working on large sites with many blogroll feeds, the best default is usually to keep blogroll pages enabled while separating refresh from normal builds.\n\n### Keep Blogroll Pages, Skip Refresh During Builds\n\n```toml\n[markata-go.blogroll]\nenabled = true\nrefresh_on_build = false\n```\n\nThen refresh on demand:\n\n```bash\nmarkata-go reader update\nmarkata-go build\n```\n\nFor one-off runs, you can also set:\n\n```bash\nMARKATA_GO_BLOGROLL_REFRESH_ON_BUILD=false markata-go build\n```\n\nIf you want the smallest possible loop, you can still disable the plugin entirely:\n\n### Disable Blogroll Via Environment Variable\n\n```bash\n# Build without fetching blogroll feeds\nMARKATA_GO_BLOGROLL_ENABLED=false markata-go build\n\n# Or combine with glob patterns to build just one post\nMARKATA_GO_GLOB_PATTERNS=\"posts/my-draft.md\" MARKATA_GO_BLOGROLL_ENABLED=false markata-go build\n```\n\n### Using a Local .env File\n\nCreate a `.env.local` file (and add it to `.gitignore`):\n\n```bash\n# .env.local\nMARKATA_GO_BLOGROLL_ENABLED=false\n```\n\nThen source it before building:\n\n```bash\nsource .env.local \u0026\u0026 markata-go build\n```\n\n### When to Use Fast Builds\n\n**Use fast builds when:**\n- Writing or editing posts (blogroll content doesn't affect your writing)\n- Testing template changes\n- Running local development server\n- Debugging build issues\n\n**Use full builds when:**\n- Deploying to production\n- Testing blogroll template changes\n- Verifying complete site output\n\n### Build Time Impact\n\nBlogroll fetch times depend on:\n- Number of feeds configured\n- Feed response times\n- `concurrent_requests` setting (default: 5 parallel)\n- Cache hit rate\n\nFor a blogroll with 20 feeds, expect:\n- **First build:** 5-15 seconds (fetching all feeds)\n- **Cached build:** 0.5-2 seconds (using cached feeds)\n- **Disabled:** 0 seconds (blogroll plugin skipped entirely)\n\n---\n\n## Next Steps\n\n- [Feeds Guide](/docs/guides/feeds/) - Create feeds from your own content\n- [Templates Guide](/docs/guides/templates/) - Customize blogroll appearance\n- [Syndication Guide](/docs/guides/syndication-feeds/) - Share your own content via RSS\n\n---\n\n## See Also\n\n- [Configuration Guide](/docs/guides/configuration/) - Full configuration reference\n- [Themes Guide](/docs/guides/themes/) - Style your blogroll with themes\n",
      "summary": "Create a blogroll of blogs you follow and a reader page showing their latest posts",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "blogroll",
        "rss",
        "feeds"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/analytics/",
      "url": "https://markata.dev/docs/guides/analytics/",
      "title": "Analytics \u0026 Visualizations",
      "content_html": "\u003cp\u003emarkata-go provides several plugins for visualizing data directly in your markdown content. This guide covers the contribution graph and chart visualization plugins.\u003c/p\u003e\n\u003ch2 id=\"contribution-graph\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContribution Graph\u003c/span\u003e \u003ca href=\"#contribution-graph\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ccode\u003econtribution_graph\u003c/code\u003e plugin renders GitHub-style calendar heatmaps showing activity over time. It uses the \u003ca href=\"https://cal-heatmap.com/\"\u003eCal-Heatmap\u003c/a\u003e library.\u003c/p\u003e\n\u003ch3 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEnable the plugin in your configuration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehooks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;contribution_graph\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econtribution_graph\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecdn_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/assets/vendor/cal-heatmap\u0026#34;\u003c/span\u003e                \u003cspan class=\"c\"\u003e# Cal-Heatmap base URL (local by default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtainer_class\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;contribution-graph-container\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etheme\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;light\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escale_max_percentile\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e                               \u003cspan class=\"c\"\u003e# Optional global outlier cap\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"configuration-options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration Options\u003c/span\u003e \u003ca href=\"#configuration-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenabled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnable/disable the plugin\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecdn_url\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/assets/vendor/cal-heatmap\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCal-Heatmap base URL (local by default)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econtainer_class\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003econtribution-graph-container\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCSS class for the container\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etheme\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003elight\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eColor theme (\u003ccode\u003elight\u003c/code\u003e or \u003ccode\u003edark\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003escale_max_percentile\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003enumber\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e0\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOptional global percentile cap for the color scale\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"basic-usage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Usage\u003c/span\u003e \u003ca href=\"#basic-usage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd a contribution graph to your markdown using a fenced code block:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e``\u003cspan class=\"sb\"\u003e`contribution-graph\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  \u0026#34;data\u0026#34;: [\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;2024-01-01\u0026#34;, \u0026#34;value\u0026#34;: 5},\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;2024-01-02\u0026#34;, \u0026#34;value\u0026#34;: 3},\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;2024-01-03\u0026#34;, \u0026#34;value\u0026#34;: 8},\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;2024-01-04\u0026#34;, \u0026#34;value\u0026#34;: 2},\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;2024-01-05\u0026#34;, \u0026#34;value\u0026#34;: 10}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  ],\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  \u0026#34;options\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    \u0026#34;domain\u0026#34;: \u0026#34;year\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    \u0026#34;subDomain\u0026#34;: \u0026#34;day\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e`\u003c/span\u003e``\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"data-format\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eData Format\u003c/span\u003e \u003ca href=\"#data-format\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe \u003ccode\u003edata\u003c/code\u003e array contains objects with:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003edate\u003c/code\u003e: Date string in ISO format (YYYY-MM-DD)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evalue\u003c/code\u003e: Numeric value that determines cell color intensity\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOptions\u003c/span\u003e \u003ca href=\"#options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOption\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edomain\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eyear\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTime domain: \u003ccode\u003eyear\u003c/code\u003e, \u003ccode\u003emonth\u003c/code\u003e, \u003ccode\u003eweek\u003c/code\u003e, \u003ccode\u003eday\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esubDomain\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eday\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSub-domain: \u003ccode\u003eday\u003c/code\u003e, \u003ccode\u003ehour\u003c/code\u003e, \u003ccode\u003eminute\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecellSize\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003enumber\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e10\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSize of each cell in pixels\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erange\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003enumber\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNumber of domain units to display\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emaxValue\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003enumber\u003c/td\u003e\n\u003ctd\u003eunset\u003c/td\u003e\n\u003ctd\u003eExplicit color-scale maximum\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emaxPercentile\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003enumber\u003c/td\u003e\n\u003ctd\u003eunset\u003c/td\u003e\n\u003ctd\u003ePer-graph percentile cap for the color scale\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"examples\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"year-view\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eYear View\u003c/span\u003e \u003ca href=\"#year-view\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eShow a full year of activity:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e``\u003cspan class=\"sb\"\u003e`contribution-graph\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  \u0026#34;data\u0026#34;: [\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;2024-01-15\u0026#34;, \u0026#34;value\u0026#34;: 5},\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;2024-02-20\u0026#34;, \u0026#34;value\u0026#34;: 8},\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;2024-03-10\u0026#34;, \u0026#34;value\u0026#34;: 3},\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;2024-06-01\u0026#34;, \u0026#34;value\u0026#34;: 12}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  ],\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  \u0026#34;options\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    \u0026#34;domain\u0026#34;: \u0026#34;year\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    \u0026#34;subDomain\u0026#34;: \u0026#34;day\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    \u0026#34;range\u0026#34;: 1\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e`\u003c/span\u003e``\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"monthly-view\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMonthly View\u003c/span\u003e \u003ca href=\"#monthly-view\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eShow activity by month:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e``\u003cspan class=\"sb\"\u003e`contribution-graph\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  \u0026#34;data\u0026#34;: [\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;2024-01-01\u0026#34;, \u0026#34;value\u0026#34;: 5},\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;2024-01-15\u0026#34;, \u0026#34;value\u0026#34;: 8},\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;2024-02-01\u0026#34;, \u0026#34;value\u0026#34;: 3}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  ],\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  \u0026#34;options\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    \u0026#34;domain\u0026#34;: \u0026#34;month\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    \u0026#34;subDomain\u0026#34;: \u0026#34;day\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    \u0026#34;range\u0026#34;: 3\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e`\u003c/span\u003e``\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"outlier-control\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOutlier Control\u003c/span\u003e \u003ca href=\"#outlier-control\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eWhen one or two very large days wash out the rest of the graph, cap the color scale at a percentile instead of the raw max:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e``\u003cspan class=\"sb\"\u003e`contribution-graph\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  \u0026#34;data\u0026#34;: [\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;2024-01-01\u0026#34;, \u0026#34;value\u0026#34;: 1},\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;2024-01-02\u0026#34;, \u0026#34;value\u0026#34;: 2},\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;2024-01-03\u0026#34;, \u0026#34;value\u0026#34;: 3},\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;2024-01-04\u0026#34;, \u0026#34;value\u0026#34;: 25}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  ],\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  \u0026#34;options\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    \u0026#34;domain\u0026#34;: \u0026#34;year\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    \u0026#34;subDomain\u0026#34;: \u0026#34;day\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    \u0026#34;range\u0026#34;: 1,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    \u0026#34;maxPercentile\u0026#34;: 95\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e`\u003c/span\u003e``\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSet \u003ccode\u003escale_max_percentile\u003c/code\u003e in config to apply the same percentile cap to every contribution graph by default.\u003c/p\u003e\n\u003ch4 id=\"tracking-blog-post-frequency\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTracking Blog Post Frequency\u003c/span\u003e \u003ca href=\"#tracking-blog-post-frequency\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eUse Jinja templating to automatically generate data from your posts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eMy Writing Activity\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e``\u003cspan class=\"sb\"\u003e`contribution-graph\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  \u0026#34;data\u0026#34;: [\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {% for post in filter(\u0026#34;published == true\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {\u0026#34;date\u0026#34;: \u0026#34;{{ post.Date.Format \u0026#34;2006-01-02\u0026#34; }}\u0026#34;, \u0026#34;value\u0026#34;: 1}{% if not loop.last %},{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  ],\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  \u0026#34;options\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    \u0026#34;domain\u0026#34;: \u0026#34;year\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e    \u0026#34;subDomain\u0026#34;: \u0026#34;day\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e`\u003c/span\u003e``\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"styling\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStyling\u003c/span\u003e \u003ca href=\"#styling\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd custom CSS to style your contribution graphs:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003econtribution-graph-container\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003emargin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eoverflow\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ehidden\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Cal-Heatmap specific overrides */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ech-domain-text\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003efill\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"kc\"\u003etext\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003emuted\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003ech-subdomain-bg\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003efill\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003esurface\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003estroke\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003ecolor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eborder\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"chart-js-charts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChart.js Charts\u003c/span\u003e \u003ca href=\"#chart-js-charts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ccode\u003echartjs\u003c/code\u003e plugin lets you embed interactive charts using \u003ca href=\"https://www.chartjs.org/\"\u003eChart.js\u003c/a\u003e.\u003c/p\u003e\n\u003ch3 id=\"configuration-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehooks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;chartjs\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003echartjs\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecdn_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/assets/vendor/chartjs/chart.min.js\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econtainer_class\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;chartjs-container\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edata_display\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;open\u0026#34;\u003c/span\u003e \u003cspan class=\"c\"\u003e# or \u0026#34;collapsed\u0026#34;; per-chart JSON can override\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor built-in figure cards, add top-level plain-text \u003ccode\u003etitle\u003c/code\u003e and/or \u003ccode\u003ecaption\u003c/code\u003e\nkeys to the chart JSON. Use \u003ccode\u003edata_display\u003c/code\u003e to choose its initial data disclosure\nstate. These keys are removed before Chart.js receives the configuration.\nSee \u003ca href=\"markdown-chart-fallback.md\"\u003echart figures and accessible fallbacks\u003c/a\u003e for\ncomplete examples and no-JavaScript behavior.\u003c/p\u003e\n\u003ch3 id=\"basic-usage-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Usage\u003c/span\u003e \u003ca href=\"#basic-usage-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate charts with JSON configuration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```chartjs\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;type\u0026#34;: \u0026#34;bar\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;data\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;labels\u0026#34;: [\u0026#34;January\u0026#34;, \u0026#34;February\u0026#34;, \u0026#34;March\u0026#34;, \u0026#34;April\u0026#34;, \u0026#34;May\u0026#34;],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;datasets\u0026#34;: [{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026#34;label\u0026#34;: \u0026#34;Posts Published\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026#34;data\u0026#34;: [3, 5, 2, 8, 4],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026#34;backgroundColor\u0026#34;: \u0026#34;rgba(54, 162, 235, 0.7)\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"supported-chart-types\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSupported Chart Types\u003c/span\u003e \u003ca href=\"#supported-chart-types\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebar\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBar chart (vertical or horizontal)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eline\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLine chart with optional fill\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epie\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePie chart\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edoughnut\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDoughnut chart\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eradar\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRadar/spider chart\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epolarArea\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePolar area chart\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebubble\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBubble chart\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003escatter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eScatter plot\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"examples-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExamples\u003c/span\u003e \u003ca href=\"#examples-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"line-chart\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLine Chart\u003c/span\u003e \u003ca href=\"#line-chart\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```chartjs\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;type\u0026#34;: \u0026#34;line\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;data\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;labels\u0026#34;: [\u0026#34;Week 1\u0026#34;, \u0026#34;Week 2\u0026#34;, \u0026#34;Week 3\u0026#34;, \u0026#34;Week 4\u0026#34;],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;datasets\u0026#34;: [{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026#34;label\u0026#34;: \u0026#34;Page Views\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026#34;data\u0026#34;: [1200, 1900, 1500, 2400],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026#34;borderColor\u0026#34;: \u0026#34;rgb(75, 192, 192)\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026#34;fill\u0026#34;: false,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026#34;tension\u0026#34;: 0.3\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"pie-chart\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePie Chart\u003c/span\u003e \u003ca href=\"#pie-chart\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```chartjs\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;type\u0026#34;: \u0026#34;pie\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;data\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;labels\u0026#34;: [\u0026#34;Tutorials\u0026#34;, \u0026#34;Guides\u0026#34;, \u0026#34;Reference\u0026#34;, \u0026#34;Blog\u0026#34;],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;datasets\u0026#34;: [{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026#34;data\u0026#34;: [35, 25, 20, 20],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026#34;backgroundColor\u0026#34;: [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#34;#ff6384\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#34;#36a2eb\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#34;#ffce56\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#34;#4bc0c0\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      ]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"advanced-options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdvanced Options\u003c/span\u003e \u003ca href=\"#advanced-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eChart.js supports extensive configuration. Add an \u003ccode\u003eoptions\u003c/code\u003e key for customization:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```chartjs\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;type\u0026#34;: \u0026#34;bar\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;data\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;labels\u0026#34;: [\u0026#34;Q1\u0026#34;, \u0026#34;Q2\u0026#34;, \u0026#34;Q3\u0026#34;, \u0026#34;Q4\u0026#34;],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;datasets\u0026#34;: [{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026#34;label\u0026#34;: \u0026#34;Revenue\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026#34;data\u0026#34;: [12000, 19000, 15000, 22000]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  },\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;options\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;responsive\u0026#34;: true,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;plugins\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026#34;title\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#34;display\u0026#34;: true,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#34;text\u0026#34;: \u0026#34;Quarterly Revenue\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      },\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026#34;legend\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#34;position\u0026#34;: \u0026#34;bottom\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    },\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;scales\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026#34;y\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#34;beginAtZero\u0026#34;: true\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"use-cases\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUse Cases\u003c/span\u003e \u003ca href=\"#use-cases\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"blog-statistics-dashboard\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBlog Statistics Dashboard\u003c/span\u003e \u003ca href=\"#blog-statistics-dashboard\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate a dedicated page showing your blog\u0026rsquo;s activity:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBlog Statistics\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epage.html\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Publishing Activity\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e```contribution-graph\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;data\u0026#34;: [...generated from posts...],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;options\u0026#34;: {\u0026#34;domain\u0026#34;: \u0026#34;year\u0026#34;, \u0026#34;subDomain\u0026#34;: \u0026#34;day\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"content-by-category\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContent by Category\u003c/span\u003e \u003ca href=\"#content-by-category\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"chartjs-container\"\u003e\n  \u003ccanvas id=\"chartjs-2\" hidden role=\"img\" aria-label=\"Chart visualization; expand Chart data for exact values\"\u003e\u003c/canvas\u003e\n  \u003cdiv id=\"chartjs-2-data\"\u003e\u003cdetails class=\"chartjs-data\" open\u003e\u003csummary\u003eChart data\u003c/summary\u003e\u003ctable\u003e\u003ccaption\u003eChart data\u003c/caption\u003e\u003cthead\u003e\u003ctr\u003e\u003cth scope=\"col\"\u003eLabel\u003c/th\u003e\u003cth scope=\"col\"\u003eSeries 1\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eGo\u003c/th\u003e\u003ctd\u003e15\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003ePython\u003c/th\u003e\u003ctd\u003e12\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eDevOps\u003c/th\u003e\u003ctd\u003e8\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003cth scope=\"row\"\u003eOther\u003c/th\u003e\u003ctd\u003e5\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/details\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cpre\u003e\u003ccode\u003e\n### Project Documentation\n\nTrack development activity or feature completion:\n\n```markdown\n## Development Progress\n\n```chartjs\n{\n  \u0026quot;type\u0026quot;: \u0026quot;bar\u0026quot;,\n  \u0026quot;data\u0026quot;: {\n    \u0026quot;labels\u0026quot;: [\u0026quot;Features\u0026quot;, \u0026quot;Bug Fixes\u0026quot;, \u0026quot;Tests\u0026quot;, \u0026quot;Docs\u0026quot;],\n    \u0026quot;datasets\u0026quot;: [{\n      \u0026quot;label\u0026quot;: \u0026quot;Completed\u0026quot;,\n      \u0026quot;data\u0026quot;: [12, 8, 25, 15],\n      \u0026quot;backgroundColor\u0026quot;: \u0026quot;#4CAF50\u0026quot;\n    }, {\n      \u0026quot;label\u0026quot;: \u0026quot;In Progress\u0026quot;,\n      \u0026quot;data\u0026quot;: [3, 2, 5, 2],\n      \u0026quot;backgroundColor\u0026quot;: \u0026quot;#FFC107\u0026quot;\n    }]\n  },\n  \u0026quot;options\u0026quot;: {\n    \u0026quot;indexAxis\u0026quot;: \u0026quot;y\u0026quot;\n  }\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003e\n---\n\n## Related\n\n- [[configuration-guide|Configuration Guide]] - Full configuration reference\n- [[markdown|Markdown Features]] - Other markdown extensions\n- [[templates|Templates]] - Using Jinja in markdown\n\u003c/code\u003e\u003c/pre\u003e\n\n\u003cscript src=\"/assets/vendor/chartjs/chart.min.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n(function() {\nconst initCharts = function() {\n  (function() {\n    const ctx = document.getElementById('chartjs-2');\n    if (!ctx || typeof Chart !== 'function') return;\n    ctx.hidden = false;\n    try {\n      new Chart(ctx, {\"data\":{\"datasets\":[{\"data\":[15,12,8,5]}],\"labels\":[\"Go\",\"Python\",\"DevOps\",\"Other\"]},\"type\":\"pie\"});\n      const data = document.getElementById('chartjs-2-data');\n      if (data) data.open = false;\n    } catch (error) {\n      ctx.hidden = true;\n    }\n  })();\n};\nif (document.readyState === 'loading') {\n  document.addEventListener('DOMContentLoaded', initCharts, {once: true});\n} else {\n  initCharts();\n}\n})();\n\u003c/script\u003e",
      "content_text": "\n\nmarkata-go provides several plugins for visualizing data directly in your markdown content. This guide covers the contribution graph and chart visualization plugins.\n\n## Contribution Graph\n\nThe `contribution_graph` plugin renders GitHub-style calendar heatmaps showing activity over time. It uses the [Cal-Heatmap](https://cal-heatmap.com/) library.\n\n### Configuration\n\nEnable the plugin in your configuration:\n\n```toml\n[markata-go]\nhooks = [\"default\", \"contribution_graph\"]\n\n[markata-go.contribution_graph]\nenabled = true\ncdn_url = \"/assets/vendor/cal-heatmap\"                # Cal-Heatmap base URL (local by default)\ncontainer_class = \"contribution-graph-container\"\ntheme = \"light\"\nscale_max_percentile = 0                               # Optional global outlier cap\n```\n\n### Configuration Options\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `enabled` | bool | `true` | Enable/disable the plugin |\n| `cdn_url` | string | `/assets/vendor/cal-heatmap` | Cal-Heatmap base URL (local by default) |\n| `container_class` | string | `contribution-graph-container` | CSS class for the container |\n| `theme` | string | `light` | Color theme (`light` or `dark`) |\n| `scale_max_percentile` | number | `0` | Optional global percentile cap for the color scale |\n\n### Basic Usage\n\nAdd a contribution graph to your markdown using a fenced code block:\n\n````markdown\n```contribution-graph\n{\n  \"data\": [\n    {\"date\": \"2024-01-01\", \"value\": 5},\n    {\"date\": \"2024-01-02\", \"value\": 3},\n    {\"date\": \"2024-01-03\", \"value\": 8},\n    {\"date\": \"2024-01-04\", \"value\": 2},\n    {\"date\": \"2024-01-05\", \"value\": 10}\n  ],\n  \"options\": {\n    \"domain\": \"year\",\n    \"subDomain\": \"day\"\n  }\n}\n```\n````\n\n### Data Format\n\nThe `data` array contains objects with:\n- `date`: Date string in ISO format (YYYY-MM-DD)\n- `value`: Numeric value that determines cell color intensity\n\n### Options\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `domain` | string | `year` | Time domain: `year`, `month`, `week`, `day` |\n| `subDomain` | string | `day` | Sub-domain: `day`, `hour`, `minute` |\n| `cellSize` | number | `10` | Size of each cell in pixels |\n| `range` | number | `1` | Number of domain units to display |\n| `maxValue` | number | unset | Explicit color-scale maximum |\n| `maxPercentile` | number | unset | Per-graph percentile cap for the color scale |\n\n### Examples\n\n#### Year View\n\nShow a full year of activity:\n\n````markdown\n```contribution-graph\n{\n  \"data\": [\n    {\"date\": \"2024-01-15\", \"value\": 5},\n    {\"date\": \"2024-02-20\", \"value\": 8},\n    {\"date\": \"2024-03-10\", \"value\": 3},\n    {\"date\": \"2024-06-01\", \"value\": 12}\n  ],\n  \"options\": {\n    \"domain\": \"year\",\n    \"subDomain\": \"day\",\n    \"range\": 1\n  }\n}\n```\n````\n\n#### Monthly View\n\nShow activity by month:\n\n````markdown\n```contribution-graph\n{\n  \"data\": [\n    {\"date\": \"2024-01-01\", \"value\": 5},\n    {\"date\": \"2024-01-15\", \"value\": 8},\n    {\"date\": \"2024-02-01\", \"value\": 3}\n  ],\n  \"options\": {\n    \"domain\": \"month\",\n    \"subDomain\": \"day\",\n    \"range\": 3\n  }\n}\n```\n````\n\n#### Outlier Control\n\nWhen one or two very large days wash out the rest of the graph, cap the color scale at a percentile instead of the raw max:\n\n````markdown\n```contribution-graph\n{\n  \"data\": [\n    {\"date\": \"2024-01-01\", \"value\": 1},\n    {\"date\": \"2024-01-02\", \"value\": 2},\n    {\"date\": \"2024-01-03\", \"value\": 3},\n    {\"date\": \"2024-01-04\", \"value\": 25}\n  ],\n  \"options\": {\n    \"domain\": \"year\",\n    \"subDomain\": \"day\",\n    \"range\": 1,\n    \"maxPercentile\": 95\n  }\n}\n```\n````\n\nSet `scale_max_percentile` in config to apply the same percentile cap to every contribution graph by default.\n\n#### Tracking Blog Post Frequency\n\nUse Jinja templating to automatically generate data from your posts:\n\n````markdown\n---\ntitle: My Writing Activity\njinja: true\n---\n\n```contribution-graph\n{\n  \"data\": [\n    {% for post in filter(\"published == true\") %}\n    {\"date\": \"{{ post.Date.Format \"2006-01-02\" }}\", \"value\": 1}{% if not loop.last %},{% endif %}\n    {% endfor %}\n  ],\n  \"options\": {\n    \"domain\": \"year\",\n    \"subDomain\": \"day\"\n  }\n}\n```\n````\n\n### Styling\n\nAdd custom CSS to style your contribution graphs:\n\n```css\n.contribution-graph-container {\n  margin: 2rem 0;\n  overflow: hidden;\n}\n\n/* Cal-Heatmap specific overrides */\n.ch-domain-text {\n  fill: var(--color-text-muted);\n}\n\n.ch-subdomain-bg {\n  fill: var(--color-surface);\n  stroke: var(--color-border);\n}\n```\n\n---\n\n## Chart.js Charts\n\nThe `chartjs` plugin lets you embed interactive charts using [Chart.js](https://www.chartjs.org/).\n\n### Configuration\n\n```toml\n[markata-go]\nhooks = [\"default\", \"chartjs\"]\n\n[markata-go.chartjs]\nenabled = true\ncdn_url = \"/assets/vendor/chartjs/chart.min.js\"\ncontainer_class = \"chartjs-container\"\ndata_display = \"open\" # or \"collapsed\"; per-chart JSON can override\n```\n\nFor built-in figure cards, add top-level plain-text `title` and/or `caption`\nkeys to the chart JSON. Use `data_display` to choose its initial data disclosure\nstate. These keys are removed before Chart.js receives the configuration.\nSee [chart figures and accessible fallbacks](markdown-chart-fallback.md) for\ncomplete examples and no-JavaScript behavior.\n\n### Basic Usage\n\nCreate charts with JSON configuration:\n\n````markdown\n```chartjs\n{\n  \"type\": \"bar\",\n  \"data\": {\n    \"labels\": [\"January\", \"February\", \"March\", \"April\", \"May\"],\n    \"datasets\": [{\n      \"label\": \"Posts Published\",\n      \"data\": [3, 5, 2, 8, 4],\n      \"backgroundColor\": \"rgba(54, 162, 235, 0.7)\"\n    }]\n  }\n}\n```\n````\n\n### Supported Chart Types\n\n| Type | Description |\n|------|-------------|\n| `bar` | Bar chart (vertical or horizontal) |\n| `line` | Line chart with optional fill |\n| `pie` | Pie chart |\n| `doughnut` | Doughnut chart |\n| `radar` | Radar/spider chart |\n| `polarArea` | Polar area chart |\n| `bubble` | Bubble chart |\n| `scatter` | Scatter plot |\n\n### Examples\n\n#### Line Chart\n\n````markdown\n```chartjs\n{\n  \"type\": \"line\",\n  \"data\": {\n    \"labels\": [\"Week 1\", \"Week 2\", \"Week 3\", \"Week 4\"],\n    \"datasets\": [{\n      \"label\": \"Page Views\",\n      \"data\": [1200, 1900, 1500, 2400],\n      \"borderColor\": \"rgb(75, 192, 192)\",\n      \"fill\": false,\n      \"tension\": 0.3\n    }]\n  }\n}\n```\n````\n\n#### Pie Chart\n\n````markdown\n```chartjs\n{\n  \"type\": \"pie\",\n  \"data\": {\n    \"labels\": [\"Tutorials\", \"Guides\", \"Reference\", \"Blog\"],\n    \"datasets\": [{\n      \"data\": [35, 25, 20, 20],\n      \"backgroundColor\": [\n        \"#ff6384\",\n        \"#36a2eb\",\n        \"#ffce56\",\n        \"#4bc0c0\"\n      ]\n    }]\n  }\n}\n```\n````\n\n### Advanced Options\n\nChart.js supports extensive configuration. Add an `options` key for customization:\n\n````markdown\n```chartjs\n{\n  \"type\": \"bar\",\n  \"data\": {\n    \"labels\": [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n    \"datasets\": [{\n      \"label\": \"Revenue\",\n      \"data\": [12000, 19000, 15000, 22000]\n    }]\n  },\n  \"options\": {\n    \"responsive\": true,\n    \"plugins\": {\n      \"title\": {\n        \"display\": true,\n        \"text\": \"Quarterly Revenue\"\n      },\n      \"legend\": {\n        \"position\": \"bottom\"\n      }\n    },\n    \"scales\": {\n      \"y\": {\n        \"beginAtZero\": true\n      }\n    }\n  }\n}\n```\n````\n\n---\n\n## Use Cases\n\n### Blog Statistics Dashboard\n\nCreate a dedicated page showing your blog's activity:\n\n```markdown\n---\ntitle: Blog Statistics\ntemplate: page.html\njinja: true\n---\n\n## Publishing Activity\n\n```contribution-graph\n{\n  \"data\": [...generated from posts...],\n  \"options\": {\"domain\": \"year\", \"subDomain\": \"day\"}\n}\n```\n\n## Content by Category\n\n```chartjs\n{\n  \"type\": \"pie\",\n  \"data\": {\n    \"labels\": [\"Go\", \"Python\", \"DevOps\", \"Other\"],\n    \"datasets\": [{\"data\": [15, 12, 8, 5]}]\n  }\n}\n```\n```\n\n### Project Documentation\n\nTrack development activity or feature completion:\n\n```markdown\n## Development Progress\n\n```chartjs\n{\n  \"type\": \"bar\",\n  \"data\": {\n    \"labels\": [\"Features\", \"Bug Fixes\", \"Tests\", \"Docs\"],\n    \"datasets\": [{\n      \"label\": \"Completed\",\n      \"data\": [12, 8, 25, 15],\n      \"backgroundColor\": \"#4CAF50\"\n    }, {\n      \"label\": \"In Progress\",\n      \"data\": [3, 2, 5, 2],\n      \"backgroundColor\": \"#FFC107\"\n    }]\n  },\n  \"options\": {\n    \"indexAxis\": \"y\"\n  }\n}\n```\n```\n\n---\n\n## Related\n\n- [[configuration-guide|Configuration Guide]] - Full configuration reference\n- [[markdown|Markdown Features]] - Other markdown extensions\n- [[templates|Templates]] - Using Jinja in markdown\n",
      "summary": "Guide to analytics plugins for visualizing data and tracking activity in markata-go",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "guides",
        "analytics",
        "visualization"
      ]
    },
    {
      "id": "https://markata.dev/docs/comparison/",
      "url": "https://markata.dev/docs/comparison/",
      "title": "Framework Comparison",
      "content_html": "\u003ch2 id=\"static-site-generator-comparison-guide\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStatic Site Generator Comparison Guide\u003c/span\u003e \u003ca href=\"#static-site-generator-comparison-guide\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA comprehensive comparison of markata-go against popular static site generators to help you choose the right tool for your project.\u003c/p\u003e\n\u003ch2 id=\"quick-comparison-table\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuick Comparison Table\u003c/span\u003e \u003ca href=\"#quick-comparison-table\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFeature\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eHugo\u003c/th\u003e\n\u003cth\u003eJekyll\u003c/th\u003e\n\u003cth\u003eEleventy\u003c/th\u003e\n\u003cth\u003eAstro\u003c/th\u003e\n\u003cth\u003eZola\u003c/th\u003e\n\u003cth\u003ePelican\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eLanguage\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eGo\u003c/td\u003e\n\u003ctd\u003eGo\u003c/td\u003e\n\u003ctd\u003eRuby\u003c/td\u003e\n\u003ctd\u003eJavaScript\u003c/td\u003e\n\u003ctd\u003eJavaScript\u003c/td\u003e\n\u003ctd\u003eRust\u003c/td\u003e\n\u003ctd\u003ePython\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eTemplate Engine\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003ePongo2 (Jinja2-like)\u003c/td\u003e\n\u003ctd\u003eGo templates\u003c/td\u003e\n\u003ctd\u003eLiquid\u003c/td\u003e\n\u003ctd\u003eMultiple\u003c/td\u003e\n\u003ctd\u003eJSX/Astro\u003c/td\u003e\n\u003ctd\u003eTera (Jinja2-like)\u003c/td\u003e\n\u003ctd\u003eJinja2\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eBuild Speed\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eFast\u003c/td\u003e\n\u003ctd\u003eVery Fast\u003c/td\u003e\n\u003ctd\u003eSlow\u003c/td\u003e\n\u003ctd\u003eMedium\u003c/td\u003e\n\u003ctd\u003eMedium\u003c/td\u003e\n\u003ctd\u003eVery Fast\u003c/td\u003e\n\u003ctd\u003eMedium\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eLearning Curve\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eLow\u003c/td\u003e\n\u003ctd\u003eMedium\u003c/td\u003e\n\u003ctd\u003eLow\u003c/td\u003e\n\u003ctd\u003eLow\u003c/td\u003e\n\u003ctd\u003eMedium\u003c/td\u003e\n\u003ctd\u003eLow\u003c/td\u003e\n\u003ctd\u003eLow\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003ePlugin System\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e34 built-in plugins\u003c/td\u003e\n\u003ctd\u003eLimited\u003c/td\u003e\n\u003ctd\u003eRuby gems\u003c/td\u003e\n\u003ctd\u003eJavaScript\u003c/td\u003e\n\u003ctd\u003eIntegrations\u003c/td\u003e\n\u003ctd\u003eLimited\u003c/td\u003e\n\u003ctd\u003ePython\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eFeed Formats\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e7 (HTML, RSS, Atom, JSON, Markdown, Text, Sitemap)\u003c/td\u003e\n\u003ctd\u003eBasic\u003c/td\u003e\n\u003ctd\u003eBasic\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eBasic\u003c/td\u003e\n\u003ctd\u003eBasic\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eSingle Binary\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eBuilt-in Search\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003ePagefind (auto-install)\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eTheme System\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e25+ palettes\u003c/td\u003e\n\u003ctd\u003eThemes\u003c/td\u003e\n\u003ctd\u003eThemes\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eThemes\u003c/td\u003e\n\u003ctd\u003eThemes\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"markata-go-feature-highlights\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003emarkata-go Feature Highlights\u003c/span\u003e \u003ca href=\"#markata-go-feature-highlights\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBefore diving into comparisons, here\u0026rsquo;s what makes markata-go unique:\u003c/p\u003e\n\u003ch3 id=\"34-built-in-plugins\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e34 Built-in Plugins\u003c/span\u003e \u003ca href=\"#34-built-in-plugins\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go ships with a comprehensive plugin ecosystem:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCategory\u003c/th\u003e\n\u003cth\u003ePlugins\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eCore\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eglob, load, jinja_md, render_markdown, templates\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eFeeds\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003efeeds, auto_feeds, publish_feeds, publish_html, sitemap\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eContent Enhancement\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003ewikilinks, toc, description, auto_title, reading_time, heading_anchors\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eNavigation\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eprevnext, redirects\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eMedia \u0026amp; Visualization\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003emd_video, youtube, chartjs, mermaid, csv_fence, qrcode\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eLinking\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003elink_collector, glossary, one_line_link, wikilink_hover\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eStyling\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003epalette_css, chroma_css, static_assets\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eSEO \u0026amp; Data\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003estructured_data, overwrite_check\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eSearch\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003epagefind\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"7-feed-output-formats\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e7 Feed Output Formats\u003c/span\u003e \u003ca href=\"#7-feed-output-formats\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOne feed definition generates multiple output formats:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Go Tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and \u0026#39;go\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e      \u003cspan class=\"c\"\u003e# /tutorials/index.html\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e       \u003cspan class=\"c\"\u003e# /tutorials/rss.xml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e      \u003cspan class=\"c\"\u003e# /tutorials/atom.xml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e      \u003cspan class=\"c\"\u003e# /tutorials/feed.json\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e  \u003cspan class=\"c\"\u003e# /tutorials.md\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e      \u003cspan class=\"c\"\u003e# /tutorials.txt\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esitemap\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e   \u003cspan class=\"c\"\u003e# Included in sitemap.xml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"25-built-in-color-palettes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e25+ Built-in Color Palettes\u003c/span\u003e \u003ca href=\"#25-built-in-color-palettes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe theme system includes palettes for every preference:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eCatppuccin\u003c/strong\u003e: Frappe, Latte, Macchiato, Mocha\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTokyo Night\u003c/strong\u003e: Standard, Day, Storm\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eKanagawa\u003c/strong\u003e: Wave, Dragon, Lotus\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRose Pine\u003c/strong\u003e: Standard, Dawn, Moon\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGruvbox\u003c/strong\u003e: Dark, Light\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNord\u003c/strong\u003e: Dark, Light\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eEverforest\u003c/strong\u003e: Dark, Light\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSolarized\u003c/strong\u003e: Dark, Light\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDracula\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMatte Black\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDefault\u003c/strong\u003e: Dark, Light\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List all available palettes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette list\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Preview a palette\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette show \u003cspan class=\"s2\"\u003e\u0026#34;Tokyo Night\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Set palette in config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003emarkata-go\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003epalette\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Catppuccin Mocha\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"22-template-filters\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e22+ Template Filters\u003c/span\u003e \u003ca href=\"#22-template-filters\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCategory\u003c/th\u003e\n\u003cth\u003eFilters\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eDate\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edate\u003c/code\u003e, \u003ccode\u003edate_format\u003c/code\u003e, \u003ccode\u003erss_date\u003c/code\u003e, \u003ccode\u003eatom_date\u003c/code\u003e, \u003ccode\u003eisoformat\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eString\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eslugify\u003c/code\u003e, \u003ccode\u003etruncate\u003c/code\u003e, \u003ccode\u003etruncatewords\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eCollection\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003elength\u003c/code\u003e, \u003ccode\u003efirst\u003c/code\u003e, \u003ccode\u003elast\u003c/code\u003e, \u003ccode\u003ejoin\u003c/code\u003e, \u003ccode\u003ereverse\u003c/code\u003e, \u003ccode\u003esort\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eHTML\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estriptags\u003c/code\u003e, \u003ccode\u003elinebreaks\u003c/code\u003e, \u003ccode\u003elinebreaksbr\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eURL\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eurlencode\u003c/code\u003e, \u003ccode\u003eabsolute_url\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eTheme\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etheme_asset\u003c/code\u003e, \u003ccode\u003easset_url\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eFallback\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edefault_if_none\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- Date formatting --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ post.Date | date:\u0026#34;January 2, 2006\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ post.Date | rss_date }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ post.Date | isoformat }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- String manipulation --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ post.Title | slugify }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ post.Description | truncate:160 }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- Collections --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ post.Tags | join:\u0026#34;, \u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ posts | length }} posts\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"comprehensive-cli\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComprehensive CLI\u003c/span\u003e \u003ca href=\"#comprehensive-cli\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build          \u003cspan class=\"c1\"\u003e# Build the site\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve          \u003cspan class=\"c1\"\u003e# Dev server with live reload\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go new \u003cspan class=\"s2\"\u003e\u0026#34;Post\u0026#34;\u003c/span\u003e     \u003cspan class=\"c1\"\u003e# Create a new post\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lint           \u003cspan class=\"c1\"\u003e# Check for common issues\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go explain        \u003cspan class=\"c1\"\u003e# Info for AI agents\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go benchmark      \u003cspan class=\"c1\"\u003e# Performance testing\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go config show    \u003cspan class=\"c1\"\u003e# Show configuration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go palette list   \u003cspan class=\"c1\"\u003e# List color palettes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go init           \u003cspan class=\"c1\"\u003e# Initialize new project\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"detailed-comparisons\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDetailed Comparisons\u003c/span\u003e \u003ca href=\"#detailed-comparisons\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"hugo-go\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHugo (Go)\u003c/span\u003e \u003ca href=\"#hugo-go\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eHugo is the most popular Go-based static site generator, known for its exceptional build speed.\u003c/p\u003e\n\u003ch4 id=\"speed-comparison\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSpeed Comparison\u003c/span\u003e \u003ca href=\"#speed-comparison\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eMetric\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eHugo\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuild 100 posts\u003c/td\u003e\n\u003ctd\u003e~200ms\u003c/td\u003e\n\u003ctd\u003e~150ms\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuild 1000 posts\u003c/td\u003e\n\u003ctd\u003e~1.5s\u003c/td\u003e\n\u003ctd\u003e~1s\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eIncremental rebuild\u003c/td\u003e\n\u003ctd\u003ePartial\u003c/td\u003e\n\u003ctd\u003eFull\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDev server startup\u003c/td\u003e\n\u003ctd\u003eFast\u003c/td\u003e\n\u003ctd\u003eVery Fast\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eHugo excels\u003c/strong\u003e: Raw build speed is Hugo\u0026rsquo;s primary strength. Its highly optimized Go code and aggressive caching make it the fastest SSG available.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emarkata-go excels\u003c/strong\u003e: Concurrent processing with configurable worker pools. While not quite as fast as Hugo for raw builds, markata-go offers more predictable performance scaling and extensive built-in features.\u003c/p\u003e\n\u003ch4 id=\"template-language\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Language\u003c/span\u003e \u003ca href=\"#template-language\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAspect\u003c/th\u003e\n\u003cth\u003emarkata-go (Pongo2)\u003c/th\u003e\n\u003cth\u003eHugo (Go templates)\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eSyntax\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ post.Title }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ .Title }}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eInheritance\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{% extends \u0026quot;base.html\u0026quot; %}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ define \u0026quot;main\u0026quot; }}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eConditionals\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{% if post.Draft %}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ if .Draft }}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLoops\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{% for tag in post.Tags %}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ range .Params.tags }}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFilters\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ title|slugify }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ .Title | urlize }}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eHugo excels\u003c/strong\u003e: Go templates are powerful and allow inline Go code. Hugo\u0026rsquo;s template functions are extensive.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emarkata-go excels\u003c/strong\u003e: Jinja2-like syntax is more intuitive for developers coming from Python, Django, or Flask. Template inheritance with \u003ccode\u003e{% extends %}\u003c/code\u003e is cleaner than Hugo\u0026rsquo;s partial system.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- markata-go: Familiar Jinja2 syntax --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% extends \u0026#34;base.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {{ body|safe }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- Hugo: Go template syntax --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ define \u0026#34;main\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ .Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {{ .Content }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"content-organization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContent Organization\u003c/span\u003e \u003ca href=\"#content-organization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFeature\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eHugo\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eContent types\u003c/td\u003e\n\u003ctd\u003eSingle (posts)\u003c/td\u003e\n\u003ctd\u003eMultiple (page bundles)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTaxonomies\u003c/td\u003e\n\u003ctd\u003eTags via feeds\u003c/td\u003e\n\u003ctd\u003eBuilt-in taxonomies\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eArchetypes\u003c/td\u003e\n\u003ctd\u003eBasic\u003c/td\u003e\n\u003ctd\u003eAdvanced\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePage bundles\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMultilingual\u003c/td\u003e\n\u003ctd\u003eVia config\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eHugo excels\u003c/strong\u003e: Page bundles, multiple content types, built-in multilingual support, and sophisticated taxonomy system make Hugo better for complex content structures.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emarkata-go excels\u003c/strong\u003e: Simpler mental model. Everything is a post, organization comes through the feed system\u0026rsquo;s filtering.\u003c/p\u003e\n\u003ch4 id=\"feed-system-comparison\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed System Comparison\u003c/span\u003e \u003ca href=\"#feed-system-comparison\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eThis is where markata-go significantly differs from Hugo.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFeature\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eHugo\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eFeed definition\u003c/td\u003e\n\u003ctd\u003eSingle config block\u003c/td\u003e\n\u003ctd\u003eMultiple templates\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eOutput formats\u003c/td\u003e\n\u003ctd\u003e7 from one definition\u003c/td\u003e\n\u003ctd\u003eOne template per format\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFilter expressions\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;published == True and 'go' in tags\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eComplex template logic\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAuto-generated feeds\u003c/td\u003e\n\u003ctd\u003eBuilt-in (tags, categories)\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePagination\u003c/td\u003e\n\u003ctd\u003eIntegrated\u003c/td\u003e\n\u003ctd\u003eSeparate config\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003emarkata-go example:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Go Tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and \u0026#39;go\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis single definition generates \u003ccode\u003e/tutorials/index.html\u003c/code\u003e, \u003ccode\u003e/tutorials/rss.xml\u003c/code\u003e, \u003ccode\u003e/tutorials/atom.xml\u003c/code\u003e, \u003ccode\u003e/tutorials/feed.json\u003c/code\u003e, \u003ccode\u003e/tutorials.md\u003c/code\u003e, and \u003ccode\u003e/tutorials.txt\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eHugo equivalent\u003c/strong\u003e requires separate template files for each format.\u003c/p\u003e\n\u003ch4 id=\"plugin-extension-model\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlugin/Extension Model\u003c/span\u003e \u003ca href=\"#plugin-extension-model\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAspect\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eHugo\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuilt-in plugins\u003c/td\u003e\n\u003ctd\u003e34\u003c/td\u003e\n\u003ctd\u003eLimited\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eExtension method\u003c/td\u003e\n\u003ctd\u003eLifecycle plugins\u003c/td\u003e\n\u003ctd\u003eModules/themes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHook points\u003c/td\u003e\n\u003ctd\u003e9 lifecycle stages\u003c/td\u003e\n\u003ctd\u003eLimited hooks\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eThird-party plugins\u003c/td\u003e\n\u003ctd\u003eRegistry + local\u003c/td\u003e\n\u003ctd\u003eModules\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCustom plugins\u003c/td\u003e\n\u003ctd\u003eSingle Go file\u003c/td\u003e\n\u003ctd\u003eModule system\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eHugo excels\u003c/strong\u003e: Hugo Modules provide versioned, composable themes and components.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emarkata-go excels\u003c/strong\u003e: Fine-grained lifecycle hooks allow plugins to modify content at any stage. A single file can be a complete plugin. 34 built-in plugins cover most common needs.\u003c/p\u003e\n\u003ch4 id=\"additional-markata-go-features-hugo-lacks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdditional markata-go Features Hugo Lacks\u003c/span\u003e \u003ca href=\"#additional-markata-go-features-hugo-lacks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFeature\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eHugo\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuilt-in search\u003c/td\u003e\n\u003ctd\u003ePagefind (auto-install)\u003c/td\u003e\n\u003ctd\u003eManual setup\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSyntax highlighting CSS\u003c/td\u003e\n\u003ctd\u003eChroma with palette awareness\u003c/td\u003e\n\u003ctd\u003eChroma (manual CSS)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eChart.js support\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMermaid diagrams\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eQR code generation\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWikilinks + hover\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eIndieWeb support\u003c/td\u003e\n\u003ctd\u003eIndieAuth + Webmention\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eStructured data\u003c/td\u003e\n\u003ctd\u003eBuilt-in JSON-LD\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"when-to-choose-hugo-over-markata-go\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhen to Choose Hugo Over markata-go\u003c/span\u003e \u003ca href=\"#when-to-choose-hugo-over-markata-go\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eYou need the absolute fastest build times\u003c/li\u003e\n\u003cli\u003eYour site has complex content types (documentation, products, etc.)\u003c/li\u003e\n\u003cli\u003eYou need built-in multilingual support\u003c/li\u003e\n\u003cli\u003eYou prefer Go template syntax\u003c/li\u003e\n\u003cli\u003eYou need Hugo\u0026rsquo;s massive theme ecosystem\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"when-to-choose-markata-go-over-hugo\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhen to Choose markata-go Over Hugo\u003c/span\u003e \u003ca href=\"#when-to-choose-markata-go-over-hugo\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eYou prefer Jinja2-like template syntax\u003c/li\u003e\n\u003cli\u003eYou need advanced feed filtering with 7 output formats\u003c/li\u003e\n\u003cli\u003eYou want 34 built-in plugins covering common needs\u003c/li\u003e\n\u003cli\u003eYou need fine-grained plugin hooks\u003c/li\u003e\n\u003cli\u003eYou want built-in search, charts, diagrams, and structured data\u003c/li\u003e\n\u003cli\u003eYou\u0026rsquo;re building a blog-focused site\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"jekyll-ruby\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJekyll (Ruby)\u003c/span\u003e \u003ca href=\"#jekyll-ruby\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eJekyll pioneered modern static site generation and remains popular due to GitHub Pages integration.\u003c/p\u003e\n\u003ch4 id=\"ease-of-use\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEase of Use\u003c/span\u003e \u003ca href=\"#ease-of-use\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAspect\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eJekyll\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eInstallation\u003c/td\u003e\n\u003ctd\u003eSingle binary\u003c/td\u003e\n\u003ctd\u003eRuby + gems\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eConfiguration\u003c/td\u003e\n\u003ctd\u003eTOML/YAML/JSON\u003c/td\u003e\n\u003ctd\u003eYAML\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGetting started\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emarkata-go new \u0026quot;Post\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ejekyll new site\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDocumentation\u003c/td\u003e\n\u003ctd\u003eGrowing\u003c/td\u003e\n\u003ctd\u003eExtensive\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCommunity\u003c/td\u003e\n\u003ctd\u003eSmall\u003c/td\u003e\n\u003ctd\u003eLarge\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eJekyll excels\u003c/strong\u003e: Mature ecosystem, extensive documentation, huge community.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emarkata-go excels\u003c/strong\u003e: Zero dependencies, single binary installation, simpler setup.\u003c/p\u003e\n\u003ch4 id=\"github-pages-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGitHub Pages Integration\u003c/span\u003e \u003ca href=\"#github-pages-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFeature\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eJekyll\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eNative support\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuild on push\u003c/td\u003e\n\u003ctd\u003eVia Actions\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePlugin support\u003c/td\u003e\n\u003ctd\u003eFull\u003c/td\u003e\n\u003ctd\u003eLimited on GH Pages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCustom domains\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eJekyll excels\u003c/strong\u003e: First-class GitHub Pages support. Push and deploy with zero configuration.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emarkata-go excels\u003c/strong\u003e: No plugin restrictions when using GitHub Actions. Full control over build process.\u003c/p\u003e\n\u003ch4 id=\"liquid-vs-jinja-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLiquid vs Jinja Templates\u003c/span\u003e \u003ca href=\"#liquid-vs-jinja-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- Jekyll (Liquid) --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for post in site.posts %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.title | escape }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {{ post.excerpt }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- markata-go (Pongo2/Jinja) --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for post in posts %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {{ post.Description }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFeature\u003c/th\u003e\n\u003cth\u003emarkata-go (Pongo2)\u003c/th\u003e\n\u003cth\u003eJekyll (Liquid)\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eFilter syntax\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ text|slugify }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ text | slugify }}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTemplate inheritance\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{% extends %}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{% include %}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWhitespace control\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{%- -%}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{%- -%}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCustom filters\u003c/td\u003e\n\u003ctd\u003eGo functions\u003c/td\u003e\n\u003ctd\u003eRuby\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eBoth are quite similar! Developers familiar with Liquid will find Pongo2 comfortable.\u003c/p\u003e\n\u003ch4 id=\"plugin-ecosystem\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlugin Ecosystem\u003c/span\u003e \u003ca href=\"#plugin-ecosystem\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAspect\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eJekyll\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003ePlugin format\u003c/td\u003e\n\u003ctd\u003eGo files\u003c/td\u003e\n\u003ctd\u003eRuby gems\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eInstallation\u003c/td\u003e\n\u003ctd\u003eBuilt-in or local\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ebundle install\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuilt-in plugins\u003c/td\u003e\n\u003ctd\u003e34\u003c/td\u003e\n\u003ctd\u003e10+\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSEO plugins\u003c/td\u003e\n\u003ctd\u003eStructured data built-in\u003c/td\u003e\n\u003ctd\u003ejekyll-seo-tag\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSitemap\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003ctd\u003ejekyll-sitemap\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSearch\u003c/td\u003e\n\u003ctd\u003ePagefind built-in\u003c/td\u003e\n\u003ctd\u003ejekyll-search (manual)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eJekyll excels\u003c/strong\u003e: Massive plugin ecosystem for nearly any need.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emarkata-go excels\u003c/strong\u003e: Core features built-in (sitemap, feeds, TOC, search, structured data), no external dependencies.\u003c/p\u003e\n\u003ch4 id=\"build-speed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Speed\u003c/span\u003e \u003ca href=\"#build-speed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSite Size\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eJekyll\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e100 posts\u003c/td\u003e\n\u003ctd\u003e~200ms\u003c/td\u003e\n\u003ctd\u003e~2-3s\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e500 posts\u003c/td\u003e\n\u003ctd\u003e~800ms\u003c/td\u003e\n\u003ctd\u003e~10-15s\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1000 posts\u003c/td\u003e\n\u003ctd\u003e~1.5s\u003c/td\u003e\n\u003ctd\u003e~30-60s\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003emarkata-go is 10-30x faster\u003c/strong\u003e for large sites.\u003c/p\u003e\n\u003ch4 id=\"when-to-choose-jekyll-over-markata-go\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhen to Choose Jekyll Over markata-go\u003c/span\u003e \u003ca href=\"#when-to-choose-jekyll-over-markata-go\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eYou need GitHub Pages native integration\u003c/li\u003e\n\u003cli\u003eYou want access to thousands of plugins\u003c/li\u003e\n\u003cli\u003eYour team knows Ruby\u003c/li\u003e\n\u003cli\u003eYou need extensive community support\u003c/li\u003e\n\u003cli\u003eYou\u0026rsquo;re building a simple blog or documentation site\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"when-to-choose-markata-go-over-jekyll\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhen to Choose markata-go Over Jekyll\u003c/span\u003e \u003ca href=\"#when-to-choose-markata-go-over-jekyll\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eBuild speed is critical\u003c/li\u003e\n\u003cli\u003eYou want zero Ruby dependencies\u003c/li\u003e\n\u003cli\u003eYou need advanced feed capabilities with 7 formats\u003c/li\u003e\n\u003cli\u003eYou prefer Jinja2-like syntax\u003c/li\u003e\n\u003cli\u003eYou want concurrent processing\u003c/li\u003e\n\u003cli\u003eYou need built-in search, charts, and structured data\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"eleventy-11ty-javascript\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEleventy (11ty) (JavaScript)\u003c/span\u003e \u003ca href=\"#eleventy-11ty-javascript\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eEleventy is a flexible, JavaScript-based SSG that supports multiple template languages.\u003c/p\u003e\n\u003ch4 id=\"flexibility\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFlexibility\u003c/span\u003e \u003ca href=\"#flexibility\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAspect\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eEleventy\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eTemplate languages\u003c/td\u003e\n\u003ctd\u003ePongo2 only\u003c/td\u003e\n\u003ctd\u003e10+ options\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eData sources\u003c/td\u003e\n\u003ctd\u003eMarkdown + YAML\u003c/td\u003e\n\u003ctd\u003eMultiple (JSON, YAML, JS, API)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eConfiguration\u003c/td\u003e\n\u003ctd\u003eTOML/YAML\u003c/td\u003e\n\u003ctd\u003eJavaScript\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCustomization\u003c/td\u003e\n\u003ctd\u003e34 plugins\u003c/td\u003e\n\u003ctd\u003eFilters, shortcodes, plugins\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eEleventy excels\u003c/strong\u003e: Unmatched flexibility. Use Nunjucks, Liquid, Handlebars, Pug, EJS, or mix them. Pull data from APIs, databases, or files.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emarkata-go excels\u003c/strong\u003e: Opinionated choices reduce decision fatigue. One template language, one content format, one config format.\u003c/p\u003e\n\u003ch4 id=\"template-language-options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Language Options\u003c/span\u003e \u003ca href=\"#template-language-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eEleventy supports:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNunjucks (Jinja2-like)\u003c/li\u003e\n\u003cli\u003eLiquid\u003c/li\u003e\n\u003cli\u003eHandlebars\u003c/li\u003e\n\u003cli\u003eMustache\u003c/li\u003e\n\u003cli\u003ePug\u003c/li\u003e\n\u003cli\u003eEJS\u003c/li\u003e\n\u003cli\u003eJavaScript template literals\u003c/li\u003e\n\u003cli\u003eCustom\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003emarkata-go supports:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePongo2 (Jinja2/Django-like)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIf you want Jinja2-like syntax, both work well. markata-go\u0026rsquo;s Pongo2 and Eleventy\u0026rsquo;s Nunjucks are nearly identical:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- Eleventy (Nunjucks) --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% extends \u0026#34;base.njk\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {{ content | safe }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- markata-go (Pongo2) --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% extends \u0026#34;base.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {{ body|safe }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"data-cascade\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eData Cascade\u003c/span\u003e \u003ca href=\"#data-cascade\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eEleventy\u0026rsquo;s data cascade is powerful:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eGlobal Data (from _data/)\n  -\u0026gt; Layout Data\n    -\u0026gt; Directory Data\n      -\u0026gt; Template Data\n        -\u0026gt; Front Matter\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003emarkata-go\u0026rsquo;s approach is simpler:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eConfig\n  -\u0026gt; Front Matter\n    -\u0026gt; Plugin-generated fields\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eEleventy excels\u003c/strong\u003e: Complex data merging from multiple sources.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emarkata-go excels\u003c/strong\u003e: Predictable, straightforward data flow.\u003c/p\u003e\n\u003ch4 id=\"plugin-model\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlugin Model\u003c/span\u003e \u003ca href=\"#plugin-model\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFeature\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eEleventy\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003ePlugin type\u003c/td\u003e\n\u003ctd\u003eLifecycle hooks\u003c/td\u003e\n\u003ctd\u003eJavaScript\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuilt-in plugins\u003c/td\u003e\n\u003ctd\u003e34\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAsync support\u003c/td\u003e\n\u003ctd\u003eConcurrent stages\u003c/td\u003e\n\u003ctd\u003eAsync/await\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFilter addition\u003c/td\u003e\n\u003ctd\u003eGo functions\u003c/td\u003e\n\u003ctd\u003eJS functions\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuild hooks\u003c/td\u003e\n\u003ctd\u003e9 stages\u003c/td\u003e\n\u003ctd\u003eVarious events\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Eleventy plugin example\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emodule\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eexports\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eeleventyConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eeleventyConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddFilter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;slugify\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nx\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etoLowerCase\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003ereplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sr\"\u003e/\\s+/g\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;-\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// markata-go plugin example\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eMyPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eTransform\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ectx\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContext\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ectx\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePosts\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExtra\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;custom\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eprocessPost\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"when-to-choose-eleventy-over-markata-go\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhen to Choose Eleventy Over markata-go\u003c/span\u003e \u003ca href=\"#when-to-choose-eleventy-over-markata-go\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eYou need multiple template language support\u003c/li\u003e\n\u003cli\u003eYour site pulls data from APIs or databases\u003c/li\u003e\n\u003cli\u003eYou want maximum flexibility\u003c/li\u003e\n\u003cli\u003eYour team knows JavaScript well\u003c/li\u003e\n\u003cli\u003eYou need complex data cascading\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"when-to-choose-markata-go-over-eleventy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhen to Choose markata-go Over Eleventy\u003c/span\u003e \u003ca href=\"#when-to-choose-markata-go-over-eleventy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eYou prefer a faster, compiled binary\u003c/li\u003e\n\u003cli\u003eYou want opinionated defaults with 34 built-in plugins\u003c/li\u003e\n\u003cli\u003eYou need the advanced feed system with 7 formats\u003c/li\u003e\n\u003cli\u003eYou prefer Go\u0026rsquo;s performance characteristics\u003c/li\u003e\n\u003cli\u003eYou want simpler configuration\u003c/li\u003e\n\u003cli\u003eYou need built-in search and visualization\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"astro-javascript\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAstro (JavaScript)\u003c/span\u003e \u003ca href=\"#astro-javascript\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAstro is a modern web framework with island architecture and component support.\u003c/p\u003e\n\u003ch4 id=\"modern-features\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eModern Features\u003c/span\u003e \u003ca href=\"#modern-features\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFeature\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eAstro\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003ePartial hydration\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eYes (Islands)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eComponent support\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eReact, Vue, Svelte, etc.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSSR support\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTypeScript\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eFirst-class\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCSS scoping\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eAstro excels\u003c/strong\u003e: Modern frontend features, component frameworks, partial hydration for optimal performance.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emarkata-go excels\u003c/strong\u003e: Simpler mental model for content-focused sites. No JavaScript framework overhead.\u003c/p\u003e\n\u003ch4 id=\"island-architecture\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIsland Architecture\u003c/span\u003e \u003ca href=\"#island-architecture\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eAstro\u0026rsquo;s island architecture allows interactive components on otherwise static pages:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-astro\"\u003e---\n// Astro component\nimport Counter from '../components/Counter.jsx';\n---\n\u0026lt;html\u0026gt;\n  \u0026lt;body\u0026gt;\n    \u0026lt;h1\u0026gt;My Blog Post\u0026lt;/h1\u0026gt;\n    \u0026lt;p\u0026gt;Static content here...\u0026lt;/p\u0026gt;\n\n    \u0026lt;!-- Only this component ships JavaScript --\u0026gt;\n    \u0026lt;Counter client:load /\u0026gt;\n  \u0026lt;/body\u0026gt;\n\u0026lt;/html\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003emarkata-go generates pure static HTML. For interactivity, you add JavaScript manually:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- markata-go template --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {{ body|safe }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;counter\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/js/counter.js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"component-support\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComponent Support\u003c/span\u003e \u003ca href=\"#component-support\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFramework\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eAstro\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eReact\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eVue\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSvelte\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSolidJS\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePreact\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eAstro excels\u003c/strong\u003e: Use any frontend framework. Mix and match components.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emarkata-go excels\u003c/strong\u003e: No framework lock-in. Pure HTML output.\u003c/p\u003e\n\u003ch4 id=\"build-output\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Output\u003c/span\u003e \u003ca href=\"#build-output\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAspect\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eAstro\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eDefault output\u003c/td\u003e\n\u003ctd\u003eStatic HTML\u003c/td\u003e\n\u003ctd\u003eStatic HTML\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJavaScript\u003c/td\u003e\n\u003ctd\u003eOnly what you add\u003c/td\u003e\n\u003ctd\u003eMinimal (islands)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBundle size\u003c/td\u003e\n\u003ctd\u003eZero baseline\u003c/td\u003e\n\u003ctd\u003eSmall baseline\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSSR option\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eBoth produce static HTML by default, but Astro can switch to SSR mode.\u003c/p\u003e\n\u003ch4 id=\"when-to-choose-astro-over-markata-go\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhen to Choose Astro Over markata-go\u003c/span\u003e \u003ca href=\"#when-to-choose-astro-over-markata-go\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eYou need interactive components\u003c/li\u003e\n\u003cli\u003eYou want to use React/Vue/Svelte\u003c/li\u003e\n\u003cli\u003eYou need server-side rendering\u003c/li\u003e\n\u003cli\u003eYou\u0026rsquo;re building a web application, not just a blog\u003c/li\u003e\n\u003cli\u003eYou want TypeScript support\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"when-to-choose-markata-go-over-astro\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhen to Choose markata-go Over Astro\u003c/span\u003e \u003ca href=\"#when-to-choose-markata-go-over-astro\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eYou want pure static HTML\u003c/li\u003e\n\u003cli\u003eYou don\u0026rsquo;t need frontend frameworks\u003c/li\u003e\n\u003cli\u003eBuild speed is critical\u003c/li\u003e\n\u003cli\u003eYou prefer Go\u0026rsquo;s simplicity\u003c/li\u003e\n\u003cli\u003eYou need the advanced feed system\u003c/li\u003e\n\u003cli\u003eYou want 34 built-in plugins without configuration\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"zola-rust\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eZola (Rust)\u003c/span\u003e \u003ca href=\"#zola-rust\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eZola is a fast, Rust-based SSG with no dependencies.\u003c/p\u003e\n\u003ch4 id=\"speed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSpeed\u003c/span\u003e \u003ca href=\"#speed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eBoth markata-go and Zola are extremely fast:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eMetric\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eZola\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eLanguage\u003c/td\u003e\n\u003ctd\u003eGo\u003c/td\u003e\n\u003ctd\u003eRust\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuild 100 posts\u003c/td\u003e\n\u003ctd\u003e~200ms\u003c/td\u003e\n\u003ctd\u003e~100ms\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuild 1000 posts\u003c/td\u003e\n\u003ctd\u003e~1.5s\u003c/td\u003e\n\u003ctd\u003e~800ms\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMemory usage\u003c/td\u003e\n\u003ctd\u003eLow\u003c/td\u003e\n\u003ctd\u003eVery Low\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eZola excels\u003c/strong\u003e: Slightly faster than markata-go in raw benchmarks due to Rust\u0026rsquo;s zero-cost abstractions.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emarkata-go excels\u003c/strong\u003e: Go\u0026rsquo;s simpler concurrency model and faster compile times make plugin development easier.\u003c/p\u003e\n\u003ch4 id=\"single-binary\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSingle Binary\u003c/span\u003e \u003ca href=\"#single-binary\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eBoth tools ship as single binaries with no runtime dependencies.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFeature\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eZola\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eBinary size\u003c/td\u003e\n\u003ctd\u003e~15MB\u003c/td\u003e\n\u003ctd\u003e~10MB\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDependencies\u003c/td\u003e\n\u003ctd\u003eNone\u003c/td\u003e\n\u003ctd\u003eNone\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eInstallation\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ego install\u003c/code\u003e or download\u003c/td\u003e\n\u003ctd\u003eDownload\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCross-platform\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"tera-vs-pongo2-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTera vs Pongo2 Templates\u003c/span\u003e \u003ca href=\"#tera-vs-pongo2-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eBoth use Jinja2-inspired template languages:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- Zola (Tera) --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% extends \u0026#34;base.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ page.title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {{ page.content | safe }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- markata-go (Pongo2) --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% extends \u0026#34;base.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {{ body|safe }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNearly identical syntax! Both inherit from Jinja2/Django templates.\u003c/p\u003e\n\u003ch4 id=\"taxonomy-system\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTaxonomy System\u003c/span\u003e \u003ca href=\"#taxonomy-system\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFeature\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eZola\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eTags\u003c/td\u003e\n\u003ctd\u003eVia feed filter\u003c/td\u003e\n\u003ctd\u003eBuilt-in taxonomy\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCategories\u003c/td\u003e\n\u003ctd\u003eVia feed filter\u003c/td\u003e\n\u003ctd\u003eBuilt-in taxonomy\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCustom taxonomies\u003c/td\u003e\n\u003ctd\u003eVia feeds\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTaxonomy templates\u003c/td\u003e\n\u003ctd\u003eFeed templates\u003c/td\u003e\n\u003ctd\u003eDedicated templates\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eZola approach:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Zola config.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etaxonomies\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tags\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;categories\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003emarkata-go approach:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# markata-go.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauto_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug_prefix\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBoth achieve similar results, but markata-go\u0026rsquo;s feed system is more flexible for filtering.\u003c/p\u003e\n\u003ch4 id=\"feature-comparison\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeature Comparison\u003c/span\u003e \u003ca href=\"#feature-comparison\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFeature\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eZola\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuilt-in plugins\u003c/td\u003e\n\u003ctd\u003e34\u003c/td\u003e\n\u003ctd\u003eN/A (no plugin system)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSearch\u003c/td\u003e\n\u003ctd\u003ePagefind (auto)\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSass compilation\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eShortcodes\u003c/td\u003e\n\u003ctd\u003eVia templates\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFeed formats\u003c/td\u003e\n\u003ctd\u003e7\u003c/td\u003e\n\u003ctd\u003e2 (RSS, Atom)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCharts/Diagrams\u003c/td\u003e\n\u003ctd\u003eChart.js, Mermaid\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"when-to-choose-zola-over-markata-go\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhen to Choose Zola Over markata-go\u003c/span\u003e \u003ca href=\"#when-to-choose-zola-over-markata-go\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eYou need the absolute fastest builds\u003c/li\u003e\n\u003cli\u003eYou prefer Rust\u003c/li\u003e\n\u003cli\u003eYou want Zola\u0026rsquo;s built-in taxonomy system\u003c/li\u003e\n\u003cli\u003eYou need Sass compilation built-in\u003c/li\u003e\n\u003cli\u003eYou like Zola\u0026rsquo;s shortcode system\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"when-to-choose-markata-go-over-zola\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhen to Choose markata-go Over Zola\u003c/span\u003e \u003ca href=\"#when-to-choose-markata-go-over-zola\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eYou prefer Go\u003c/li\u003e\n\u003cli\u003eYou need the advanced feed system with 7 formats\u003c/li\u003e\n\u003cli\u003eYou want 34 fine-grained plugin hooks\u003c/li\u003e\n\u003cli\u003eYou need built-in charts, diagrams, and QR codes\u003c/li\u003e\n\u003cli\u003eYou want concurrent post processing\u003c/li\u003e\n\u003cli\u003eYou need IndieWeb support (IndieAuth, Webmention)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"pelican-python\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePelican (Python)\u003c/span\u003e \u003ca href=\"#pelican-python\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePelican is a Python-based SSG with Jinja2 templates.\u003c/p\u003e\n\u003ch4 id=\"python-ecosystem\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePython Ecosystem\u003c/span\u003e \u003ca href=\"#python-ecosystem\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAspect\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003ePelican\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eLanguage\u003c/td\u003e\n\u003ctd\u003eGo\u003c/td\u003e\n\u003ctd\u003ePython\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTemplates\u003c/td\u003e\n\u003ctd\u003ePongo2 (Jinja2-like)\u003c/td\u003e\n\u003ctd\u003eJinja2\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eConfig\u003c/td\u003e\n\u003ctd\u003eTOML/YAML\u003c/td\u003e\n\u003ctd\u003ePython\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePlugins\u003c/td\u003e\n\u003ctd\u003eGo\u003c/td\u003e\n\u003ctd\u003ePython\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003ePelican excels\u003c/strong\u003e: Native Python. Configuration in Python allows programmatic setup. Plugins can use the entire Python ecosystem.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emarkata-go excels\u003c/strong\u003e: Faster builds, single binary distribution, no Python environment needed.\u003c/p\u003e\n\u003ch4 id=\"plugin-model-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlugin Model\u003c/span\u003e \u003ca href=\"#plugin-model-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFeature\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003ePelican\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003ePlugin hooks\u003c/td\u003e\n\u003ctd\u003e9 lifecycle stages\u003c/td\u003e\n\u003ctd\u003eSignals\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePlugin format\u003c/td\u003e\n\u003ctd\u003eGo interfaces\u003c/td\u003e\n\u003ctd\u003ePython modules\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePlugin discovery\u003c/td\u003e\n\u003ctd\u003eRegistry\u003c/td\u003e\n\u003ctd\u003eEntry points\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuilt-in plugins\u003c/td\u003e\n\u003ctd\u003e34\u003c/td\u003e\n\u003ctd\u003e10+\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Pelican plugin example\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003epelican\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003esignals\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eadd_reading_time\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003egenerator\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003earticle\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003egenerator\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003earticles\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ewords\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003earticle\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esplit\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003earticle\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereading_time\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003ewords\u003c/span\u003e \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"mi\"\u003e200\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e min read\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eregister\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esignals\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003earticle_generator_finalized\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econnect\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eadd_reading_time\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// markata-go plugin example\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eReadingTimePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eTransform\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ectx\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContext\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ectx\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePosts\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003ewords\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estrings\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFields\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContent\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExtra\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reading_time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;%d min read\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ewords\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"mi\"\u003e200\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"jinja2-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJinja2 Templates\u003c/span\u003e \u003ca href=\"#jinja2-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003ePelican uses actual Jinja2, while markata-go uses Pongo2 (a Go port):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- Pelican (Jinja2) --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% extends \u0026#34;base.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% for article in articles %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ article.url }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ article.title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {{ article.summary }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- markata-go (Pongo2) --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% extends \u0026#34;base.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% for post in posts %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Href }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {{ post.Description }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e99% compatible syntax. The main difference is variable naming conventions.\u003c/p\u003e\n\u003ch4 id=\"when-to-choose-pelican-over-markata-go\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhen to Choose Pelican Over markata-go\u003c/span\u003e \u003ca href=\"#when-to-choose-pelican-over-markata-go\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eYour team knows Python\u003c/li\u003e\n\u003cli\u003eYou need Python-based plugins\u003c/li\u003e\n\u003cli\u003eYou want configuration in Python\u003c/li\u003e\n\u003cli\u003eYou need Pelican\u0026rsquo;s theme ecosystem\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"when-to-choose-markata-go-over-pelican\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhen to Choose markata-go Over Pelican\u003c/span\u003e \u003ca href=\"#when-to-choose-markata-go-over-pelican\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eBuild speed is important\u003c/li\u003e\n\u003cli\u003eYou want single binary distribution\u003c/li\u003e\n\u003cli\u003eYou need the advanced feed system with 7 formats\u003c/li\u003e\n\u003cli\u003eYou prefer Go\u0026rsquo;s concurrency model\u003c/li\u003e\n\u003cli\u003eYou don\u0026rsquo;t want Python dependencies\u003c/li\u003e\n\u003cli\u003eYou want 34 built-in plugins\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"feature-deep-dives\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeature Deep Dives\u003c/span\u003e \u003ca href=\"#feature-deep-dives\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"the-feed-system-advantage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Feed System Advantage\u003c/span\u003e \u003ca href=\"#the-feed-system-advantage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go\u0026rsquo;s feed system is its primary differentiator. One feed definition produces multiple outputs:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;python\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Python Posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and \u0026#39;python\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e      \u003cspan class=\"c\"\u003e# /python/index.html + pagination\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e       \u003cspan class=\"c\"\u003e# /python/rss.xml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eatom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e      \u003cspan class=\"c\"\u003e# /python/atom.xml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e      \u003cspan class=\"c\"\u003e# /python/feed.json\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emarkdown\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e  \u003cspan class=\"c\"\u003e# /python.md\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e      \u003cspan class=\"c\"\u003e# /python.txt\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eWhat other SSGs require:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSSG\u003c/th\u003e\n\u003cth\u003eRSS Template\u003c/th\u003e\n\u003cth\u003eAtom Template\u003c/th\u003e\n\u003cth\u003eJSON Template\u003c/th\u003e\n\u003cth\u003eMarkdown\u003c/th\u003e\n\u003cth\u003eText\u003c/th\u003e\n\u003cth\u003eTotal Files\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eHugo\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003e5+ templates\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJekyll\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003e2+ templates\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eEleventy\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003e2+ templates\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eZola\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003e2+ templates\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePelican\u003c/td\u003e\n\u003ctd\u003eBuilt-in\u003c/td\u003e\n\u003ctd\u003ePlugin\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eVariable\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003emarkata-go:\u003c/strong\u003e One config block, zero templates needed, 7 output formats.\u003c/p\u003e\n\u003ch3 id=\"theme-and-palette-system\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTheme and Palette System\u003c/span\u003e \u003ca href=\"#theme-and-palette-system\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go includes a sophisticated theming system:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epalette\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Tokyo Night\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Choose from 25+ palettes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eFeatures:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e25+ built-in palettes (dark and light variants)\u003c/li\u003e\n\u003cli\u003eAutomatic CSS variable generation\u003c/li\u003e\n\u003cli\u003ePalette-aware syntax highlighting (Chroma)\u003c/li\u003e\n\u003cli\u003eLight/dark mode support\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go palette list\u003c/code\u003e to see all options\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emarkata-go palette show \u0026quot;Name\u0026quot;\u003c/code\u003e to preview colors\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eGenerated CSS includes:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePrimary, secondary, accent colors\u003c/li\u003e\n\u003cli\u003eBackground and surface colors\u003c/li\u003e\n\u003cli\u003eText colors with proper contrast\u003c/li\u003e\n\u003cli\u003eBorder and shadow colors\u003c/li\u003e\n\u003cli\u003eSyntax highlighting colors matched to palette\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"search-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSearch Integration\u003c/span\u003e \u003ca href=\"#search-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go integrates Pagefind for full-text search:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epagefind\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_install\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Automatically downloads Pagefind\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eFeatures:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eZero-configuration search indexing\u003c/li\u003e\n\u003cli\u003eAutomatic Pagefind installation\u003c/li\u003e\n\u003cli\u003ePalette-aware styling\u003c/li\u003e\n\u003cli\u003eWorks offline (client-side)\u003c/li\u003e\n\u003cli\u003eMinimal JavaScript footprint\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"visualization-support\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVisualization Support\u003c/span\u003e \u003ca href=\"#visualization-support\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBuilt-in support for data visualization:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eChart.js:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```chartjs\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;type\u0026#34;: \u0026#34;bar\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;data\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;labels\u0026#34;: [\u0026#34;Q1\u0026#34;, \u0026#34;Q2\u0026#34;, \u0026#34;Q3\u0026#34;, \u0026#34;Q4\u0026#34;],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;datasets\u0026#34;: [{\u0026#34;data\u0026#34;: [10, 20, 30, 40]}]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eMermaid Diagrams:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```mermaid\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egraph TD\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    A[Start] --\u0026gt; B[Process]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    B --\u0026gt; C[End]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eCSV Tables:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```csv\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003eAge\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003eCity\u003c/span\u003e\u003cspan class=\"p\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003eAlice\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003e30\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003eNYC\u003c/span\u003e\u003cspan class=\"p\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003eBob\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003e25\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s\"\u003eLA\u003c/span\u003e\u003cspan class=\"p\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"indieweb-support\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIndieWeb Support\u003c/span\u003e \u003ca href=\"#indieweb-support\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBuilt-in IndieWeb integration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eindieauth\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauthorization_endpoint\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://indieauth.com/auth\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etoken_endpoint\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://tokens.indieauth.com/token\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eme_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebmention\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eendpoint\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://webmention.io/example.com/webmention\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"developer-experience\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeveloper Experience\u003c/span\u003e \u003ca href=\"#developer-experience\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eLive Reload Server:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve  \u003cspan class=\"c1\"\u003e# Builds and serves with live reload\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eLinting:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go lint  \u003cspan class=\"c1\"\u003e# Check for common issues\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePerformance Testing:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go benchmark  \u003cspan class=\"c1\"\u003e# Run build benchmarks\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eAI Agent Support:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go explain  \u003cspan class=\"c1\"\u003e# Output info for AI coding assistants\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"plugin-architecture-comparison\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlugin Architecture Comparison\u003c/span\u003e \u003ca href=\"#plugin-architecture-comparison\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSSG\u003c/th\u003e\n\u003cth\u003ePlugin Language\u003c/th\u003e\n\u003cth\u003eHook Points\u003c/th\u003e\n\u003cth\u003eBuilt-in Plugins\u003c/th\u003e\n\u003cth\u003eEase of Writing\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003emarkata-go\u003c/td\u003e\n\u003ctd\u003eGo\u003c/td\u003e\n\u003ctd\u003e9 stages\u003c/td\u003e\n\u003ctd\u003e34\u003c/td\u003e\n\u003ctd\u003eMedium\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHugo\u003c/td\u003e\n\u003ctd\u003eGo\u003c/td\u003e\n\u003ctd\u003eLimited\u003c/td\u003e\n\u003ctd\u003eN/A\u003c/td\u003e\n\u003ctd\u003eHard\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJekyll\u003c/td\u003e\n\u003ctd\u003eRuby\u003c/td\u003e\n\u003ctd\u003eMultiple\u003c/td\u003e\n\u003ctd\u003e10+\u003c/td\u003e\n\u003ctd\u003eEasy\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eEleventy\u003c/td\u003e\n\u003ctd\u003eJavaScript\u003c/td\u003e\n\u003ctd\u003eMany\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eEasy\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAstro\u003c/td\u003e\n\u003ctd\u003eJavaScript\u003c/td\u003e\n\u003ctd\u003eIntegrations\u003c/td\u003e\n\u003ctd\u003eManual\u003c/td\u003e\n\u003ctd\u003eEasy\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eZola\u003c/td\u003e\n\u003ctd\u003eNone\u003c/td\u003e\n\u003ctd\u003eN/A\u003c/td\u003e\n\u003ctd\u003eN/A\u003c/td\u003e\n\u003ctd\u003eN/A\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePelican\u003c/td\u003e\n\u003ctd\u003ePython\u003c/td\u003e\n\u003ctd\u003eSignals\u003c/td\u003e\n\u003ctd\u003e10+\u003c/td\u003e\n\u003ctd\u003eEasy\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003emarkata-go\u0026rsquo;s 9-stage lifecycle provides predictable hook points:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eConfigure\u003c/strong\u003e - Load config, init plugins\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eValidate\u003c/strong\u003e - Check configuration\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGlob\u003c/strong\u003e - Find content files\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLoad\u003c/strong\u003e - Parse markdown and frontmatter\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTransform\u003c/strong\u003e - Pre-render processing\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRender\u003c/strong\u003e - Markdown to HTML\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCollect\u003c/strong\u003e - Build feeds and collections\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eWrite\u003c/strong\u003e - Output files\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCleanup\u003c/strong\u003e - Release resources\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"template-syntax-comparison\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Syntax Comparison\u003c/span\u003e \u003ca href=\"#template-syntax-comparison\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAll Jinja2-inspired:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eOperation\u003c/th\u003e\n\u003cth\u003emarkata-go\u003c/th\u003e\n\u003cth\u003eHugo\u003c/th\u003e\n\u003cth\u003eJekyll\u003c/th\u003e\n\u003cth\u003eEleventy (Nunjucks)\u003c/th\u003e\n\u003cth\u003eZola\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eVariable\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ post.Title }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ .Title }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ page.title }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ post.title }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ page.title }}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFilter\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ text|upper }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ .Text | upper }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ text | upcase }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ text | upper }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ text | upper }}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eIf\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{% if x %}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ if .X }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{% if x %}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{% if x %}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{% if x %}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFor\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{% for x in list %}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ range .List }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{% for x in list %}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{% for x in list %}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{% for x in list %}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eExtends\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{% extends \u0026quot;x\u0026quot; %}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ define }}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eIncludes\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{% extends \u0026quot;x\u0026quot; %}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{% extends \u0026quot;x\u0026quot; %}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003emarkata-go, Eleventy (Nunjucks), and Zola (Tera) have the most similar syntax.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"migration-guides\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMigration Guides\u003c/span\u003e \u003ca href=\"#migration-guides\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"migrating-from-hugo\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMigrating from Hugo\u003c/span\u003e \u003ca href=\"#migrating-from-hugo\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eContent Migration\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHugo frontmatter is largely compatible\u003c/li\u003e\n\u003cli\u003eChange \u003ccode\u003edraft: true\u003c/code\u003e to \u003ccode\u003edraft: true\u003c/code\u003e (same!)\u003c/li\u003e\n\u003cli\u003eChange \u003ccode\u003etags: [\u0026quot;go\u0026quot;, \u0026quot;web\u0026quot;]\u003c/code\u003e to \u003ccode\u003etags: [\u0026quot;go\u0026quot;, \u0026quot;web\u0026quot;]\u003c/code\u003e (same!)\u003c/li\u003e\n\u003cli\u003eRemove Hugo-specific fields (\u003ccode\u003etype\u003c/code\u003e, \u003ccode\u003elayout\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eTemplate Migration\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Hugo\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTitle\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContent\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eParams\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etags\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eend\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTitle\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"nx\"\u003esafe\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"o\"\u003e%\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etag\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ein\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTags\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}{{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etag\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}}{\u003c/span\u003e\u003cspan class=\"o\"\u003e%\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eendfor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration Migration\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Hugo config.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebaseURL\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# markata-go.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eFeed Migration\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eReplace RSS template with feed configuration\u003c/li\u003e\n\u003cli\u003eConvert taxonomy templates to auto-feed config\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"migrating-from-jekyll\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMigrating from Jekyll\u003c/span\u003e \u003ca href=\"#migrating-from-jekyll\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eContent Migration\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMove \u003ccode\u003e_posts/\u003c/code\u003e to \u003ccode\u003eposts/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eRemove date prefix from filenames (optional)\u003c/li\u003e\n\u003cli\u003eUpdate frontmatter: \u003ccode\u003elayout\u003c/code\u003e -\u0026gt; \u003ccode\u003etemplate\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eTemplate Migration\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-liquid\"\u003e\u0026lt;!-- Jekyll (Liquid) --\u0026gt;\n{{ page.title }}\n{{ content }}\n{% for tag in page.tags %}{{ tag }}{% endfor %}\n\n\u0026lt;!-- markata-go (Pongo2) --\u0026gt;\n{{ post.Title }}\n{{ body|safe }}\n{% for tag in post.Tags %}{{ tag }}{% endfor %}\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003ePlugin Migration\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eReplace Ruby gems with markata-go plugins or built-ins\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ejekyll-sitemap\u003c/code\u003e -\u0026gt; built-in sitemap plugin\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ejekyll-feed\u003c/code\u003e -\u0026gt; feed system configuration\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"migrating-from-eleventy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMigrating from Eleventy\u003c/span\u003e \u003ca href=\"#migrating-from-eleventy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eContent Migration\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNunjucks frontmatter is compatible\u003c/li\u003e\n\u003cli\u003eData files need conversion to frontmatter or config\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eTemplate Migration\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNunjucks templates work with minimal changes\u003c/li\u003e\n\u003cli\u003eUpdate variable names (\u003ccode\u003epost\u003c/code\u003e vs lowercase)\u003c/li\u003e\n\u003cli\u003eReplace shortcodes with template includes\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration Migration\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eConvert \u003ccode\u003e.eleventy.js\u003c/code\u003e to \u003ccode\u003emarkata-go.toml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eConvert filters to Go plugin functions\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"migrating-from-zola\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMigrating from Zola\u003c/span\u003e \u003ca href=\"#migrating-from-zola\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eContent Migration\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTera frontmatter is largely compatible\u003c/li\u003e\n\u003cli\u003eRemove Zola-specific fields (\u003ccode\u003eweight\u003c/code\u003e, \u003ccode\u003eextra\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eTemplate Migration\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTera and Pongo2 syntax is nearly identical\u003c/li\u003e\n\u003cli\u003eUpdate variable names\u003c/li\u003e\n\u003cli\u003eConvert shortcodes to template includes\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eConfiguration Migration\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Zola config.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebase_url\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# markata-go.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"migrating-from-pelican\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMigrating from Pelican\u003c/span\u003e \u003ca href=\"#migrating-from-pelican\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eContent Migration\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePelican metadata format differs slightly\u003c/li\u003e\n\u003cli\u003eConvert \u003ccode\u003eTitle:\u003c/code\u003e to YAML frontmatter\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eTemplate Migration\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eJinja2 and Pongo2 are nearly identical\u003c/li\u003e\n\u003cli\u003eUpdate variable names (\u003ccode\u003earticle\u003c/code\u003e -\u0026gt; \u003ccode\u003epost\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003ePlugin Migration\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eConvert Python plugins to Go\u003c/li\u003e\n\u003cli\u003eMany Pelican plugins have markata-go equivalents\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"decision-matrix\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDecision Matrix\u003c/span\u003e \u003ca href=\"#decision-matrix\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"choose-markata-go-if-you-need\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChoose markata-go if you need:\u003c/span\u003e \u003ca href=\"#choose-markata-go-if-you-need\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eAdvanced feed system\u003c/strong\u003e - 7 formats from one definition\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eJinja2-like templates\u003c/strong\u003e - Familiar syntax for Python developers\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFast builds\u003c/strong\u003e - Go performance without Hugo complexity\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePlugin flexibility\u003c/strong\u003e - 34 built-in plugins, 9 lifecycle hooks\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSimple deployment\u003c/strong\u003e - Single binary, no runtime dependencies\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eConcurrent processing\u003c/strong\u003e - Parallel post processing\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBuilt-in search\u003c/strong\u003e - Pagefind with auto-install\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTheme system\u003c/strong\u003e - 25+ color palettes with automatic CSS\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVisualization\u003c/strong\u003e - Chart.js, Mermaid, CSV tables built-in\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eIndieWeb support\u003c/strong\u003e - IndieAuth and Webmention\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDeveloper tools\u003c/strong\u003e - Live reload, linting, benchmarks, AI support\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"choose-an-alternative-if-you-need\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChoose an alternative if you need:\u003c/span\u003e \u003ca href=\"#choose-an-alternative-if-you-need\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eNeed\u003c/th\u003e\n\u003cth\u003eBest Choice\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eFastest possible builds\u003c/td\u003e\n\u003ctd\u003eHugo or Zola\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGitHub Pages native\u003c/td\u003e\n\u003ctd\u003eJekyll\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMultiple template languages\u003c/td\u003e\n\u003ctd\u003eEleventy\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFrontend frameworks\u003c/td\u003e\n\u003ctd\u003eAstro\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePython ecosystem\u003c/td\u003e\n\u003ctd\u003ePelican\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuilt-in taxonomies\u003c/td\u003e\n\u003ctd\u003eHugo or Zola\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSSR/hybrid rendering\u003c/td\u003e\n\u003ctd\u003eAstro\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMaximum flexibility\u003c/td\u003e\n\u003ctd\u003eEleventy\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLargest theme ecosystem\u003c/td\u003e\n\u003ctd\u003eHugo or Jekyll\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"latest-post-embeds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLatest Post Embeds\u003c/span\u003e \u003ca href=\"#latest-post-embeds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eStatic Site Generator\u003c/th\u003e\n\u003cth\u003eErgonomic Pattern for \u0026ldquo;Latest N\u0026rdquo; Posts\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkata-go\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003erender_feed(\u0026quot;slug\u0026quot;, {\u0026quot;limit\u0026quot;: N, \u0026quot;variant\u0026quot;: \u0026quot;card\u0026quot;})\u003c/code\u003e drops in \u003ccode\u003epartials/feed_preview.html\u003c/code\u003e, which now routes to \u003ccode\u003epartials/cards/card-router.html\u003c/code\u003e so each post type renders with its template-specific card (photo/shot cards render as \u003ccode\u003e\u0026lt;figure\u0026gt;\u003c/code\u003es with captions). \u003ccode\u003efeed_posts()\u003c/code\u003e still returns template-friendly maps for bespoke layouts without raw HTML.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHugo\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{{ range first 5 (where .Site.RegularPages \u0026quot;Section\u0026quot; \u0026quot;posts\u0026quot;) }}\u003c/code\u003e with cards over \u003ccode\u003e.RenderString\u003c/code\u003e or \u003ccode\u003epartialCached\u003c/code\u003e. Card layouts require custom partials.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJekyll\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{% for post in site.posts limit:5 %}\u003c/code\u003e and include a \u003ccode\u003e_includes/post-card.html\u003c/code\u003e for card styling. Data access via \u003ccode\u003esite.posts\u003c/code\u003e is immediate.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eEleventy\u003c/td\u003e\n\u003ctd\u003eDefine a collection (\u003ccode\u003ecollections.posts\u003c/code\u003e) and `{% for post of collections.posts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eZola\u003c/td\u003e\n\u003ctd\u003eUse \u003ccode\u003epaginate(get_section(\u0026quot;posts\u0026quot;))\u003c/code\u003e or `range (section.pages)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePelican\u003c/td\u003e\n\u003ctd\u003eTemplates iterate \u003ccode\u003earticles[:5]\u003c/code\u003e (or \u003ccode\u003ecategory.articles\u003c/code\u003e) and rely on Jinja macros for cards; feeds and data come from the engine during \u003ccode\u003egenerate_context\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAstro\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003econst posts = await collections.getCollection(\u0026quot;posts\u0026quot;)\u003c/code\u003e + \u003ccode\u003eposts.slice(0,5)\u003c/code\u003e inside \u003ccode\u003e\u0026lt;Fragment\u0026gt;\u003c/code\u003e plus lightweight components for cards.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eZensical\u003c/td\u003e\n\u003ctd\u003eBuilt on MkDocs, so \u0026ldquo;latest\u0026rdquo; snippets come from nav lists or MkDocs plugins like \u003ccode\u003emkdocs-blog-plugin\u003c/code\u003e; there is no first-class post collection, so you either maintain a hand-written list or read a data file and render it via a custom macro.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003emarkata-go\u0026rsquo;s new helpers deliver both data and rendered cards with sensible defaults, matching or surpassing the ergonomics of the other SSGs while keeping Markdown clean.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"conclusion\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConclusion\u003c/span\u003e \u003ca href=\"#conclusion\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003emarkata-go occupies a unique position in the SSG landscape:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eStrengths:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePowerful, unified feed system with 7 output formats\u003c/li\u003e\n\u003cli\u003e34 built-in plugins covering most common needs\u003c/li\u003e\n\u003cli\u003eJinja2-like templates that feel familiar\u003c/li\u003e\n\u003cli\u003eFast Go performance with concurrent processing\u003c/li\u003e\n\u003cli\u003eClean 9-stage plugin architecture\u003c/li\u003e\n\u003cli\u003eSingle binary distribution\u003c/li\u003e\n\u003cli\u003eBuilt-in search with Pagefind\u003c/li\u003e\n\u003cli\u003e25+ color palettes with automatic CSS generation\u003c/li\u003e\n\u003cli\u003eChart.js, Mermaid, and CSV visualization\u003c/li\u003e\n\u003cli\u003eIndieWeb support (IndieAuth, Webmention)\u003c/li\u003e\n\u003cli\u003eDeveloper-friendly CLI with lint, benchmark, and explain commands\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eTrade-offs:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSmaller ecosystem than Hugo or Jekyll\u003c/li\u003e\n\u003cli\u003eLess flexible than Eleventy\u003c/li\u003e\n\u003cli\u003eNo frontend framework integration like Astro\u003c/li\u003e\n\u003cli\u003eFewer built-in features than Hugo for complex sites\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eIdeal for:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eContent-focused blogs and publications\u003c/li\u003e\n\u003cli\u003eSites needing multiple feed formats\u003c/li\u003e\n\u003cli\u003eDevelopers who prefer Jinja2 syntax\u003c/li\u003e\n\u003cli\u003eProjects requiring custom plugin development\u003c/li\u003e\n\u003cli\u003eTeams wanting Go performance without Go template complexity\u003c/li\u003e\n\u003cli\u003eSites needing built-in search, charts, and visualization\u003c/li\u003e\n\u003cli\u003eIndieWeb participants\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe best SSG is the one that fits your workflow. markata-go excels for content-heavy sites where the feed system shines, while alternatives may be better for complex web applications or specific ecosystem needs.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"further-reading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFurther Reading\u003c/span\u003e \u003ca href=\"#further-reading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[[getting-started|Getting Started Guide]]\u003c/li\u003e\n\u003cli\u003e[[feeds-guide|Feed System Guide]]\u003c/li\u003e\n\u003cli\u003e[[plugin-development|Plugin Development Guide]]\u003c/li\u003e\n\u003cli\u003e[[templates-guide|Template Guide]]\u003c/li\u003e\n\u003cli\u003e[[configuration-guide|Configuration Guide]]\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n## Static Site Generator Comparison Guide\n\nA comprehensive comparison of markata-go against popular static site generators to help you choose the right tool for your project.\n\n## Quick Comparison Table\n\n| Feature | markata-go | Hugo | Jekyll | Eleventy | Astro | Zola | Pelican |\n|---------|------------|------|--------|----------|-------|------|---------|\n| **Language** | Go | Go | Ruby | JavaScript | JavaScript | Rust | Python |\n| **Template Engine** | Pongo2 (Jinja2-like) | Go templates | Liquid | Multiple | JSX/Astro | Tera (Jinja2-like) | Jinja2 |\n| **Build Speed** | Fast | Very Fast | Slow | Medium | Medium | Very Fast | Medium |\n| **Learning Curve** | Low | Medium | Low | Low | Medium | Low | Low |\n| **Plugin System** | 34 built-in plugins | Limited | Ruby gems | JavaScript | Integrations | Limited | Python |\n| **Feed Formats** | 7 (HTML, RSS, Atom, JSON, Markdown, Text, Sitemap) | Basic | Basic | Manual | Manual | Basic | Basic |\n| **Single Binary** | Yes | Yes | No | No | No | Yes | No |\n| **Built-in Search** | Pagefind (auto-install) | Manual | Manual | Manual | Manual | Built-in | Manual |\n| **Theme System** | 25+ palettes | Themes | Themes | Manual | Manual | Themes | Themes |\n\n---\n\n## markata-go Feature Highlights\n\nBefore diving into comparisons, here's what makes markata-go unique:\n\n### 34 Built-in Plugins\n\nmarkata-go ships with a comprehensive plugin ecosystem:\n\n| Category | Plugins |\n|----------|---------|\n| **Core** | glob, load, jinja_md, render_markdown, templates |\n| **Feeds** | feeds, auto_feeds, publish_feeds, publish_html, sitemap |\n| **Content Enhancement** | wikilinks, toc, description, auto_title, reading_time, heading_anchors |\n| **Navigation** | prevnext, redirects |\n| **Media \u0026 Visualization** | md_video, youtube, chartjs, mermaid, csv_fence, qrcode |\n| **Linking** | link_collector, glossary, one_line_link, wikilink_hover |\n| **Styling** | palette_css, chroma_css, static_assets |\n| **SEO \u0026 Data** | structured_data, overwrite_check |\n| **Search** | pagefind |\n\n### 7 Feed Output Formats\n\nOne feed definition generates multiple output formats:\n\n```toml\n[[markata-go.feeds]]\nslug = \"tutorials\"\ntitle = \"Go Tutorials\"\nfilter = \"published == True and 'go' in tags\"\n\n[markata-go.feeds.formats]\nhtml = true      # /tutorials/index.html\nrss = true       # /tutorials/rss.xml\natom = true      # /tutorials/atom.xml\njson = true      # /tutorials/feed.json\nmarkdown = true  # /tutorials.md\ntext = true      # /tutorials.txt\nsitemap = true   # Included in sitemap.xml\n```\n\n### 25+ Built-in Color Palettes\n\nThe theme system includes palettes for every preference:\n\n- **Catppuccin**: Frappe, Latte, Macchiato, Mocha\n- **Tokyo Night**: Standard, Day, Storm\n- **Kanagawa**: Wave, Dragon, Lotus\n- **Rose Pine**: Standard, Dawn, Moon\n- **Gruvbox**: Dark, Light\n- **Nord**: Dark, Light\n- **Everforest**: Dark, Light\n- **Solarized**: Dark, Light\n- **Dracula**\n- **Matte Black**\n- **Default**: Dark, Light\n\n```bash\n# List all available palettes\nmarkata-go palette list\n\n# Preview a palette\nmarkata-go palette show \"Tokyo Night\"\n\n# Set palette in config\n[markata-go]\npalette = \"Catppuccin Mocha\"\n```\n\n### 22+ Template Filters\n\n| Category | Filters |\n|----------|---------|\n| **Date** | `date`, `date_format`, `rss_date`, `atom_date`, `isoformat` |\n| **String** | `slugify`, `truncate`, `truncatewords` |\n| **Collection** | `length`, `first`, `last`, `join`, `reverse`, `sort` |\n| **HTML** | `striptags`, `linebreaks`, `linebreaksbr` |\n| **URL** | `urlencode`, `absolute_url` |\n| **Theme** | `theme_asset`, `asset_url` |\n| **Fallback** | `default_if_none` |\n\n```html\n\u003c!-- Date formatting --\u003e\n{{ post.Date | date:\"January 2, 2006\" }}\n{{ post.Date | rss_date }}\n{{ post.Date | isoformat }}\n\n\u003c!-- String manipulation --\u003e\n{{ post.Title | slugify }}\n{{ post.Description | truncate:160 }}\n\n\u003c!-- Collections --\u003e\n{{ post.Tags | join:\", \" }}\n{{ posts | length }} posts\n```\n\n### Comprehensive CLI\n\n```bash\nmarkata-go build          # Build the site\nmarkata-go serve          # Dev server with live reload\nmarkata-go new \"Post\"     # Create a new post\nmarkata-go lint           # Check for common issues\nmarkata-go explain        # Info for AI agents\nmarkata-go benchmark      # Performance testing\nmarkata-go config show    # Show configuration\nmarkata-go palette list   # List color palettes\nmarkata-go init           # Initialize new project\n```\n\n---\n\n## Detailed Comparisons\n\n### Hugo (Go)\n\nHugo is the most popular Go-based static site generator, known for its exceptional build speed.\n\n#### Speed Comparison\n\n| Metric | markata-go | Hugo |\n|--------|------------|------|\n| Build 100 posts | ~200ms | ~150ms |\n| Build 1000 posts | ~1.5s | ~1s |\n| Incremental rebuild | Partial | Full |\n| Dev server startup | Fast | Very Fast |\n\n**Hugo excels**: Raw build speed is Hugo's primary strength. Its highly optimized Go code and aggressive caching make it the fastest SSG available.\n\n**markata-go excels**: Concurrent processing with configurable worker pools. While not quite as fast as Hugo for raw builds, markata-go offers more predictable performance scaling and extensive built-in features.\n\n#### Template Language\n\n| Aspect | markata-go (Pongo2) | Hugo (Go templates) |\n|--------|---------------------|---------------------|\n| Syntax | `{{ post.Title }}` | `{{ .Title }}` |\n| Inheritance | `{% extends \"base.html\" %}` | `{{ define \"main\" }}` |\n| Conditionals | `{% if post.Draft %}` | `{{ if .Draft }}` |\n| Loops | `{% for tag in post.Tags %}` | `{{ range .Params.tags }}` |\n| Filters | `{{ title\\|slugify }}` | `{{ .Title \\| urlize }}` |\n\n**Hugo excels**: Go templates are powerful and allow inline Go code. Hugo's template functions are extensive.\n\n**markata-go excels**: Jinja2-like syntax is more intuitive for developers coming from Python, Django, or Flask. Template inheritance with `{% extends %}` is cleaner than Hugo's partial system.\n\n```html\n\u003c!-- markata-go: Familiar Jinja2 syntax --\u003e\n{% extends \"base.html\" %}\n{% block content %}\n  \u003ch1\u003e{{ post.Title }}\u003c/h1\u003e\n  {{ body|safe }}\n{% endblock %}\n\n\u003c!-- Hugo: Go template syntax --\u003e\n{{ define \"main\" }}\n  \u003ch1\u003e{{ .Title }}\u003c/h1\u003e\n  {{ .Content }}\n{{ end }}\n```\n\n#### Content Organization\n\n| Feature | markata-go | Hugo |\n|---------|------------|------|\n| Content types | Single (posts) | Multiple (page bundles) |\n| Taxonomies | Tags via feeds | Built-in taxonomies |\n| Archetypes | Basic | Advanced |\n| Page bundles | No | Yes |\n| Multilingual | Via config | Built-in |\n\n**Hugo excels**: Page bundles, multiple content types, built-in multilingual support, and sophisticated taxonomy system make Hugo better for complex content structures.\n\n**markata-go excels**: Simpler mental model. Everything is a post, organization comes through the feed system's filtering.\n\n#### Feed System Comparison\n\nThis is where markata-go significantly differs from Hugo.\n\n| Feature | markata-go | Hugo |\n|---------|------------|------|\n| Feed definition | Single config block | Multiple templates |\n| Output formats | 7 from one definition | One template per format |\n| Filter expressions | `\"published == True and 'go' in tags\"` | Complex template logic |\n| Auto-generated feeds | Built-in (tags, categories) | Manual |\n| Pagination | Integrated | Separate config |\n\n**markata-go example:**\n```toml\n[[markata-go.feeds]]\nslug = \"tutorials\"\ntitle = \"Go Tutorials\"\nfilter = \"published == True and 'go' in tags\"\nsort = \"date\"\nreverse = true\n\n[markata-go.feeds.formats]\nhtml = true\nrss = true\natom = true\njson = true\nmarkdown = true\ntext = true\n```\n\nThis single definition generates `/tutorials/index.html`, `/tutorials/rss.xml`, `/tutorials/atom.xml`, `/tutorials/feed.json`, `/tutorials.md`, and `/tutorials.txt`.\n\n**Hugo equivalent** requires separate template files for each format.\n\n#### Plugin/Extension Model\n\n| Aspect | markata-go | Hugo |\n|--------|------------|------|\n| Built-in plugins | 34 | Limited |\n| Extension method | Lifecycle plugins | Modules/themes |\n| Hook points | 9 lifecycle stages | Limited hooks |\n| Third-party plugins | Registry + local | Modules |\n| Custom plugins | Single Go file | Module system |\n\n**Hugo excels**: Hugo Modules provide versioned, composable themes and components.\n\n**markata-go excels**: Fine-grained lifecycle hooks allow plugins to modify content at any stage. A single file can be a complete plugin. 34 built-in plugins cover most common needs.\n\n#### Additional markata-go Features Hugo Lacks\n\n| Feature | markata-go | Hugo |\n|---------|------------|------|\n| Built-in search | Pagefind (auto-install) | Manual setup |\n| Syntax highlighting CSS | Chroma with palette awareness | Chroma (manual CSS) |\n| Chart.js support | Built-in | Manual |\n| Mermaid diagrams | Built-in | Manual |\n| QR code generation | Built-in | Manual |\n| Wikilinks + hover | Built-in | Manual |\n| IndieWeb support | IndieAuth + Webmention | Manual |\n| Structured data | Built-in JSON-LD | Manual |\n\n#### When to Choose Hugo Over markata-go\n\n- You need the absolute fastest build times\n- Your site has complex content types (documentation, products, etc.)\n- You need built-in multilingual support\n- You prefer Go template syntax\n- You need Hugo's massive theme ecosystem\n\n#### When to Choose markata-go Over Hugo\n\n- You prefer Jinja2-like template syntax\n- You need advanced feed filtering with 7 output formats\n- You want 34 built-in plugins covering common needs\n- You need fine-grained plugin hooks\n- You want built-in search, charts, diagrams, and structured data\n- You're building a blog-focused site\n\n---\n\n### Jekyll (Ruby)\n\nJekyll pioneered modern static site generation and remains popular due to GitHub Pages integration.\n\n#### Ease of Use\n\n| Aspect | markata-go | Jekyll |\n|--------|------------|--------|\n| Installation | Single binary | Ruby + gems |\n| Configuration | TOML/YAML/JSON | YAML |\n| Getting started | `markata-go new \"Post\"` | `jekyll new site` |\n| Documentation | Growing | Extensive |\n| Community | Small | Large |\n\n**Jekyll excels**: Mature ecosystem, extensive documentation, huge community.\n\n**markata-go excels**: Zero dependencies, single binary installation, simpler setup.\n\n#### GitHub Pages Integration\n\n| Feature | markata-go | Jekyll |\n|---------|------------|--------|\n| Native support | No | Yes |\n| Build on push | Via Actions | Built-in |\n| Plugin support | Full | Limited on GH Pages |\n| Custom domains | Manual | Built-in |\n\n**Jekyll excels**: First-class GitHub Pages support. Push and deploy with zero configuration.\n\n**markata-go excels**: No plugin restrictions when using GitHub Actions. Full control over build process.\n\n#### Liquid vs Jinja Templates\n\n```html\n\u003c!-- Jekyll (Liquid) --\u003e\n{% for post in site.posts %}\n  \u003ch2\u003e{{ post.title | escape }}\u003c/h2\u003e\n  {{ post.excerpt }}\n{% endfor %}\n\n\u003c!-- markata-go (Pongo2/Jinja) --\u003e\n{% for post in posts %}\n  \u003ch2\u003e{{ post.Title }}\u003c/h2\u003e\n  {{ post.Description }}\n{% endfor %}\n```\n\n| Feature | markata-go (Pongo2) | Jekyll (Liquid) |\n|---------|---------------------|-----------------|\n| Filter syntax | `{{ text\\|slugify }}` | `{{ text \\| slugify }}` |\n| Template inheritance | `{% extends %}` | `{% include %}` |\n| Whitespace control | `{%- -%}` | `{%- -%}` |\n| Custom filters | Go functions | Ruby |\n\nBoth are quite similar! Developers familiar with Liquid will find Pongo2 comfortable.\n\n#### Plugin Ecosystem\n\n| Aspect | markata-go | Jekyll |\n|--------|------------|--------|\n| Plugin format | Go files | Ruby gems |\n| Installation | Built-in or local | `bundle install` |\n| Built-in plugins | 34 | 10+ |\n| SEO plugins | Structured data built-in | jekyll-seo-tag |\n| Sitemap | Built-in | jekyll-sitemap |\n| Search | Pagefind built-in | jekyll-search (manual) |\n\n**Jekyll excels**: Massive plugin ecosystem for nearly any need.\n\n**markata-go excels**: Core features built-in (sitemap, feeds, TOC, search, structured data), no external dependencies.\n\n#### Build Speed\n\n| Site Size | markata-go | Jekyll |\n|-----------|------------|--------|\n| 100 posts | ~200ms | ~2-3s |\n| 500 posts | ~800ms | ~10-15s |\n| 1000 posts | ~1.5s | ~30-60s |\n\n**markata-go is 10-30x faster** for large sites.\n\n#### When to Choose Jekyll Over markata-go\n\n- You need GitHub Pages native integration\n- You want access to thousands of plugins\n- Your team knows Ruby\n- You need extensive community support\n- You're building a simple blog or documentation site\n\n#### When to Choose markata-go Over Jekyll\n\n- Build speed is critical\n- You want zero Ruby dependencies\n- You need advanced feed capabilities with 7 formats\n- You prefer Jinja2-like syntax\n- You want concurrent processing\n- You need built-in search, charts, and structured data\n\n---\n\n### Eleventy (11ty) (JavaScript)\n\nEleventy is a flexible, JavaScript-based SSG that supports multiple template languages.\n\n#### Flexibility\n\n| Aspect | markata-go | Eleventy |\n|--------|------------|----------|\n| Template languages | Pongo2 only | 10+ options |\n| Data sources | Markdown + YAML | Multiple (JSON, YAML, JS, API) |\n| Configuration | TOML/YAML | JavaScript |\n| Customization | 34 plugins | Filters, shortcodes, plugins |\n\n**Eleventy excels**: Unmatched flexibility. Use Nunjucks, Liquid, Handlebars, Pug, EJS, or mix them. Pull data from APIs, databases, or files.\n\n**markata-go excels**: Opinionated choices reduce decision fatigue. One template language, one content format, one config format.\n\n#### Template Language Options\n\nEleventy supports:\n- Nunjucks (Jinja2-like)\n- Liquid\n- Handlebars\n- Mustache\n- Pug\n- EJS\n- JavaScript template literals\n- Custom\n\nmarkata-go supports:\n- Pongo2 (Jinja2/Django-like)\n\nIf you want Jinja2-like syntax, both work well. markata-go's Pongo2 and Eleventy's Nunjucks are nearly identical:\n\n```html\n\u003c!-- Eleventy (Nunjucks) --\u003e\n{% extends \"base.njk\" %}\n{% block content %}\n  {{ content | safe }}\n{% endblock %}\n\n\u003c!-- markata-go (Pongo2) --\u003e\n{% extends \"base.html\" %}\n{% block content %}\n  {{ body|safe }}\n{% endblock %}\n```\n\n#### Data Cascade\n\nEleventy's data cascade is powerful:\n\n```\nGlobal Data (from _data/)\n  -\u003e Layout Data\n    -\u003e Directory Data\n      -\u003e Template Data\n        -\u003e Front Matter\n```\n\nmarkata-go's approach is simpler:\n\n```\nConfig\n  -\u003e Front Matter\n    -\u003e Plugin-generated fields\n```\n\n**Eleventy excels**: Complex data merging from multiple sources.\n\n**markata-go excels**: Predictable, straightforward data flow.\n\n#### Plugin Model\n\n| Feature | markata-go | Eleventy |\n|---------|------------|----------|\n| Plugin type | Lifecycle hooks | JavaScript |\n| Built-in plugins | 34 | Manual |\n| Async support | Concurrent stages | Async/await |\n| Filter addition | Go functions | JS functions |\n| Build hooks | 9 stages | Various events |\n\n```javascript\n// Eleventy plugin example\nmodule.exports = function(eleventyConfig) {\n  eleventyConfig.addFilter(\"slugify\", function(str) {\n    return str.toLowerCase().replace(/\\s+/g, '-');\n  });\n};\n```\n\n```go\n// markata-go plugin example\nfunc (p *MyPlugin) Transform(ctx *lifecycle.Context) error {\n    for _, post := range ctx.Posts {\n        post.Extra[\"custom\"] = processPost(post)\n    }\n    return nil\n}\n```\n\n#### When to Choose Eleventy Over markata-go\n\n- You need multiple template language support\n- Your site pulls data from APIs or databases\n- You want maximum flexibility\n- Your team knows JavaScript well\n- You need complex data cascading\n\n#### When to Choose markata-go Over Eleventy\n\n- You prefer a faster, compiled binary\n- You want opinionated defaults with 34 built-in plugins\n- You need the advanced feed system with 7 formats\n- You prefer Go's performance characteristics\n- You want simpler configuration\n- You need built-in search and visualization\n\n---\n\n### Astro (JavaScript)\n\nAstro is a modern web framework with island architecture and component support.\n\n#### Modern Features\n\n| Feature | markata-go | Astro |\n|---------|------------|-------|\n| Partial hydration | No | Yes (Islands) |\n| Component support | No | React, Vue, Svelte, etc. |\n| SSR support | No | Yes |\n| TypeScript | No | First-class |\n| CSS scoping | No | Built-in |\n\n**Astro excels**: Modern frontend features, component frameworks, partial hydration for optimal performance.\n\n**markata-go excels**: Simpler mental model for content-focused sites. No JavaScript framework overhead.\n\n#### Island Architecture\n\nAstro's island architecture allows interactive components on otherwise static pages:\n\n```astro\n---\n// Astro component\nimport Counter from '../components/Counter.jsx';\n---\n\u003chtml\u003e\n  \u003cbody\u003e\n    \u003ch1\u003eMy Blog Post\u003c/h1\u003e\n    \u003cp\u003eStatic content here...\u003c/p\u003e\n\n    \u003c!-- Only this component ships JavaScript --\u003e\n    \u003cCounter client:load /\u003e\n  \u003c/body\u003e\n\u003c/html\u003e\n```\n\nmarkata-go generates pure static HTML. For interactivity, you add JavaScript manually:\n\n```html\n\u003c!-- markata-go template --\u003e\n\u003chtml\u003e\n  \u003cbody\u003e\n    \u003ch1\u003e{{ post.Title }}\u003c/h1\u003e\n    {{ body|safe }}\n\n    \u003cdiv id=\"counter\"\u003e\u003c/div\u003e\n    \u003cscript src=\"/js/counter.js\"\u003e\u003c/script\u003e\n  \u003c/body\u003e\n\u003c/html\u003e\n```\n\n#### Component Support\n\n| Framework | markata-go | Astro |\n|-----------|------------|-------|\n| React | Manual | Built-in |\n| Vue | Manual | Built-in |\n| Svelte | Manual | Built-in |\n| SolidJS | Manual | Built-in |\n| Preact | Manual | Built-in |\n\n**Astro excels**: Use any frontend framework. Mix and match components.\n\n**markata-go excels**: No framework lock-in. Pure HTML output.\n\n#### Build Output\n\n| Aspect | markata-go | Astro |\n|--------|------------|-------|\n| Default output | Static HTML | Static HTML |\n| JavaScript | Only what you add | Minimal (islands) |\n| Bundle size | Zero baseline | Small baseline |\n| SSR option | No | Yes |\n\nBoth produce static HTML by default, but Astro can switch to SSR mode.\n\n#### When to Choose Astro Over markata-go\n\n- You need interactive components\n- You want to use React/Vue/Svelte\n- You need server-side rendering\n- You're building a web application, not just a blog\n- You want TypeScript support\n\n#### When to Choose markata-go Over Astro\n\n- You want pure static HTML\n- You don't need frontend frameworks\n- Build speed is critical\n- You prefer Go's simplicity\n- You need the advanced feed system\n- You want 34 built-in plugins without configuration\n\n---\n\n### Zola (Rust)\n\nZola is a fast, Rust-based SSG with no dependencies.\n\n#### Speed\n\nBoth markata-go and Zola are extremely fast:\n\n| Metric | markata-go | Zola |\n|--------|------------|------|\n| Language | Go | Rust |\n| Build 100 posts | ~200ms | ~100ms |\n| Build 1000 posts | ~1.5s | ~800ms |\n| Memory usage | Low | Very Low |\n\n**Zola excels**: Slightly faster than markata-go in raw benchmarks due to Rust's zero-cost abstractions.\n\n**markata-go excels**: Go's simpler concurrency model and faster compile times make plugin development easier.\n\n#### Single Binary\n\nBoth tools ship as single binaries with no runtime dependencies.\n\n| Feature | markata-go | Zola |\n|---------|------------|------|\n| Binary size | ~15MB | ~10MB |\n| Dependencies | None | None |\n| Installation | `go install` or download | Download |\n| Cross-platform | Yes | Yes |\n\n#### Tera vs Pongo2 Templates\n\nBoth use Jinja2-inspired template languages:\n\n```html\n\u003c!-- Zola (Tera) --\u003e\n{% extends \"base.html\" %}\n{% block content %}\n  \u003ch1\u003e{{ page.title }}\u003c/h1\u003e\n  {{ page.content | safe }}\n{% endblock %}\n\n\u003c!-- markata-go (Pongo2) --\u003e\n{% extends \"base.html\" %}\n{% block content %}\n  \u003ch1\u003e{{ post.Title }}\u003c/h1\u003e\n  {{ body|safe }}\n{% endblock %}\n```\n\nNearly identical syntax! Both inherit from Jinja2/Django templates.\n\n#### Taxonomy System\n\n| Feature | markata-go | Zola |\n|---------|------------|------|\n| Tags | Via feed filter | Built-in taxonomy |\n| Categories | Via feed filter | Built-in taxonomy |\n| Custom taxonomies | Via feeds | Built-in |\n| Taxonomy templates | Feed templates | Dedicated templates |\n\n**Zola approach:**\n```toml\n# Zola config.toml\ntaxonomies = [\n    { name = \"tags\" },\n    { name = \"categories\" },\n]\n```\n\n**markata-go approach:**\n```toml\n# markata-go.toml\n[markata-go.feeds.auto_tags]\nenabled = true\nslug_prefix = \"tags\"\n```\n\nBoth achieve similar results, but markata-go's feed system is more flexible for filtering.\n\n#### Feature Comparison\n\n| Feature | markata-go | Zola |\n|---------|------------|------|\n| Built-in plugins | 34 | N/A (no plugin system) |\n| Search | Pagefind (auto) | Built-in |\n| Sass compilation | No | Built-in |\n| Shortcodes | Via templates | Built-in |\n| Feed formats | 7 | 2 (RSS, Atom) |\n| Charts/Diagrams | Chart.js, Mermaid | Manual |\n\n#### When to Choose Zola Over markata-go\n\n- You need the absolute fastest builds\n- You prefer Rust\n- You want Zola's built-in taxonomy system\n- You need Sass compilation built-in\n- You like Zola's shortcode system\n\n#### When to Choose markata-go Over Zola\n\n- You prefer Go\n- You need the advanced feed system with 7 formats\n- You want 34 fine-grained plugin hooks\n- You need built-in charts, diagrams, and QR codes\n- You want concurrent post processing\n- You need IndieWeb support (IndieAuth, Webmention)\n\n---\n\n### Pelican (Python)\n\nPelican is a Python-based SSG with Jinja2 templates.\n\n#### Python Ecosystem\n\n| Aspect | markata-go | Pelican |\n|--------|------------|---------|\n| Language | Go | Python |\n| Templates | Pongo2 (Jinja2-like) | Jinja2 |\n| Config | TOML/YAML | Python |\n| Plugins | Go | Python |\n\n**Pelican excels**: Native Python. Configuration in Python allows programmatic setup. Plugins can use the entire Python ecosystem.\n\n**markata-go excels**: Faster builds, single binary distribution, no Python environment needed.\n\n#### Plugin Model\n\n| Feature | markata-go | Pelican |\n|---------|------------|---------|\n| Plugin hooks | 9 lifecycle stages | Signals |\n| Plugin format | Go interfaces | Python modules |\n| Plugin discovery | Registry | Entry points |\n| Built-in plugins | 34 | 10+ |\n\n```python\n# Pelican plugin example\nfrom pelican import signals\n\ndef add_reading_time(generator):\n    for article in generator.articles:\n        words = len(article.content.split())\n        article.reading_time = f\"{words // 200} min read\"\n\ndef register():\n    signals.article_generator_finalized.connect(add_reading_time)\n```\n\n```go\n// markata-go plugin example\nfunc (p *ReadingTimePlugin) Transform(ctx *lifecycle.Context) error {\n    for _, post := range ctx.Posts {\n        words := len(strings.Fields(post.Content))\n        post.Extra[\"reading_time\"] = fmt.Sprintf(\"%d min read\", words/200)\n    }\n    return nil\n}\n```\n\n#### Jinja2 Templates\n\nPelican uses actual Jinja2, while markata-go uses Pongo2 (a Go port):\n\n```html\n\u003c!-- Pelican (Jinja2) --\u003e\n{% extends \"base.html\" %}\n{% block content %}\n  {% for article in articles %}\n    \u003ch2\u003e\u003ca href=\"{{ article.url }}\"\u003e{{ article.title }}\u003c/a\u003e\u003c/h2\u003e\n    {{ article.summary }}\n  {% endfor %}\n{% endblock %}\n\n\u003c!-- markata-go (Pongo2) --\u003e\n{% extends \"base.html\" %}\n{% block content %}\n  {% for post in posts %}\n    \u003ch2\u003e\u003ca href=\"{{ post.Href }}\"\u003e{{ post.Title }}\u003c/a\u003e\u003c/h2\u003e\n    {{ post.Description }}\n  {% endfor %}\n{% endblock %}\n```\n\n99% compatible syntax. The main difference is variable naming conventions.\n\n#### When to Choose Pelican Over markata-go\n\n- Your team knows Python\n- You need Python-based plugins\n- You want configuration in Python\n- You need Pelican's theme ecosystem\n\n#### When to Choose markata-go Over Pelican\n\n- Build speed is important\n- You want single binary distribution\n- You need the advanced feed system with 7 formats\n- You prefer Go's concurrency model\n- You don't want Python dependencies\n- You want 34 built-in plugins\n\n---\n\n## Feature Deep Dives\n\n### The Feed System Advantage\n\nmarkata-go's feed system is its primary differentiator. One feed definition produces multiple outputs:\n\n```toml\n[[markata-go.feeds]]\nslug = \"python\"\ntitle = \"Python Posts\"\nfilter = \"published == True and 'python' in tags\"\nsort = \"date\"\nreverse = true\nitems_per_page = 10\n\n[markata-go.feeds.formats]\nhtml = true      # /python/index.html + pagination\nrss = true       # /python/rss.xml\natom = true      # /python/atom.xml\njson = true      # /python/feed.json\nmarkdown = true  # /python.md\ntext = true      # /python.txt\n```\n\n**What other SSGs require:**\n\n| SSG | RSS Template | Atom Template | JSON Template | Markdown | Text | Total Files |\n|-----|--------------|---------------|---------------|----------|------|-------------|\n| Hugo | Yes | Yes | Yes | Yes | Yes | 5+ templates |\n| Jekyll | Yes | Yes | Manual | Manual | Manual | 2+ templates |\n| Eleventy | Yes | Yes | Manual | Manual | Manual | 2+ templates |\n| Zola | Yes | Yes | Manual | Manual | Manual | 2+ templates |\n| Pelican | Built-in | Plugin | Manual | Manual | Manual | Variable |\n\n**markata-go:** One config block, zero templates needed, 7 output formats.\n\n### Theme and Palette System\n\nmarkata-go includes a sophisticated theming system:\n\n```toml\n[markata-go]\npalette = \"Tokyo Night\"  # Choose from 25+ palettes\n```\n\n**Features:**\n- 25+ built-in palettes (dark and light variants)\n- Automatic CSS variable generation\n- Palette-aware syntax highlighting (Chroma)\n- Light/dark mode support\n- `markata-go palette list` to see all options\n- `markata-go palette show \"Name\"` to preview colors\n\n**Generated CSS includes:**\n- Primary, secondary, accent colors\n- Background and surface colors\n- Text colors with proper contrast\n- Border and shadow colors\n- Syntax highlighting colors matched to palette\n\n### Search Integration\n\nmarkata-go integrates Pagefind for full-text search:\n\n```toml\n[markata-go.pagefind]\nenabled = true\nauto_install = true  # Automatically downloads Pagefind\n```\n\n**Features:**\n- Zero-configuration search indexing\n- Automatic Pagefind installation\n- Palette-aware styling\n- Works offline (client-side)\n- Minimal JavaScript footprint\n\n### Visualization Support\n\nBuilt-in support for data visualization:\n\n**Chart.js:**\n````markdown\n```chartjs\n{\n  \"type\": \"bar\",\n  \"data\": {\n    \"labels\": [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n    \"datasets\": [{\"data\": [10, 20, 30, 40]}]\n  }\n}\n```\n````\n\n**Mermaid Diagrams:**\n````markdown\n```mermaid\ngraph TD\n    A[Start] --\u003e B[Process]\n    B --\u003e C[End]\n```\n````\n\n**CSV Tables:**\n````markdown\n```csv\nName,Age,City\nAlice,30,NYC\nBob,25,LA\n```\n````\n\n### IndieWeb Support\n\nBuilt-in IndieWeb integration:\n\n```toml\n[markata-go.indieauth]\nenabled = true\nauthorization_endpoint = \"https://indieauth.com/auth\"\ntoken_endpoint = \"https://tokens.indieauth.com/token\"\nme_url = \"https://example.com\"\n\n[markata-go.webmention]\nenabled = true\nendpoint = \"https://webmention.io/example.com/webmention\"\n```\n\n### Developer Experience\n\n**Live Reload Server:**\n```bash\nmarkata-go serve  # Builds and serves with live reload\n```\n\n**Linting:**\n```bash\nmarkata-go lint  # Check for common issues\n```\n\n**Performance Testing:**\n```bash\nmarkata-go benchmark  # Run build benchmarks\n```\n\n**AI Agent Support:**\n```bash\nmarkata-go explain  # Output info for AI coding assistants\n```\n\n### Plugin Architecture Comparison\n\n| SSG | Plugin Language | Hook Points | Built-in Plugins | Ease of Writing |\n|-----|-----------------|-------------|------------------|-----------------|\n| markata-go | Go | 9 stages | 34 | Medium |\n| Hugo | Go | Limited | N/A | Hard |\n| Jekyll | Ruby | Multiple | 10+ | Easy |\n| Eleventy | JavaScript | Many | Manual | Easy |\n| Astro | JavaScript | Integrations | Manual | Easy |\n| Zola | None | N/A | N/A | N/A |\n| Pelican | Python | Signals | 10+ | Easy |\n\nmarkata-go's 9-stage lifecycle provides predictable hook points:\n\n1. **Configure** - Load config, init plugins\n2. **Validate** - Check configuration\n3. **Glob** - Find content files\n4. **Load** - Parse markdown and frontmatter\n5. **Transform** - Pre-render processing\n6. **Render** - Markdown to HTML\n7. **Collect** - Build feeds and collections\n8. **Write** - Output files\n9. **Cleanup** - Release resources\n\n### Template Syntax Comparison\n\nAll Jinja2-inspired:\n\n| Operation | markata-go | Hugo | Jekyll | Eleventy (Nunjucks) | Zola |\n|-----------|------------|------|--------|---------------------|------|\n| Variable | `{{ post.Title }}` | `{{ .Title }}` | `{{ page.title }}` | `{{ post.title }}` | `{{ page.title }}` |\n| Filter | `{{ text\\|upper }}` | `{{ .Text \\| upper }}` | `{{ text \\| upcase }}` | `{{ text \\| upper }}` | `{{ text \\| upper }}` |\n| If | `{% if x %}` | `{{ if .X }}` | `{% if x %}` | `{% if x %}` | `{% if x %}` |\n| For | `{% for x in list %}` | `{{ range .List }}` | `{% for x in list %}` | `{% for x in list %}` | `{% for x in list %}` |\n| Extends | `{% extends \"x\" %}` | `{{ define }}` | Includes | `{% extends \"x\" %}` | `{% extends \"x\" %}` |\n\nmarkata-go, Eleventy (Nunjucks), and Zola (Tera) have the most similar syntax.\n\n---\n\n## Migration Guides\n\n### Migrating from Hugo\n\n1. **Content Migration**\n   - Hugo frontmatter is largely compatible\n   - Change `draft: true` to `draft: true` (same!)\n   - Change `tags: [\"go\", \"web\"]` to `tags: [\"go\", \"web\"]` (same!)\n   - Remove Hugo-specific fields (`type`, `layout`)\n\n2. **Template Migration**\n   ```go\n   // Hugo\n   {{ .Title }}\n   {{ .Content }}\n   {{ range .Params.tags }}{{ . }}{{ end }}\n\n   // markata-go\n   {{ post.Title }}\n   {{ body|safe }}\n   {% for tag in post.Tags %}{{ tag }}{% endfor %}\n   ```\n\n3. **Configuration Migration**\n   ```toml\n   # Hugo config.toml\n   baseURL = \"https://example.com\"\n   title = \"My Site\"\n\n   # markata-go.toml\n   [markata-go]\n   url = \"https://example.com\"\n   title = \"My Site\"\n   ```\n\n4. **Feed Migration**\n   - Replace RSS template with feed configuration\n   - Convert taxonomy templates to auto-feed config\n\n### Migrating from Jekyll\n\n1. **Content Migration**\n   - Move `_posts/` to `posts/`\n   - Remove date prefix from filenames (optional)\n   - Update frontmatter: `layout` -\u003e `template`\n\n2. **Template Migration**\n   ```liquid\n   \u003c!-- Jekyll (Liquid) --\u003e\n   {{ page.title }}\n   {{ content }}\n   {% for tag in page.tags %}{{ tag }}{% endfor %}\n\n   \u003c!-- markata-go (Pongo2) --\u003e\n   {{ post.Title }}\n   {{ body|safe }}\n   {% for tag in post.Tags %}{{ tag }}{% endfor %}\n   ```\n\n3. **Plugin Migration**\n   - Replace Ruby gems with markata-go plugins or built-ins\n   - `jekyll-sitemap` -\u003e built-in sitemap plugin\n   - `jekyll-feed` -\u003e feed system configuration\n\n### Migrating from Eleventy\n\n1. **Content Migration**\n   - Nunjucks frontmatter is compatible\n   - Data files need conversion to frontmatter or config\n\n2. **Template Migration**\n   - Nunjucks templates work with minimal changes\n   - Update variable names (`post` vs lowercase)\n   - Replace shortcodes with template includes\n\n3. **Configuration Migration**\n   - Convert `.eleventy.js` to `markata-go.toml`\n   - Convert filters to Go plugin functions\n\n### Migrating from Zola\n\n1. **Content Migration**\n   - Tera frontmatter is largely compatible\n   - Remove Zola-specific fields (`weight`, `extra`)\n\n2. **Template Migration**\n   - Tera and Pongo2 syntax is nearly identical\n   - Update variable names\n   - Convert shortcodes to template includes\n\n3. **Configuration Migration**\n   ```toml\n   # Zola config.toml\n   base_url = \"https://example.com\"\n   title = \"My Site\"\n\n   # markata-go.toml\n   [markata-go]\n   url = \"https://example.com\"\n   title = \"My Site\"\n   ```\n\n### Migrating from Pelican\n\n1. **Content Migration**\n   - Pelican metadata format differs slightly\n   - Convert `Title:` to YAML frontmatter\n\n2. **Template Migration**\n   - Jinja2 and Pongo2 are nearly identical\n   - Update variable names (`article` -\u003e `post`)\n\n3. **Plugin Migration**\n   - Convert Python plugins to Go\n   - Many Pelican plugins have markata-go equivalents\n\n---\n\n## Decision Matrix\n\n### Choose markata-go if you need:\n\n- **Advanced feed system** - 7 formats from one definition\n- **Jinja2-like templates** - Familiar syntax for Python developers\n- **Fast builds** - Go performance without Hugo complexity\n- **Plugin flexibility** - 34 built-in plugins, 9 lifecycle hooks\n- **Simple deployment** - Single binary, no runtime dependencies\n- **Concurrent processing** - Parallel post processing\n- **Built-in search** - Pagefind with auto-install\n- **Theme system** - 25+ color palettes with automatic CSS\n- **Visualization** - Chart.js, Mermaid, CSV tables built-in\n- **IndieWeb support** - IndieAuth and Webmention\n- **Developer tools** - Live reload, linting, benchmarks, AI support\n\n### Choose an alternative if you need:\n\n| Need | Best Choice |\n|------|-------------|\n| Fastest possible builds | Hugo or Zola |\n| GitHub Pages native | Jekyll |\n| Multiple template languages | Eleventy |\n| Frontend frameworks | Astro |\n| Python ecosystem | Pelican |\n| Built-in taxonomies | Hugo or Zola |\n| SSR/hybrid rendering | Astro |\n| Maximum flexibility | Eleventy |\n| Largest theme ecosystem | Hugo or Jekyll |\n\n### Latest Post Embeds\n\n| Static Site Generator | Ergonomic Pattern for \"Latest N\" Posts |\n|------------------------|--------------------------------------|\n| `markata-go` | `render_feed(\"slug\", {\"limit\": N, \"variant\": \"card\"})` drops in `partials/feed_preview.html`, which now routes to `partials/cards/card-router.html` so each post type renders with its template-specific card (photo/shot cards render as `\u003cfigure\u003e`s with captions). `feed_posts()` still returns template-friendly maps for bespoke layouts without raw HTML. |\n| Hugo | `{{ range first 5 (where .Site.RegularPages \"Section\" \"posts\") }}` with cards over `.RenderString` or `partialCached`. Card layouts require custom partials. |\n| Jekyll | `{% for post in site.posts limit:5 %}` and include a `_includes/post-card.html` for card styling. Data access via `site.posts` is immediate. |\n| Eleventy | Define a collection (`collections.posts`) and `{% for post of collections.posts | slice(0,5) %}`. Custom card markup is handled via Nunjucks includes or shortcodes. |\n| Zola | Use `paginate(get_section(\"posts\"))` or `range (section.pages) | sort_by(date | desc) | slice(0,5)` in Tera templates; card markup lives in `templates/partials/` includes. |\n| Pelican | Templates iterate `articles[:5]` (or `category.articles`) and rely on Jinja macros for cards; feeds and data come from the engine during `generate_context`. |\n| Astro | `const posts = await collections.getCollection(\"posts\")` + `posts.slice(0,5)` inside `\u003cFragment\u003e` plus lightweight components for cards. |\n| Zensical | Built on MkDocs, so \"latest\" snippets come from nav lists or MkDocs plugins like `mkdocs-blog-plugin`; there is no first-class post collection, so you either maintain a hand-written list or read a data file and render it via a custom macro. |\n\nmarkata-go's new helpers deliver both data and rendered cards with sensible defaults, matching or surpassing the ergonomics of the other SSGs while keeping Markdown clean.\n\n---\n\n## Conclusion\n\nmarkata-go occupies a unique position in the SSG landscape:\n\n**Strengths:**\n- Powerful, unified feed system with 7 output formats\n- 34 built-in plugins covering most common needs\n- Jinja2-like templates that feel familiar\n- Fast Go performance with concurrent processing\n- Clean 9-stage plugin architecture\n- Single binary distribution\n- Built-in search with Pagefind\n- 25+ color palettes with automatic CSS generation\n- Chart.js, Mermaid, and CSV visualization\n- IndieWeb support (IndieAuth, Webmention)\n- Developer-friendly CLI with lint, benchmark, and explain commands\n\n**Trade-offs:**\n- Smaller ecosystem than Hugo or Jekyll\n- Less flexible than Eleventy\n- No frontend framework integration like Astro\n- Fewer built-in features than Hugo for complex sites\n\n**Ideal for:**\n- Content-focused blogs and publications\n- Sites needing multiple feed formats\n- Developers who prefer Jinja2 syntax\n- Projects requiring custom plugin development\n- Teams wanting Go performance without Go template complexity\n- Sites needing built-in search, charts, and visualization\n- IndieWeb participants\n\nThe best SSG is the one that fits your workflow. markata-go excels for content-heavy sites where the feed system shines, while alternatives may be better for complex web applications or specific ecosystem needs.\n\n---\n\n## Further Reading\n\n- [[getting-started|Getting Started Guide]]\n- [[feeds-guide|Feed System Guide]]\n- [[plugin-development|Plugin Development Guide]]\n- [[templates-guide|Template Guide]]\n- [[configuration-guide|Configuration Guide]]\n",
      "summary": "Comprehensive comparison of markata-go against Hugo, Jekyll, Eleventy, Astro, Zola, and Pelican",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "comparison"
      ]
    },
    {
      "id": "https://markata.dev/docs/advanced-usage/",
      "url": "https://markata.dev/docs/advanced-usage/",
      "title": "Advanced Usage",
      "content_html": "\u003cp\u003eThis guide is for power users who want to leverage markata-go\u0026rsquo;s full capabilities. It covers complex configurations, optimization techniques, and advanced patterns that go beyond the basics.\u003c/p\u003e\n\u003ch2 id=\"table-of-contents\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTable of Contents\u003c/span\u003e \u003ca href=\"#table-of-contents\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#complex-feed-configurations\"\u003eComplex Feed Configurations\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#dynamic-content-with-jinja-in-markdown\"\u003eDynamic Content with Jinja-in-Markdown\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#advanced-filtering\"\u003eAdvanced Filtering\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#custom-plugin-development\"\u003eCustom Plugin Development\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#performance-optimization\"\u003ePerformance Optimization\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#multi-environment-builds\"\u003eMulti-Environment Builds\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#advanced-templates\"\u003eAdvanced Templates\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#wikilinks-and-internal-linking\"\u003eWikilinks and Internal Linking\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#table-of-contents-generation\"\u003eTable of Contents Generation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#admonitions-and-callouts\"\u003eAdmonitions and Callouts\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"complex-feed-configurations\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComplex Feed Configurations\u003c/span\u003e \u003ca href=\"#complex-feed-configurations\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe feed system is markata-go\u0026rsquo;s most powerful feature. Beyond basic usage, you can create sophisticated content architectures with multiple feeds, nested hierarchies, and custom API endpoints.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRelated guides:\u003c/strong\u003e [[feeds-guide|Feeds Guide]], [[syndication-feeds|Syndication Feeds]]\u003c/p\u003e\n\u003ch3 id=\"multiple-feeds-with-different-filters\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMultiple Feeds with Different Filters\u003c/span\u003e \u003ca href=\"#multiple-feeds-with-different-filters\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate specialized feeds that slice your content in different ways:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Tech Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# FEED DEFAULTS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefaults\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edefaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# CONTENT FEEDS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# =============================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Home page - curated recent posts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Home\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and date \u0026lt;= today\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Main blog archive\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;All Posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Tutorials only\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Step-by-step programming guides\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and \u0026#39;tutorial\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Featured/curated content\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;featured\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Featured Articles\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Hand-picked must-read articles\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and featured == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Quick tips (short-form content)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tips\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Quick Tips\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and \u0026#39;tip\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Long-form essays\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;essays\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Essays\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and category == \u0026#39;essay\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"nested-feeds-categories-within-tags\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNested Feeds (Categories within Tags)\u003c/span\u003e \u003ca href=\"#nested-feeds-categories-within-tags\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate hierarchical content organization with nested URL structures:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Top-level language categories\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;go\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Go Articles\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and \u0026#39;go\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;python\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Python Articles\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and \u0026#39;python\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Nested: Go tutorials\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;go/tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Go Tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and \u0026#39;go\u0026#39; in tags and \u0026#39;tutorial\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Nested: Go tips\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;go/tips\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Go Tips\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and \u0026#39;go\u0026#39; in tags and \u0026#39;tip\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Nested: Python tutorials\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;python/tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Python Tutorials\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and \u0026#39;python\u0026#39; in tags and \u0026#39;tutorial\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Nested: Python advanced\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;python/advanced\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Advanced Python\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and \u0026#39;python\u0026#39; in tags and difficulty == \u0026#39;advanced\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eGenerated structure:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e/go/\n  index.html\n  rss.xml\n  tutorials/\n    index.html\n    rss.xml\n  tips/\n    index.html\n    rss.xml\n/python/\n  index.html\n  tutorials/\n    index.html\n  advanced/\n    index.html\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"custom-json-api-endpoints\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom JSON API Endpoints\u003c/span\u003e \u003ca href=\"#custom-json-api-endpoints\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate JSON-only feeds to serve as lightweight APIs:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Full posts API (all fields)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;api/posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Posts API\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e                  \u003cspan class=\"c\"\u003e# No pagination - all posts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Lightweight posts list (for autocomplete, etc.)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;api/posts/list\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Posts List\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;api-list.json\u0026#34;\u003c/span\u003e              \u003cspan class=\"c\"\u003e# Custom minimal template\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Posts by year\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;api/posts/2024\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2024 Posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and date \u0026gt;= \u0026#39;2024-01-01\u0026#39; and date \u0026lt; \u0026#39;2025-01-01\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCustom API template (\u003ccode\u003etemplates/api-list.json\u003c/code\u003e):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;count\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e \u003cspan class=\"err\"\u003efeed.posts|length\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"err\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s2\"\u003e\u0026#34;posts\u0026#34;\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e \u003cspan class=\"err\"\u003efor\u003c/span\u003e \u003cspan class=\"err\"\u003epost\u003c/span\u003e \u003cspan class=\"err\"\u003ein\u003c/span\u003e \u003cspan class=\"err\"\u003efeed.posts\u003c/span\u003e \u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e \u003cspan class=\"err\"\u003epost.title|tojson\u003c/span\u003e \u003cspan class=\"p\"\u003e}},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;slug\u0026#34;\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e \u003cspan class=\"err\"\u003epost.slug|tojson\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;href\u0026#34;\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e \u003cspan class=\"err\"\u003epost.href|tojson\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e \u003cspan class=\"err\"\u003epost.date|atom_date|tojson\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;tags\u0026#34;\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e \u003cspan class=\"err\"\u003epost.tags|tojson\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e \u003cspan class=\"err\"\u003eif\u003c/span\u003e \u003cspan class=\"err\"\u003enot\u003c/span\u003e \u003cspan class=\"err\"\u003eforloop.Last\u003c/span\u003e \u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e},{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e \u003cspan class=\"err\"\u003eendif\u003c/span\u003e \u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e \u003cspan class=\"err\"\u003eendfor\u003c/span\u003e \u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"search-indexes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSearch Indexes\u003c/span\u003e \u003ca href=\"#search-indexes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGenerate a JSON index optimized for client-side search (e.g., with Lunr.js, Fuse.js, or Pagefind):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;search-index\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Search Index\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erss\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;search-index.json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSearch index template (\u003ccode\u003etemplates/search-index.json\u003c/code\u003e):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;index\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e \u003cspan class=\"err\"\u003efor\u003c/span\u003e \u003cspan class=\"err\"\u003epost\u003c/span\u003e \u003cspan class=\"err\"\u003ein\u003c/span\u003e \u003cspan class=\"err\"\u003efeed.posts\u003c/span\u003e \u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e \u003cspan class=\"err\"\u003eforloop.Counter0\u003c/span\u003e \u003cspan class=\"p\"\u003e}},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e \u003cspan class=\"err\"\u003epost.title|tojson\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;href\u0026#34;\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e \u003cspan class=\"err\"\u003epost.href|tojson\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;content\u0026#34;\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e \u003cspan class=\"err\"\u003epost.content|striptags|truncate:1000|tojson\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e \u003cspan class=\"err\"\u003epost.description|default_if_none:\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"err\"\u003e|tojson\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;tags\u0026#34;\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e \u003cspan class=\"err\"\u003epost.tags|tojson\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e \u003cspan class=\"err\"\u003epost.date|date_format:\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#34;2006-01-02\u0026#34;\u003c/span\u003e\u003cspan class=\"err\"\u003e|tojson\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e \u003cspan class=\"err\"\u003eif\u003c/span\u003e \u003cspan class=\"err\"\u003enot\u003c/span\u003e \u003cspan class=\"err\"\u003eforloop.Last\u003c/span\u003e \u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e},{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e \u003cspan class=\"err\"\u003eendif\u003c/span\u003e \u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"err\"\u003e%\u003c/span\u003e \u003cspan class=\"err\"\u003eendfor\u003c/span\u003e \u003cspan class=\"err\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eJavaScript integration with Fuse.js:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Load search index\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efetch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;/search-index/feed.json\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ethen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003er\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ethen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003efuse\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eFuse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003ekeys\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;title\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;content\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;tags\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;description\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003ethreshold\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003eincludeScore\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e// Search function\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003equery\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003eresults\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003efuse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003equery\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nx\"\u003eresults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emap\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003er\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e({\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eitem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nx\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eitem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehref\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nx\"\u003escore\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003escore\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e}));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"dynamic-content-with-jinja-in-markdown\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDynamic Content with Jinja-in-Markdown\u003c/span\u003e \u003ca href=\"#dynamic-content-with-jinja-in-markdown\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe \u003ccode\u003ejinja_md\u003c/code\u003e plugin enables powerful dynamic content generation directly within your Markdown files.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRelated guide:\u003c/strong\u003e [[dynamic-content|Dynamic Content]]\u003c/p\u003e\n\u003ch3 id=\"embedding-post-lists-in-content\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEmbedding Post Lists in Content\u003c/span\u003e \u003ca href=\"#embedding-post-lists-in-content\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate dynamic index pages that automatically update:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Documentation\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Documentation\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWelcome to the docs. Here\u0026#39;s everything organized by topic.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Getting Started\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in core.filter(\u0026#34;published == True and \u0026#39;getting-started\u0026#39; in tags\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ p.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ p.Href }}\u003c/span\u003e) - {{ p.Description|default_if_none:\u0026#34;\u0026#34;|truncate:80 }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Core Concepts\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in core.filter(\u0026#34;published == True and \u0026#39;core-concepts\u0026#39; in tags\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ p.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ p.Href }}\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## API Reference\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in core.filter(\u0026#34;published == True and \u0026#39;api\u0026#39; in tags\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ p.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ p.Href }}\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"series-navigation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSeries Navigation\u003c/span\u003e \u003ca href=\"#series-navigation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eBuild automatic series navigation that stays in sync:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Building a CLI in Go: Part 2\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;go-cli\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eseries_order\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;nav class=\u0026#34;series-nav\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;strong\u0026gt;Series: Building a CLI in Go\u0026lt;/strong\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% set series_posts = [] %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in core.filter(\u0026#34;published == True\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if p.Extra.series == \u0026#34;go-cli\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% set _ = series_posts.append(p) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;ol\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in series_posts|sort(attribute=\u0026#39;Extra.series_order\u0026#39;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if p.Extra.series_order == post.Extra.series_order %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;li\u0026gt;\u0026lt;strong\u0026gt;{{ p.Title }}\u0026lt;/strong\u0026gt; (current)\u0026lt;/li\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;{{ p.Href }}\u0026#34;\u0026gt;{{ p.Title }}\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;/ol\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% set current_order = post.Extra.series_order %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;div class=\u0026#34;series-pagination\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in series_posts %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if p.Extra.series_order == current_order - 1 %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;a href=\u0026#34;{{ p.Href }}\u0026#34; class=\u0026#34;prev\u0026#34;\u0026gt;Previous: {{ p.Title }}\u0026lt;/a\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if p.Extra.series_order == current_order + 1 %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;a href=\u0026#34;{{ p.Href }}\u0026#34; class=\u0026#34;next\u0026#34;\u0026gt;Next: {{ p.Title }}\u0026lt;/a\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;/div\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;/nav\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Building a CLI in Go: Part 2\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eNow let\u0026#39;s add subcommands to our CLI...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"dynamic-table-of-contents\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDynamic Table of Contents\u003c/span\u003e \u003ca href=\"#dynamic-table-of-contents\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGenerate a table of contents from your content structure:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Complete Go Guide\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Complete Go Guide\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Table of Contents\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% set beginner = core.filter(\u0026#34;published == True and \u0026#39;go\u0026#39; in tags and difficulty == \u0026#39;beginner\u0026#39;\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% set intermediate = core.filter(\u0026#34;published == True and \u0026#39;go\u0026#39; in tags and difficulty == \u0026#39;intermediate\u0026#39;\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% set advanced = core.filter(\u0026#34;published == True and \u0026#39;go\u0026#39; in tags and difficulty == \u0026#39;advanced\u0026#39;\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Beginner ({{ beginner|length }} articles)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in beginner %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e1.\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ p.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ p.Href }}\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Intermediate ({{ intermediate|length }} articles)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in intermediate %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e1.\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ p.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ p.Href }}\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Advanced ({{ advanced|length }} articles)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in advanced %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e1.\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ p.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ p.Href }}\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"related-posts-widget\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRelated Posts Widget\u003c/span\u003e \u003ca href=\"#related-posts-widget\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eShow contextually related posts:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Understanding Go Interfaces\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003ego, interfaces, tutorial]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejinja\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Understanding Go Interfaces\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[Your article content...]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## Related Articles\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% set related = [] %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in core.filter(\u0026#34;published == True\u0026#34;) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if p.Slug != post.Slug %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for tag in post.Tags %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if tag in p.Tags and p not in related %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% set _ = related.append(p) %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% for p in related[:5] %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [\u003cspan class=\"nt\"\u003e{{ p.Title }}\u003c/span\u003e](\u003cspan class=\"na\"\u003e{{ p.Href }}\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"advanced-filtering\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdvanced Filtering\u003c/span\u003e \u003ca href=\"#advanced-filtering\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe filter expression system supports complex queries for precise content selection.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRelated guides:\u003c/strong\u003e [[frontmatter-guide|Frontmatter]], [[feeds-guide|Feeds Guide]]\u003c/p\u003e\n\u003ch3 id=\"complex-filter-expressions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComplex Filter Expressions\u003c/span\u003e \u003ca href=\"#complex-filter-expressions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCombine multiple conditions with logical operators:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Published, non-draft, with specific tag, from current year\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and draft == False and \u0026#39;tutorial\u0026#39; in tags and date \u0026gt;= \u0026#39;2024-01-01\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Multiple tags (OR logic)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and (\u0026#39;go\u0026#39; in tags or \u0026#39;python\u0026#39; in tags or \u0026#39;rust\u0026#39; in tags)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Exclude specific content\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and slug != \u0026#39;about\u0026#39; and slug != \u0026#39;contact\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Complex nested logic\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;(published == True and featured == True) or (published == True and \u0026#39;highlight\u0026#39; in tags)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"date-based-filtering\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDate-Based Filtering\u003c/span\u003e \u003ca href=\"#date-based-filtering\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse dynamic date comparisons:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Only past/present posts (no scheduled future posts)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and date \u0026lt;= today\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Posts from the last 30 days\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and date \u0026gt;= today - 30\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Posts from a specific year\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and date \u0026gt;= \u0026#39;2024-01-01\u0026#39; and date \u0026lt; \u0026#39;2025-01-01\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Posts from a specific month\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and date \u0026gt;= \u0026#39;2024-06-01\u0026#39; and date \u0026lt; \u0026#39;2024-07-01\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Evergreen content (no date or old date is fine)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and (date == None or date \u0026lt;= today)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"custom-field-filtering\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Field Filtering\u003c/span\u003e \u003ca href=\"#custom-field-filtering\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFilter on any frontmatter field:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# By author\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and author == \u0026#39;Jane Doe\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# By category\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and category == \u0026#39;Backend\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# By difficulty level\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and difficulty == \u0026#39;beginner\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# By custom boolean\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and sponsored == False\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# By series membership\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and series == \u0026#39;Building a Blog\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# By numeric field\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and word_count \u0026gt;= 1000\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# By reading time\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and reading_time_minutes \u0026lt;= 5\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"string-method-filters\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eString Method Filters\u003c/span\u003e \u003ca href=\"#string-method-filters\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse string methods for pattern matching:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Slugs with a prefix\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and slug.startswith(\u0026#39;tutorials/\u0026#39;)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Slugs with a suffix\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and slug.endswith(\u0026#39;-guide\u0026#39;)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Title contains keyword\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and title.lower().contains(\u0026#39;docker\u0026#39;)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Category starts with\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and category.startswith(\u0026#39;Web\u0026#39;)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"filter-cheat-sheet\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFilter Cheat Sheet\u003c/span\u003e \u003ca href=\"#filter-cheat-sheet\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePattern\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eEquality\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efield == 'value'\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eInequality\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efield != 'value'\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBoolean check\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epublished == True\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTag membership\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e'tag' in tags\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDate comparison\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edate \u0026gt;= '2024-01-01'\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eToday\u0026rsquo;s date\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edate \u0026lt;= today\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eNull check\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efield == None\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eString prefix\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eslug.startswith('prefix/')\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eString contains\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etitle.lower().contains('word')\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAND\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003econd1 and cond2\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eOR\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003econd1 or cond2\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eNOT\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003enot condition\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGrouping\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(cond1 or cond2) and cond3\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"custom-plugin-development\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Plugin Development\u003c/span\u003e \u003ca href=\"#custom-plugin-development\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen built-in functionality isn\u0026rsquo;t enough, write custom plugins to extend markata-go.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRelated guide:\u003c/strong\u003e [[plugin-development|Plugin Development]]\u003c/p\u003e\n\u003ch3 id=\"when-to-write-a-plugin\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhen to Write a Plugin\u003c/span\u003e \u003ca href=\"#when-to-write-a-plugin\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConsider a custom plugin when you need to:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAdd computed fields to posts (reading time, word count, etc.)\u003c/li\u003e\n\u003cli\u003eProcess content in a custom way (shortcodes, custom syntax)\u003c/li\u003e\n\u003cli\u003eIntegrate with external services (APIs, databases)\u003c/li\u003e\n\u003cli\u003eGenerate additional output files\u003c/li\u003e\n\u003cli\u003eImplement custom validation rules\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"plugin-architecture-overview\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlugin Architecture Overview\u003c/span\u003e \u003ca href=\"#plugin-architecture-overview\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePlugins hook into markata-go\u0026rsquo;s 9-stage lifecycle:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003econfigure → validate → glob → load → transform → render → collect → write → cleanup\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eEach stage has a specific purpose:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eStage\u003c/th\u003e\n\u003cth\u003ePurpose\u003c/th\u003e\n\u003cth\u003eCommon Uses\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eConfigure\u003c/td\u003e\n\u003ctd\u003eInitialize plugin state\u003c/td\u003e\n\u003ctd\u003eRead config, set up clients\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eValidate\u003c/td\u003e\n\u003ctd\u003eValidate configuration\u003c/td\u003e\n\u003ctd\u003eCheck required fields\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGlob\u003c/td\u003e\n\u003ctd\u003eDiscover files\u003c/td\u003e\n\u003ctd\u003eCustom file patterns\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLoad\u003c/td\u003e\n\u003ctd\u003eParse files to posts\u003c/td\u003e\n\u003ctd\u003eCustom parsers\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTransform\u003c/td\u003e\n\u003ctd\u003ePre-render processing\u003c/td\u003e\n\u003ctd\u003eComputed fields, shortcodes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRender\u003c/td\u003e\n\u003ctd\u003eConvert to HTML\u003c/td\u003e\n\u003ctd\u003eMarkdown extensions\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCollect\u003c/td\u003e\n\u003ctd\u003eBuild aggregations\u003c/td\u003e\n\u003ctd\u003eCustom feeds, indexes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWrite\u003c/td\u003e\n\u003ctd\u003eWrite output\u003c/td\u003e\n\u003ctd\u003eCustom file generation\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCleanup\u003c/td\u003e\n\u003ctd\u003eRelease resources\u003c/td\u003e\n\u003ctd\u003eClose connections\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"example-custom-shortcode-plugin\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample: Custom Shortcode Plugin\u003c/span\u003e \u003ca href=\"#example-custom-shortcode-plugin\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eHere\u0026rsquo;s a complete plugin that adds shortcode support (e.g., \u003ccode\u003e{{\u0026lt; youtube id=\u0026quot;...\u0026quot; \u0026gt;}}\u003c/code\u003e):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003epackage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;regexp\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;strings\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;github.com/example/markata-go/pkg/lifecycle\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;github.com/example/markata-go/pkg/models\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// ShortcodePlugin processes shortcodes in markdown content.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eShortcodePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eshortcodes\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003emap\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"nx\"\u003eShortcodeFunc\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// ShortcodeFunc is a function that processes a shortcode.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eShortcodeFunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003emap\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// NewShortcodePlugin creates a new ShortcodePlugin with built-in shortcodes.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewShortcodePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eShortcodePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003eShortcodePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003eshortcodes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003emake\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003emap\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"nx\"\u003eShortcodeFunc\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Register built-in shortcodes\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;youtube\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eyoutubeShortcode\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gist\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003egistShortcode\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;tweet\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etweetShortcode\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;figure\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efigureShortcode\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Name returns the plugin name.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eShortcodePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;shortcodes\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Register adds a custom shortcode.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eShortcodePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eShortcodeFunc\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eshortcodes\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efn\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Transform processes shortcodes in all posts.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eShortcodePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eTransform\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eProcessPostsConcurrently\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003emodels\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePost\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSkip\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContent\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContent\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eprocessShortcodes\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContent\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Shortcode pattern: {{\u0026lt; name param=\u0026#34;value\u0026#34; \u0026gt;}}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eshortcodePattern\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eregexp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eMustCompile\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e`\\{\\{\u0026lt;\\s*(\\w+)\\s*([^\u0026gt;]*)\\s*\u0026gt;\\}\\}`\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Param pattern: key=\u0026#34;value\u0026#34; or key=\u0026#39;value\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eparamPattern\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eregexp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eMustCompile\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e`(\\w+)=[\u0026#34;\u0026#39;]([^\u0026#34;\u0026#39;]*)[\u0026#34;\u0026#39;]`\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eShortcodePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eprocessShortcodes\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eshortcodePattern\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eReplaceAllStringFunc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ematch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003esubmatches\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eshortcodePattern\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFindStringSubmatch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ematch\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003esubmatches\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ematch\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003esubmatches\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003eparamsStr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003esubmatches\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003eparamsStr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003esubmatches\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Parse parameters\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003emake\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003emap\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003eparamMatches\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eparamPattern\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFindAllStringSubmatch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eparamsStr\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epm\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eparamMatches\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epm\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003epm\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epm\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Execute shortcode\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efn\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eshortcodes\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003efn\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ematch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Unknown shortcode, leave as-is\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Built-in shortcodes\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eyoutubeShortcode\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003emap\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026lt;!-- youtube: missing id --\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e`\u0026lt;div class=\u0026#34;video-container\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e\u0026lt;iframe src=\u0026#34;https://www.youtube.com/embed/%s\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e        frameborder=\u0026#34;0\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e        allowfullscreen\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e        loading=\u0026#34;lazy\u0026#34;\u0026gt;\u0026lt;/iframe\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e\u0026lt;/div\u0026gt;`\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003egistShortcode\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003emap\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003euser\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;user\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003euser\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026lt;!-- gist: missing user or id --\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e`\u0026lt;script src=\u0026#34;https://gist.github.com/%s/%s.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt;`\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003euser\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003etweetShortcode\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003emap\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026lt;!-- tweet: missing id --\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e`\u0026lt;blockquote class=\u0026#34;twitter-tweet\u0026#34; data-dnt=\u0026#34;true\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e\u0026lt;a href=\u0026#34;https://twitter.com/x/status/%s\u0026#34;\u0026gt;\u0026lt;/a\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e\u0026lt;/blockquote\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e\u0026lt;script async src=\u0026#34;https://platform.twitter.com/widgets.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt;`\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003efigureShortcode\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003emap\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003esrc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;src\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ealt\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;alt\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ecaption\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;caption\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003esrc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026lt;!-- figure: missing src --\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e`\u0026lt;figure\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e\u0026lt;img src=\u0026#34;%s\u0026#34; alt=\u0026#34;%s\u0026#34; loading=\u0026#34;lazy\u0026#34;\u0026gt;`\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003esrc\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ealt\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecaption\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e`\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e\u0026lt;figcaption\u0026gt;%s\u0026lt;/figcaption\u0026gt;`\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecaption\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e`\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e\u0026lt;/figure\u0026gt;`\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Interface verification\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eShortcodePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)(\u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTransformPlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eShortcodePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)(\u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eUsage in markdown:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Video Tutorial\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Getting Started with Go\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWatch the video tutorial:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{\u0026lt; youtube id=\u0026#34;YS4e4q9oBaU\u0026#34; \u0026gt;}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCheck out this code snippet:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{\u0026lt; gist user=\u0026#34;example\u0026#34; id=\u0026#34;abc123\u0026#34; \u0026gt;}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{\u0026lt; figure src=\u0026#34;/images/diagram.png\u0026#34; alt=\u0026#34;Architecture\u0026#34; caption=\u0026#34;System architecture diagram\u0026#34; \u0026gt;}}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"performance-optimization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePerformance Optimization\u003c/span\u003e \u003ca href=\"#performance-optimization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOptimize markata-go for large sites with thousands of posts.\u003c/p\u003e\n\u003ch3 id=\"concurrent-processing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConcurrent Processing\u003c/span\u003e \u003ca href=\"#concurrent-processing\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go processes posts concurrently by default. Control concurrency via configuration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econcurrency\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e    \u003cspan class=\"c\"\u003e# 0 = auto-detect (uses all CPU cores)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# concurrency = 4  # Limit to 4 workers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# concurrency = 1  # Sequential processing (for debugging)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor custom plugins, use the built-in concurrent processor:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eMyPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eTransform\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eProcessPostsConcurrently\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003emodels\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePost\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// This runs in parallel across posts\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eprocessPost\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"incremental-builds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIncremental Builds\u003c/span\u003e \u003ca href=\"#incremental-builds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor faster development, markata-go can skip unchanged files:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Standard build (processes all files)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Serve with watch mode (enabled by default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Serve without file watching\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve --no-watch\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBy default, the dev server rebuilds deterministically on every change while still using build cache to skip expensive per-post work. For the fastest loop, use:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go serve --fast\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFast mode rebuilds only the changed posts plus any dependents discovered from the dependency graph, and disables blogroll/mentions to keep the loop tight. Feed collection also skips when no changed posts touch a feed. If a change alters dependencies (links, embeds), the server performs a second pass to update the affected posts.\u003c/p\u003e\n\u003ch3 id=\"caching-strategies\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCaching Strategies\u003c/span\u003e \u003ca href=\"#caching-strategies\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor expensive operations, implement caching in your plugins:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eMyPlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eTransform\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003elifecycle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eManager\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ecache\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCache\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePosts\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Generate cache key from content hash\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003ekey\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;processed:%s\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eContentHash\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Check cache\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecached\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eGet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;processed_data\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecached\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Expensive operation\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003eresult\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eexpensiveOperation\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Store in cache\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eresult\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;processed_data\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eresult\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"large-site-considerations\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLarge Site Considerations\u003c/span\u003e \u003ca href=\"#large-site-considerations\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor sites with 1000+ posts:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eLimit feed items:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esyndication\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emax_items\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Don\u0026#39;t include all posts in RSS/Atom\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUse pagination:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Reasonable page size\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eorphan_threshold\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eMinimize Jinja-in-Markdown:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePre-compute expensive queries\u003c/li\u003e\n\u003cli\u003eCache dynamic content\u003c/li\u003e\n\u003cli\u003eUse feeds instead of inline queries\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eOptimize glob patterns:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eglob\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epatterns\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;posts/**/*.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Specific patterns\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003euse_gitignore\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e            \u003cspan class=\"c\"\u003e# Skip ignored files\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eProfile builds:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build -v --profile\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"build-time-benchmarks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBuild Time Benchmarks\u003c/span\u003e \u003ca href=\"#build-time-benchmarks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePosts\u003c/th\u003e\n\u003cth\u003eCold Build\u003c/th\u003e\n\u003cth\u003eIncremental\u003c/th\u003e\n\u003cth\u003eWith Watch\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e100\u003c/td\u003e\n\u003ctd\u003e~1s\u003c/td\u003e\n\u003ctd\u003e~0.2s\u003c/td\u003e\n\u003ctd\u003e~50ms\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1,000\u003c/td\u003e\n\u003ctd\u003e~5s\u003c/td\u003e\n\u003ctd\u003e~0.5s\u003c/td\u003e\n\u003ctd\u003e~100ms\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e10,000\u003c/td\u003e\n\u003ctd\u003e~30s\u003c/td\u003e\n\u003ctd\u003e~2s\u003c/td\u003e\n\u003ctd\u003e~200ms\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cem\u003eTimes vary based on content complexity, plugins, and hardware.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"multi-environment-builds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMulti-Environment Builds\u003c/span\u003e \u003ca href=\"#multi-environment-builds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eConfigure markata-go for different deployment environments.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRelated guides:\u003c/strong\u003e [[configuration-guide|Configuration]], [[deployment-guide|Deployment]]\u003c/p\u003e\n\u003ch3 id=\"staging-vs-production\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStaging vs Production\u003c/span\u003e \u003ca href=\"#staging-vs-production\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse environment variables to customize builds:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Production build\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com markata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Staging build\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://staging.example.com markata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Preview build (e.g., for PR previews)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://preview-123.example.com markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"environment-variables-reference\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnvironment Variables Reference\u003c/span\u003e \u003ca href=\"#environment-variables-reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAll configuration can be overridden via environment variables:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Core settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_TITLE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;My Site\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_OUTPUT_DIR\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003edist\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_CONCURRENCY\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Feature flags\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_DRAFT_MODE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003etrue\u003c/span\u003e           \u003cspan class=\"c1\"\u003e# Include drafts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_FUTURE_POSTS\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003etrue\u003c/span\u003e         \u003cspan class=\"c1\"\u003e# Include scheduled posts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Feed settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_FEED_DEFAULTS_ITEMS_PER_PAGE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e20\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"ci-cd-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCI/CD Integration\u003c/span\u003e \u003ca href=\"#ci-cd-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"github-actions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGitHub Actions\u003c/span\u003e \u003ca href=\"#github-actions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003emain]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eruns-on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eubuntu-latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSetup Go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/setup-go@v5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ego-version\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1.22\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eInstall markata-go\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ego install github.com/example/markata-go/cmd/markata-go@latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild (Production)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub.ref == \u0026#39;refs/heads/main\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eBuild (Preview)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub.event_name == \u0026#39;pull_request\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emarkata-go build --clean\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nt\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://preview-${{ github.event.number }}.example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDeploy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003egithub.ref == \u0026#39;refs/heads/main\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eactions/deploy-pages@v4\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"netlify\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNetlify\u003c/span\u003e \u003ca href=\"#netlify\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# netlify.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003ecommand\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;go install github.com/example/markata-go/cmd/markata-go@latest \u0026amp;\u0026amp; markata-go build --clean\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003epublish\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eproduction\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eenvironment\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eMARKATA_GO_URL\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edeploy-preview\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003eenvironment\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eMARKATA_GO_URL\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e  \u003cspan class=\"c\"\u003e# Uses deploy preview URL\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"docker\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocker\u003c/span\u003e \u003ca href=\"#docker\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Build stage\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003egolang:1.22-alpine\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eAS\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eWORKDIR\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e/build\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eARG\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eENV\u003c/span\u003e \u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nv\"\u003e$MARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e go install github.com/example/markata-go/cmd/markata-go@latest\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e . .\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e markata-go build --clean\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Production stage\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003enginx:alpine\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e --from\u003cspan class=\"o\"\u003e=\u003c/span\u003ebuilder /build/public /usr/share/nginx/html\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBuild for different environments:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Production\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker build --build-arg \u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://example.com -t site:prod .\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Staging\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker build --build-arg \u003cspan class=\"nv\"\u003eMARKATA_GO_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://staging.example.com -t site:staging .\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"advanced-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdvanced Templates\u003c/span\u003e \u003ca href=\"#advanced-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMaster template inheritance, conditionals, and reusable components.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRelated guide:\u003c/strong\u003e [[templates-guide|Templates Guide]]\u003c/p\u003e\n\u003ch3 id=\"template-inheritance-patterns\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Inheritance Patterns\u003c/span\u003e \u003ca href=\"#template-inheritance-patterns\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate a flexible base template with multiple extension points:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# templates/base.html #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u0026lt;!DOCTYPE html\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehtml\u003c/span\u003e \u003cspan class=\"na\"\u003elang\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;en\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003echarset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;UTF-8\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;viewport\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;width=device-width, initial-scale=1.0\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {# SEO block - can be fully overridden #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% block seo %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{% block title %}{{ config.Title }}{% endblock %}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{% block description %}{{ config.Description }}{% endblock %}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {# Open Graph - extendable #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% block opengraph %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:title\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{% block og_title %}{{ config.Title }}{% endblock %}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:type\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{% block og_type %}website{% endblock %}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;og:url\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ config.URL }}{% block og_url %}/{% endblock %}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {# Styles - extendable #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% block styles %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;stylesheet\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/css/main.css\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {# Extra head content #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% block head %}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ebody\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{% block body_class %}{% endblock %}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% block skip_link %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#main\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;skip-link\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eSkip to content\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% block header %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% include \u0026#34;partials/header.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% block main %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emain\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;main\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% block content %}{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% block footer %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% include \u0026#34;partials/footer.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% block scripts %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/js/main.js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ehtml\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"conditional-layouts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConditional Layouts\u003c/span\u003e \u003ca href=\"#conditional-layouts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse different layouts based on post metadata:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# templates/post.html #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% extends \u0026#34;base.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block body_class %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epost\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.Extra.featured %}featured{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.Extra.wide %}wide-layout{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{% if post.Extra.layout %}{{ post.Extra.layout }}{% else %}standard{% endif %}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {# Hero section for featured posts #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if post.Extra.hero_image %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hero\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;background-image: url(\u0026#39;{{ post.Extra.hero_image }}\u0026#39;)\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eheader\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eheader\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {# Sidebar for posts with TOC #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if post.Extra.toc %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;with-sidebar\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003easide\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;toc\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{ post.Extra.toc_html|safe }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003easide\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;content\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{ body|safe }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% else %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;content\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {{ body|safe }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {# Series navigation #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if post.Extra.series %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% include \u0026#34;partials/series-nav.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"reusable-components\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReusable Components\u003c/span\u003e \u003ca href=\"#reusable-components\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate composable partial templates:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# templates/partials/card.html #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{#\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  Expects: post object\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  Optional: show_image, show_tags, show_excerpt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card {% if post.Extra.featured %}card--featured{% endif %}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if show_image|default_if_none:true and post.Extra.cover_image %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Href }}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card__image\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Extra.cover_image }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Title }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             \u003cspan class=\"na\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card__body\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card__title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Href }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% if show_excerpt|default_if_none:true and post.Description %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card__excerpt\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Description|truncate:120 }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card__meta\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% if post.Date %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e \u003cspan class=\"na\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ post.Date|atom_date }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                {{ post.Date|date_format:\u0026#34;Jan 2, 2006\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% if post.Extra.reading_time %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;reading-time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Extra.reading_time }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003espan\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003efooter\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% if show_tags|default_if_none:false and post.Tags %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;card__tags\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% for tag in post.Tags|slice:\u0026#34;:3\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/tags/{{ tag|slugify }}/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ tag }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse the component with different configurations:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# Full card with image and tags #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% with show_image=true, show_tags=true %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% include \u0026#34;partials/card.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endwith %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# Minimal card without image #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% with show_image=false %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% include \u0026#34;partials/card.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endwith %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# Text-only card #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% with show_image=false, show_excerpt=false %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% include \u0026#34;partials/card.html\u0026#34; %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endwith %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"wikilinks-and-internal-linking\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWikilinks and Internal Linking\u003c/span\u003e \u003ca href=\"#wikilinks-and-internal-linking\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUse \u003ccode\u003e[[wikilink]]\u003c/code\u003e syntax for easy cross-referencing between posts.\u003c/p\u003e\n\u003ch3 id=\"basic-wikilink-syntax\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasic Wikilink Syntax\u003c/span\u003e \u003ca href=\"#basic-wikilink-syntax\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eLink to other posts using their slug:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Go Interfaces\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Understanding Go Interfaces\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eInterfaces in Go are implicit. See [[go-structs]] for how structs work.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFor more on type systems, check out [[go-type-system|the type system guide]].\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRelated: [[go-generics]], [[go-methods]]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eSyntax variants:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSyntax\u003c/th\u003e\n\u003cth\u003eOutput\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e[[slug]]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLink with auto-title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e`[[slug\u003c/td\u003e\n\u003ctd\u003eCustom Text]]`\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e[[slug#section]]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLink to specific section\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e`[[slug#section\u003c/td\u003e\n\u003ctd\u003eText]]`\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"cross-referencing-posts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCross-Referencing Posts\u003c/span\u003e \u003ca href=\"#cross-referencing-posts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eCreate bidirectional links for a wiki-like experience:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Go Structs\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eslug\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;go-structs\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# Go Structs\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eStructs are the primary way to create custom types in Go.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSee also:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [[go-interfaces]] - How interfaces work with structs\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [[go-methods]] - Adding methods to structs\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e [[go-embedding]] - Struct embedding patterns\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"broken-link-detection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBroken Link Detection\u003c/span\u003e \u003ca href=\"#broken-link-detection\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go validates wikilinks during build and warns about broken links:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e$ markata-go build\nWarning: Broken wikilink in posts/go-structs.md: [[go-embedding]] (post not found)\nWarning: Broken wikilink in posts/intro.md: [[getting-started#setup]] (section not found)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eEnable strict mode to fail builds on broken links:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estrict_wikilinks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Fail build on broken links\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"backlinks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBacklinks\u003c/span\u003e \u003ca href=\"#backlinks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe link collector provides backlinks (posts that link to the current post):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{# In post.html template #}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% if post.inlinks %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003easide\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;backlinks\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eLinked from\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh3\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% for link in post.inlinks %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{{ link.source_post.href }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ link.source_post.title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endfor %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003easide\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"table-of-contents-generation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTable of Contents Generation\u003c/span\u003e \u003ca href=\"#table-of-contents-generation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAutomatically generate navigation for long-form content.\u003c/p\u003e\n\u003ch3 id=\"enable-toc-generation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnable TOC Generation\u003c/span\u003e \u003ca href=\"#enable-toc-generation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdd \u003ccode\u003etoc: true\u003c/code\u003e to your frontmatter:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Complete Go Guide\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etoc\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etoc_depth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e3\u003c/span\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"c\"\u003e# Include h1, h2, h3 (default: 2)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etoc_min_items\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e3\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"c\"\u003e# Only show TOC if 3+ headings (default: 2)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Introduction\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e## Getting Started\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e### Installation\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e### Configuration\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e## Core Concepts\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e### Variables\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e### Functions\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e## Advanced Topics\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"toc-output\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTOC Output\u003c/span\u003e \u003ca href=\"#toc-output\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe TOC is available as \u003ccode\u003epost.Extra.toc_html\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;toc\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eContents\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eol\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#introduction\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eIntroduction\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#getting-started\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eGetting Started\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eol\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#installation\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eInstallation\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#configuration\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eConfiguration\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eol\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#core-concepts\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eCore Concepts\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eol\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#variables\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eVariables\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#functions\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eFunctions\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eol\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;#advanced-topics\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eAdvanced Topics\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eol\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003enav\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"template-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTemplate Integration\u003c/span\u003e \u003ca href=\"#template-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eInclude the TOC in your post template:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% block content %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eheader\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e{{ post.Title }}\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eheader\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% if post.Extra.toc_html %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003easide\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;toc-sidebar\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {{ post.Extra.toc_html|safe }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003easide\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {% endif %}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;post-content\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {{ body|safe }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003earticle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{% endblock %}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"styling-the-toc\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStyling the TOC\u003c/span\u003e \u003ca href=\"#styling-the-toc\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003etoc\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eposition\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003esticky\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003etop\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003emax-height\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003ecalc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"kt\"\u003evh\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eoverflow-y\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eauto\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003epadding\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ebg\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003esecondary\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eborder-radius\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003etoc\u003c/span\u003e \u003cspan class=\"nt\"\u003eol\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003elist-style\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enone\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003epadding-left\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003etoc\u003c/span\u003e \u003cspan class=\"nt\"\u003eol\u003c/span\u003e \u003cspan class=\"nt\"\u003eol\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003epadding-left\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003emargin-top\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003etoc\u003c/span\u003e \u003cspan class=\"nt\"\u003ea\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eblock\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003epadding\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.25\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003etext\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003esecondary\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003etext-decoration\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enone\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003etoc\u003c/span\u003e \u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003ehover\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003etoc\u003c/span\u003e \u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eactive\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"kc\"\u003etext\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eprimary\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e/* Highlight current section with JavaScript */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003etoc\u003c/span\u003e \u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eactive\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efont-weight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e600\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eaccent\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"admonitions-and-callouts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdmonitions and Callouts\u003c/span\u003e \u003ca href=\"#admonitions-and-callouts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCreate visually distinct callout blocks for notes, warnings, tips, and more.\u003c/p\u003e\n\u003ch3 id=\"admonition-syntax\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdmonition Syntax\u003c/span\u003e \u003ca href=\"#admonition-syntax\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUse fenced blocks with type indicators:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::note\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis is a note. Use it for additional information.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::tip\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePro tip! This helps users work more efficiently.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::warning\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBe careful! This action has consequences.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::danger\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCritical warning! This could cause data loss.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::info\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eInformational callout for context.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"admonition-with-custom-title\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdmonition with Custom Title\u003c/span\u003e \u003ca href=\"#admonition-with-custom-title\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::note Custom Title\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis note has a custom title instead of \u0026#34;Note\u0026#34;.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::warning Before You Continue\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMake sure you\u0026#39;ve completed the prerequisites.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"rendered-output\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRendered Output\u003c/span\u003e \u003ca href=\"#rendered-output\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdmonitions render as styled HTML:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;admonition admonition-note\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;admonition-title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eNote\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;admonition-content\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eThis is a note. Use it for additional information.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"available-types\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAvailable Types\u003c/span\u003e \u003ca href=\"#available-types\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eIcon\u003c/th\u003e\n\u003cth\u003eUse Case\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enote\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInfo icon\u003c/td\u003e\n\u003ctd\u003eAdditional context\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etip\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLightbulb\u003c/td\u003e\n\u003ctd\u003eHelpful suggestions\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einfo\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInfo circle\u003c/td\u003e\n\u003ctd\u003eBackground information\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewarning\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWarning triangle\u003c/td\u003e\n\u003ctd\u003ePotential issues\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edanger\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eX circle\u003c/td\u003e\n\u003ctd\u003eCritical warnings\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esuccess\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCheckmark\u003c/td\u003e\n\u003ctd\u003eConfirmations\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexample\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCode icon\u003c/td\u003e\n\u003ctd\u003eCode examples\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003equote\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eQuote icon\u003c/td\u003e\n\u003ctd\u003eQuotations\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eabstract\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDocument\u003c/td\u003e\n\u003ctd\u003eSummaries\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"custom-admonition-types\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom Admonition Types\u003c/span\u003e \u003ca href=\"#custom-admonition-types\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDefine custom types in your configuration:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eadmonitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Define a custom \u0026#34;exercise\u0026#34; type\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eadmonitions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eexercise\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eicon\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pencil\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecolor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#6366f1\u0026#34;\u003c/span\u003e    \u003cspan class=\"c\"\u003e# Indigo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse in markdown:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::exercise Practice Problem\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWrite a function that reverses a string.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"styling-admonitions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStyling Admonitions\u003c/span\u003e \u003ca href=\"#styling-admonitions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003emargin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e1.5\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003epadding\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eborder-left\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"kc\"\u003esolid\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eborder-radius\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ebackground\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nf\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ebg\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003esecondary\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition-title\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efont-weight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e600\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003emargin-bottom\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eflex\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ealign-items\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003ecenter\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003egap\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition-note\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eborder-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#3b82f6\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition-tip\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eborder-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#22c55e\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition-warning\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eborder-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f59e0b\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition-danger\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eborder-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ef4444\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition-info\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eborder-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#06b6d4\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition-note\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition-title\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#3b82f6\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition-tip\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition-title\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#22c55e\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition-warning\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition-title\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#f59e0b\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition-danger\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition-title\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#ef4444\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition-info\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003eadmonition-title\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#06b6d4\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"collapsible-admonitions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCollapsible Admonitions\u003c/span\u003e \u003ca href=\"#collapsible-admonitions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eMake admonitions collapsible with the \u003ccode\u003ecollapse\u003c/code\u003e modifier:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::tip collapse Expand for Pro Tips\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThese tips are hidden by default to keep the content focused.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e Tip 1: Use keyboard shortcuts\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e Tip 2: Enable caching\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e Tip 3: Run in parallel\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRenders as:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003edetails\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;admonition admonition-tip\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003esummary\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;admonition-title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eExpand for Pro Tips\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003esummary\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;admonition-content\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eThese tips are hidden by default...\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003edetails\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"see-also\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSee Also\u003c/span\u003e \u003ca href=\"#see-also\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[[feeds-guide|Feeds Guide]] - Complete feed system documentation\u003c/li\u003e\n\u003cli\u003e[[templates-guide|Templates Guide]] - Template system reference\u003c/li\u003e\n\u003cli\u003e[[configuration-guide|Configuration Guide]] - Full configuration options\u003c/li\u003e\n\u003cli\u003e[[plugin-development|Plugin Development]] - Create custom plugins\u003c/li\u003e\n\u003cli\u003e[[dynamic-content|Dynamic Content]] - Jinja-in-Markdown guide\u003c/li\u003e\n\u003cli\u003e[[deployment-guide|Deployment]] - Deployment and CI/CD\u003c/li\u003e\n\u003cli\u003e[[frontmatter-guide|Frontmatter]] - Frontmatter field reference\u003c/li\u003e\n\u003cli\u003e[[syndication-feeds|Syndication Feeds]] - RSS, Atom, JSON feeds\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\nThis guide is for power users who want to leverage markata-go's full capabilities. It covers complex configurations, optimization techniques, and advanced patterns that go beyond the basics.\n\n## Table of Contents\n\n- [Complex Feed Configurations](#complex-feed-configurations)\n- [Dynamic Content with Jinja-in-Markdown](#dynamic-content-with-jinja-in-markdown)\n- [Advanced Filtering](#advanced-filtering)\n- [Custom Plugin Development](#custom-plugin-development)\n- [Performance Optimization](#performance-optimization)\n- [Multi-Environment Builds](#multi-environment-builds)\n- [Advanced Templates](#advanced-templates)\n- [Wikilinks and Internal Linking](#wikilinks-and-internal-linking)\n- [Table of Contents Generation](#table-of-contents-generation)\n- [Admonitions and Callouts](#admonitions-and-callouts)\n\n---\n\n## Complex Feed Configurations\n\nThe feed system is markata-go's most powerful feature. Beyond basic usage, you can create sophisticated content architectures with multiple feeds, nested hierarchies, and custom API endpoints.\n\n**Related guides:** [[feeds-guide|Feeds Guide]], [[syndication-feeds|Syndication Feeds]]\n\n### Multiple Feeds with Different Filters\n\nCreate specialized feeds that slice your content in different ways:\n\n```toml\n[markata-go]\ntitle = \"Tech Blog\"\nurl = \"https://example.com\"\n\n# =============================================================================\n# FEED DEFAULTS\n# =============================================================================\n[markata-go.feeds.defaults]\nitems_per_page = 10\n\n[markata-go.feeds.defaults.formats]\nhtml = true\nrss = true\n\n# =============================================================================\n# CONTENT FEEDS\n# =============================================================================\n\n# Home page - curated recent posts\n[[markata-go.feeds]]\nslug = \"\"\ntitle = \"Home\"\nfilter = \"published == True and date \u003c= today\"\nsort = \"date\"\nreverse = true\nitems_per_page = 5\nformats = { rss = false }\n\n# Main blog archive\n[[markata-go.feeds]]\nslug = \"blog\"\ntitle = \"All Posts\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\n\n# Tutorials only\n[[markata-go.feeds]]\nslug = \"tutorials\"\ntitle = \"Tutorials\"\ndescription = \"Step-by-step programming guides\"\nfilter = \"published == True and 'tutorial' in tags\"\nsort = \"date\"\nreverse = true\n\n# Featured/curated content\n[[markata-go.feeds]]\nslug = \"featured\"\ntitle = \"Featured Articles\"\ndescription = \"Hand-picked must-read articles\"\nfilter = \"published == True and featured == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 6\n\n# Quick tips (short-form content)\n[[markata-go.feeds]]\nslug = \"tips\"\ntitle = \"Quick Tips\"\nfilter = \"published == True and 'tip' in tags\"\nsort = \"date\"\nreverse = true\nitems_per_page = 20\n\n# Long-form essays\n[[markata-go.feeds]]\nslug = \"essays\"\ntitle = \"Essays\"\nfilter = \"published == True and category == 'essay'\"\nsort = \"date\"\nreverse = true\nitems_per_page = 5\n```\n\n### Nested Feeds (Categories within Tags)\n\nCreate hierarchical content organization with nested URL structures:\n\n```toml\n# Top-level language categories\n[[markata-go.feeds]]\nslug = \"go\"\ntitle = \"Go Articles\"\nfilter = \"published == True and 'go' in tags\"\nsort = \"date\"\nreverse = true\n\n[[markata-go.feeds]]\nslug = \"python\"\ntitle = \"Python Articles\"\nfilter = \"published == True and 'python' in tags\"\nsort = \"date\"\nreverse = true\n\n# Nested: Go tutorials\n[[markata-go.feeds]]\nslug = \"go/tutorials\"\ntitle = \"Go Tutorials\"\nfilter = \"published == True and 'go' in tags and 'tutorial' in tags\"\nsort = \"date\"\nreverse = true\n\n# Nested: Go tips\n[[markata-go.feeds]]\nslug = \"go/tips\"\ntitle = \"Go Tips\"\nfilter = \"published == True and 'go' in tags and 'tip' in tags\"\nsort = \"date\"\nreverse = true\n\n# Nested: Python tutorials\n[[markata-go.feeds]]\nslug = \"python/tutorials\"\ntitle = \"Python Tutorials\"\nfilter = \"published == True and 'python' in tags and 'tutorial' in tags\"\nsort = \"date\"\nreverse = true\n\n# Nested: Python advanced\n[[markata-go.feeds]]\nslug = \"python/advanced\"\ntitle = \"Advanced Python\"\nfilter = \"published == True and 'python' in tags and difficulty == 'advanced'\"\nsort = \"date\"\nreverse = true\n```\n\n**Generated structure:**\n```\n/go/\n  index.html\n  rss.xml\n  tutorials/\n    index.html\n    rss.xml\n  tips/\n    index.html\n    rss.xml\n/python/\n  index.html\n  tutorials/\n    index.html\n  advanced/\n    index.html\n```\n\n### Custom JSON API Endpoints\n\nCreate JSON-only feeds to serve as lightweight APIs:\n\n```toml\n# Full posts API (all fields)\n[[markata-go.feeds]]\nslug = \"api/posts\"\ntitle = \"Posts API\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 0                  # No pagination - all posts\n\n[markata-go.feeds.formats]\nhtml = false\nrss = false\njson = true\n\n# Lightweight posts list (for autocomplete, etc.)\n[[markata-go.feeds]]\nslug = \"api/posts/list\"\ntitle = \"Posts List\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 0\n\n[markata-go.feeds.formats]\njson = true\nhtml = false\nrss = false\n\n[markata-go.feeds.templates]\njson = \"api-list.json\"              # Custom minimal template\n\n# Posts by year\n[[markata-go.feeds]]\nslug = \"api/posts/2024\"\ntitle = \"2024 Posts\"\nfilter = \"published == True and date \u003e= '2024-01-01' and date \u003c '2025-01-01'\"\nsort = \"date\"\nreverse = true\nitems_per_page = 0\n\n[markata-go.feeds.formats]\njson = true\nhtml = false\n```\n\nCustom API template (`templates/api-list.json`):\n\n```json\n{\n  \"count\": {{ feed.posts|length }},\n  \"posts\": [\n    {% for post in feed.posts %}\n    {\n      \"title\": {{ post.title|tojson }},\n      \"slug\": {{ post.slug|tojson }},\n      \"href\": {{ post.href|tojson }},\n      \"date\": {{ post.date|atom_date|tojson }},\n      \"tags\": {{ post.tags|tojson }}\n    }{% if not forloop.Last %},{% endif %}\n    {% endfor %}\n  ]\n}\n```\n\n### Search Indexes\n\nGenerate a JSON index optimized for client-side search (e.g., with Lunr.js, Fuse.js, or Pagefind):\n\n```toml\n[[markata-go.feeds]]\nslug = \"search-index\"\ntitle = \"Search Index\"\nfilter = \"published == True\"\nsort = \"date\"\nreverse = true\nitems_per_page = 0\n\n[markata-go.feeds.formats]\nhtml = false\nrss = false\njson = true\n\n[markata-go.feeds.templates]\njson = \"search-index.json\"\n```\n\nSearch index template (`templates/search-index.json`):\n\n```json\n{\n  \"index\": [\n    {% for post in feed.posts %}\n    {\n      \"id\": {{ forloop.Counter0 }},\n      \"title\": {{ post.title|tojson }},\n      \"href\": {{ post.href|tojson }},\n      \"content\": {{ post.content|striptags|truncate:1000|tojson }},\n      \"description\": {{ post.description|default_if_none:\"\"|tojson }},\n      \"tags\": {{ post.tags|tojson }},\n      \"date\": {{ post.date|date_format:\"2006-01-02\"|tojson }}\n    }{% if not forloop.Last %},{% endif %}\n    {% endfor %}\n  ]\n}\n```\n\nJavaScript integration with Fuse.js:\n\n```javascript\n// Load search index\nfetch('/search-index/feed.json')\n  .then(r =\u003e r.json())\n  .then(data =\u003e {\n    const fuse = new Fuse(data.index, {\n      keys: ['title', 'content', 'tags', 'description'],\n      threshold: 0.3,\n      includeScore: true\n    });\n\n    // Search function\n    window.search = (query) =\u003e {\n      const results = fuse.search(query);\n      return results.map(r =\u003e ({\n        title: r.item.title,\n        href: r.item.href,\n        score: r.score\n      }));\n    };\n  });\n```\n\n---\n\n## Dynamic Content with Jinja-in-Markdown\n\nThe `jinja_md` plugin enables powerful dynamic content generation directly within your Markdown files.\n\n**Related guide:** [[dynamic-content|Dynamic Content]]\n\n### Embedding Post Lists in Content\n\nCreate dynamic index pages that automatically update:\n\n```markdown\n---\ntitle: \"Documentation\"\njinja: true\n---\n\n# Documentation\n\nWelcome to the docs. Here's everything organized by topic.\n\n## Getting Started\n\n{% for p in core.filter(\"published == True and 'getting-started' in tags\") %}\n- [{{ p.Title }}]({{ p.Href }}) - {{ p.Description|default_if_none:\"\"|truncate:80 }}\n{% endfor %}\n\n## Core Concepts\n\n{% for p in core.filter(\"published == True and 'core-concepts' in tags\") %}\n- [{{ p.Title }}]({{ p.Href }})\n{% endfor %}\n\n## API Reference\n\n{% for p in core.filter(\"published == True and 'api' in tags\") %}\n- [{{ p.Title }}]({{ p.Href }})\n{% endfor %}\n```\n\n### Series Navigation\n\nBuild automatic series navigation that stays in sync:\n\n```markdown\n---\ntitle: \"Building a CLI in Go: Part 2\"\nseries: \"go-cli\"\nseries_order: 2\njinja: true\n---\n\n\u003cnav class=\"series-nav\"\u003e\n\u003cstrong\u003eSeries: Building a CLI in Go\u003c/strong\u003e\n\n{% set series_posts = [] %}\n{% for p in core.filter(\"published == True\") %}\n{% if p.Extra.series == \"go-cli\" %}\n{% set _ = series_posts.append(p) %}\n{% endif %}\n{% endfor %}\n\n\u003col\u003e\n{% for p in series_posts|sort(attribute='Extra.series_order') %}\n{% if p.Extra.series_order == post.Extra.series_order %}\n\u003cli\u003e\u003cstrong\u003e{{ p.Title }}\u003c/strong\u003e (current)\u003c/li\u003e\n{% else %}\n\u003cli\u003e\u003ca href=\"{{ p.Href }}\"\u003e{{ p.Title }}\u003c/a\u003e\u003c/li\u003e\n{% endif %}\n{% endfor %}\n\u003c/ol\u003e\n\n{% set current_order = post.Extra.series_order %}\n\u003cdiv class=\"series-pagination\"\u003e\n{% for p in series_posts %}\n{% if p.Extra.series_order == current_order - 1 %}\n\u003ca href=\"{{ p.Href }}\" class=\"prev\"\u003ePrevious: {{ p.Title }}\u003c/a\u003e\n{% endif %}\n{% if p.Extra.series_order == current_order + 1 %}\n\u003ca href=\"{{ p.Href }}\" class=\"next\"\u003eNext: {{ p.Title }}\u003c/a\u003e\n{% endif %}\n{% endfor %}\n\u003c/div\u003e\n\u003c/nav\u003e\n\n# Building a CLI in Go: Part 2\n\nNow let's add subcommands to our CLI...\n```\n\n### Dynamic Table of Contents\n\nGenerate a table of contents from your content structure:\n\n```markdown\n---\ntitle: \"Complete Go Guide\"\njinja: true\n---\n\n# Complete Go Guide\n\n## Table of Contents\n\n{% set beginner = core.filter(\"published == True and 'go' in tags and difficulty == 'beginner'\") %}\n{% set intermediate = core.filter(\"published == True and 'go' in tags and difficulty == 'intermediate'\") %}\n{% set advanced = core.filter(\"published == True and 'go' in tags and difficulty == 'advanced'\") %}\n\n### Beginner ({{ beginner|length }} articles)\n\n{% for p in beginner %}\n1. [{{ p.Title }}]({{ p.Href }})\n{% endfor %}\n\n### Intermediate ({{ intermediate|length }} articles)\n\n{% for p in intermediate %}\n1. [{{ p.Title }}]({{ p.Href }})\n{% endfor %}\n\n### Advanced ({{ advanced|length }} articles)\n\n{% for p in advanced %}\n1. [{{ p.Title }}]({{ p.Href }})\n{% endfor %}\n```\n\n### Related Posts Widget\n\nShow contextually related posts:\n\n```markdown\n---\ntitle: \"Understanding Go Interfaces\"\ntags: [go, interfaces, tutorial]\njinja: true\n---\n\n# Understanding Go Interfaces\n\n[Your article content...]\n\n---\n\n## Related Articles\n\n{% set related = [] %}\n{% for p in core.filter(\"published == True\") %}\n{% if p.Slug != post.Slug %}\n{% for tag in post.Tags %}\n{% if tag in p.Tags and p not in related %}\n{% set _ = related.append(p) %}\n{% endif %}\n{% endfor %}\n{% endif %}\n{% endfor %}\n\n{% for p in related[:5] %}\n- [{{ p.Title }}]({{ p.Href }})\n{% endfor %}\n```\n\n---\n\n## Advanced Filtering\n\nThe filter expression system supports complex queries for precise content selection.\n\n**Related guides:** [[frontmatter-guide|Frontmatter]], [[feeds-guide|Feeds Guide]]\n\n### Complex Filter Expressions\n\nCombine multiple conditions with logical operators:\n\n```toml\n# Published, non-draft, with specific tag, from current year\nfilter = \"published == True and draft == False and 'tutorial' in tags and date \u003e= '2024-01-01'\"\n\n# Multiple tags (OR logic)\nfilter = \"published == True and ('go' in tags or 'python' in tags or 'rust' in tags)\"\n\n# Exclude specific content\nfilter = \"published == True and slug != 'about' and slug != 'contact'\"\n\n# Complex nested logic\nfilter = \"(published == True and featured == True) or (published == True and 'highlight' in tags)\"\n```\n\n### Date-Based Filtering\n\nUse dynamic date comparisons:\n\n```toml\n# Only past/present posts (no scheduled future posts)\nfilter = \"published == True and date \u003c= today\"\n\n# Posts from the last 30 days\nfilter = \"published == True and date \u003e= today - 30\"\n\n# Posts from a specific year\nfilter = \"published == True and date \u003e= '2024-01-01' and date \u003c '2025-01-01'\"\n\n# Posts from a specific month\nfilter = \"published == True and date \u003e= '2024-06-01' and date \u003c '2024-07-01'\"\n\n# Evergreen content (no date or old date is fine)\nfilter = \"published == True and (date == None or date \u003c= today)\"\n```\n\n### Custom Field Filtering\n\nFilter on any frontmatter field:\n\n```toml\n# By author\nfilter = \"published == True and author == 'Jane Doe'\"\n\n# By category\nfilter = \"published == True and category == 'Backend'\"\n\n# By difficulty level\nfilter = \"published == True and difficulty == 'beginner'\"\n\n# By custom boolean\nfilter = \"published == True and sponsored == False\"\n\n# By series membership\nfilter = \"published == True and series == 'Building a Blog'\"\n\n# By numeric field\nfilter = \"published == True and word_count \u003e= 1000\"\n\n# By reading time\nfilter = \"published == True and reading_time_minutes \u003c= 5\"\n```\n\n### String Method Filters\n\nUse string methods for pattern matching:\n\n```toml\n# Slugs with a prefix\nfilter = \"published == True and slug.startswith('tutorials/')\"\n\n# Slugs with a suffix\nfilter = \"published == True and slug.endswith('-guide')\"\n\n# Title contains keyword\nfilter = \"published == True and title.lower().contains('docker')\"\n\n# Category starts with\nfilter = \"published == True and category.startswith('Web')\"\n```\n\n### Filter Cheat Sheet\n\n| Pattern | Example |\n|---------|---------|\n| Equality | `field == 'value'` |\n| Inequality | `field != 'value'` |\n| Boolean check | `published == True` |\n| Tag membership | `'tag' in tags` |\n| Date comparison | `date \u003e= '2024-01-01'` |\n| Today's date | `date \u003c= today` |\n| Null check | `field == None` |\n| String prefix | `slug.startswith('prefix/')` |\n| String contains | `title.lower().contains('word')` |\n| AND | `cond1 and cond2` |\n| OR | `cond1 or cond2` |\n| NOT | `not condition` |\n| Grouping | `(cond1 or cond2) and cond3` |\n\n---\n\n## Custom Plugin Development\n\nWhen built-in functionality isn't enough, write custom plugins to extend markata-go.\n\n**Related guide:** [[plugin-development|Plugin Development]]\n\n### When to Write a Plugin\n\nConsider a custom plugin when you need to:\n\n- Add computed fields to posts (reading time, word count, etc.)\n- Process content in a custom way (shortcodes, custom syntax)\n- Integrate with external services (APIs, databases)\n- Generate additional output files\n- Implement custom validation rules\n\n### Plugin Architecture Overview\n\nPlugins hook into markata-go's 9-stage lifecycle:\n\n```\nconfigure → validate → glob → load → transform → render → collect → write → cleanup\n```\n\nEach stage has a specific purpose:\n\n| Stage | Purpose | Common Uses |\n|-------|---------|-------------|\n| Configure | Initialize plugin state | Read config, set up clients |\n| Validate | Validate configuration | Check required fields |\n| Glob | Discover files | Custom file patterns |\n| Load | Parse files to posts | Custom parsers |\n| Transform | Pre-render processing | Computed fields, shortcodes |\n| Render | Convert to HTML | Markdown extensions |\n| Collect | Build aggregations | Custom feeds, indexes |\n| Write | Write output | Custom file generation |\n| Cleanup | Release resources | Close connections |\n\n### Example: Custom Shortcode Plugin\n\nHere's a complete plugin that adds shortcode support (e.g., `{{\u003c youtube id=\"...\" \u003e}}`):\n\n```go\npackage plugins\n\nimport (\n    \"fmt\"\n    \"regexp\"\n    \"strings\"\n\n    \"github.com/example/markata-go/pkg/lifecycle\"\n    \"github.com/example/markata-go/pkg/models\"\n)\n\n// ShortcodePlugin processes shortcodes in markdown content.\ntype ShortcodePlugin struct {\n    shortcodes map[string]ShortcodeFunc\n}\n\n// ShortcodeFunc is a function that processes a shortcode.\ntype ShortcodeFunc func(params map[string]string) string\n\n// NewShortcodePlugin creates a new ShortcodePlugin with built-in shortcodes.\nfunc NewShortcodePlugin() *ShortcodePlugin {\n    p := \u0026ShortcodePlugin{\n        shortcodes: make(map[string]ShortcodeFunc),\n    }\n\n    // Register built-in shortcodes\n    p.Register(\"youtube\", youtubeShortcode)\n    p.Register(\"gist\", gistShortcode)\n    p.Register(\"tweet\", tweetShortcode)\n    p.Register(\"figure\", figureShortcode)\n\n    return p\n}\n\n// Name returns the plugin name.\nfunc (p *ShortcodePlugin) Name() string {\n    return \"shortcodes\"\n}\n\n// Register adds a custom shortcode.\nfunc (p *ShortcodePlugin) Register(name string, fn ShortcodeFunc) {\n    p.shortcodes[name] = fn\n}\n\n// Transform processes shortcodes in all posts.\nfunc (p *ShortcodePlugin) Transform(m *lifecycle.Manager) error {\n    return m.ProcessPostsConcurrently(func(post *models.Post) error {\n        if post.Skip || post.Content == \"\" {\n            return nil\n        }\n        post.Content = p.processShortcodes(post.Content)\n        return nil\n    })\n}\n\n// Shortcode pattern: {{\u003c name param=\"value\" \u003e}}\nvar shortcodePattern = regexp.MustCompile(`\\{\\{\u003c\\s*(\\w+)\\s*([^\u003e]*)\\s*\u003e\\}\\}`)\n\n// Param pattern: key=\"value\" or key='value'\nvar paramPattern = regexp.MustCompile(`(\\w+)=[\"']([^\"']*)[\"']`)\n\nfunc (p *ShortcodePlugin) processShortcodes(content string) string {\n    return shortcodePattern.ReplaceAllStringFunc(content, func(match string) string {\n        submatches := shortcodePattern.FindStringSubmatch(match)\n        if len(submatches) \u003c 2 {\n            return match\n        }\n\n        name := submatches[1]\n        paramsStr := \"\"\n        if len(submatches) \u003e= 3 {\n            paramsStr = submatches[2]\n        }\n\n        // Parse parameters\n        params := make(map[string]string)\n        paramMatches := paramPattern.FindAllStringSubmatch(paramsStr, -1)\n        for _, pm := range paramMatches {\n            if len(pm) \u003e= 3 {\n                params[pm[1]] = pm[2]\n            }\n        }\n\n        // Execute shortcode\n        if fn, ok := p.shortcodes[name]; ok {\n            return fn(params)\n        }\n\n        return match // Unknown shortcode, leave as-is\n    })\n}\n\n// Built-in shortcodes\n\nfunc youtubeShortcode(params map[string]string) string {\n    id := params[\"id\"]\n    if id == \"\" {\n        return \"\u003c!-- youtube: missing id --\u003e\"\n    }\n    return fmt.Sprintf(`\u003cdiv class=\"video-container\"\u003e\n\u003ciframe src=\"https://www.youtube.com/embed/%s\"\n        frameborder=\"0\"\n        allowfullscreen\n        loading=\"lazy\"\u003e\u003c/iframe\u003e\n\u003c/div\u003e`, id)\n}\n\nfunc gistShortcode(params map[string]string) string {\n    user := params[\"user\"]\n    id := params[\"id\"]\n    if user == \"\" || id == \"\" {\n        return \"\u003c!-- gist: missing user or id --\u003e\"\n    }\n    return fmt.Sprintf(`\u003cscript src=\"https://gist.github.com/%s/%s.js\"\u003e\u003c/script\u003e`, user, id)\n}\n\nfunc tweetShortcode(params map[string]string) string {\n    id := params[\"id\"]\n    if id == \"\" {\n        return \"\u003c!-- tweet: missing id --\u003e\"\n    }\n    return fmt.Sprintf(`\u003cblockquote class=\"twitter-tweet\" data-dnt=\"true\"\u003e\n\u003ca href=\"https://twitter.com/x/status/%s\"\u003e\u003c/a\u003e\n\u003c/blockquote\u003e\n\u003cscript async src=\"https://platform.twitter.com/widgets.js\"\u003e\u003c/script\u003e`, id)\n}\n\nfunc figureShortcode(params map[string]string) string {\n    src := params[\"src\"]\n    alt := params[\"alt\"]\n    caption := params[\"caption\"]\n\n    if src == \"\" {\n        return \"\u003c!-- figure: missing src --\u003e\"\n    }\n\n    html := fmt.Sprintf(`\u003cfigure\u003e\n\u003cimg src=\"%s\" alt=\"%s\" loading=\"lazy\"\u003e`, src, alt)\n\n    if caption != \"\" {\n        html += fmt.Sprintf(`\n\u003cfigcaption\u003e%s\u003c/figcaption\u003e`, caption)\n    }\n\n    html += `\n\u003c/figure\u003e`\n\n    return html\n}\n\n// Interface verification\nvar (\n    _ lifecycle.Plugin          = (*ShortcodePlugin)(nil)\n    _ lifecycle.TransformPlugin = (*ShortcodePlugin)(nil)\n)\n```\n\n**Usage in markdown:**\n\n```markdown\n---\ntitle: \"Video Tutorial\"\n---\n\n# Getting Started with Go\n\nWatch the video tutorial:\n\n{{\u003c youtube id=\"YS4e4q9oBaU\" \u003e}}\n\nCheck out this code snippet:\n\n{{\u003c gist user=\"example\" id=\"abc123\" \u003e}}\n\n{{\u003c figure src=\"/images/diagram.png\" alt=\"Architecture\" caption=\"System architecture diagram\" \u003e}}\n```\n\n---\n\n## Performance Optimization\n\nOptimize markata-go for large sites with thousands of posts.\n\n### Concurrent Processing\n\nmarkata-go processes posts concurrently by default. Control concurrency via configuration:\n\n```toml\n[markata-go]\nconcurrency = 0    # 0 = auto-detect (uses all CPU cores)\n# concurrency = 4  # Limit to 4 workers\n# concurrency = 1  # Sequential processing (for debugging)\n```\n\nFor custom plugins, use the built-in concurrent processor:\n\n```go\nfunc (p *MyPlugin) Transform(m *lifecycle.Manager) error {\n    return m.ProcessPostsConcurrently(func(post *models.Post) error {\n        // This runs in parallel across posts\n        return p.processPost(post)\n    })\n}\n```\n\n### Incremental Builds\n\nFor faster development, markata-go can skip unchanged files:\n\n```bash\n# Standard build (processes all files)\nmarkata-go build\n\n# Serve with watch mode (enabled by default)\nmarkata-go serve\n\n# Serve without file watching\nmarkata-go serve --no-watch\n```\n\nBy default, the dev server rebuilds deterministically on every change while still using build cache to skip expensive per-post work. For the fastest loop, use:\n\n```bash\nmarkata-go serve --fast\n```\n\nFast mode rebuilds only the changed posts plus any dependents discovered from the dependency graph, and disables blogroll/mentions to keep the loop tight. Feed collection also skips when no changed posts touch a feed. If a change alters dependencies (links, embeds), the server performs a second pass to update the affected posts.\n\n### Caching Strategies\n\nFor expensive operations, implement caching in your plugins:\n\n```go\nfunc (p *MyPlugin) Transform(m *lifecycle.Manager) error {\n    cache := m.Cache()\n\n    for _, post := range m.Posts() {\n        // Generate cache key from content hash\n        key := fmt.Sprintf(\"processed:%s\", post.ContentHash())\n\n        // Check cache\n        if cached, ok := cache.Get(key); ok {\n            post.Set(\"processed_data\", cached)\n            continue\n        }\n\n        // Expensive operation\n        result := p.expensiveOperation(post)\n\n        // Store in cache\n        cache.Set(key, result)\n        post.Set(\"processed_data\", result)\n    }\n\n    return nil\n}\n```\n\n### Large Site Considerations\n\nFor sites with 1000+ posts:\n\n1. **Limit feed items:**\n   ```toml\n   [markata-go.feeds.syndication]\n   max_items = 50    # Don't include all posts in RSS/Atom\n   ```\n\n2. **Use pagination:**\n   ```toml\n   [[markata-go.feeds]]\n   items_per_page = 20    # Reasonable page size\n   orphan_threshold = 5\n   ```\n\n3. **Minimize Jinja-in-Markdown:**\n   - Pre-compute expensive queries\n   - Cache dynamic content\n   - Use feeds instead of inline queries\n\n4. **Optimize glob patterns:**\n   ```toml\n   [markata-go.glob]\n   patterns = [\"posts/**/*.md\"]    # Specific patterns\n   use_gitignore = true            # Skip ignored files\n   ```\n\n5. **Profile builds:**\n   ```bash\n   markata-go build -v --profile\n   ```\n\n### Build Time Benchmarks\n\n| Posts | Cold Build | Incremental | With Watch |\n|-------|------------|-------------|------------|\n| 100 | ~1s | ~0.2s | ~50ms |\n| 1,000 | ~5s | ~0.5s | ~100ms |\n| 10,000 | ~30s | ~2s | ~200ms |\n\n*Times vary based on content complexity, plugins, and hardware.*\n\n---\n\n## Multi-Environment Builds\n\nConfigure markata-go for different deployment environments.\n\n**Related guides:** [[configuration-guide|Configuration]], [[deployment-guide|Deployment]]\n\n### Staging vs Production\n\nUse environment variables to customize builds:\n\n```bash\n# Production build\nMARKATA_GO_URL=https://example.com markata-go build --clean\n\n# Staging build\nMARKATA_GO_URL=https://staging.example.com markata-go build --clean\n\n# Preview build (e.g., for PR previews)\nMARKATA_GO_URL=https://preview-123.example.com markata-go build\n```\n\n### Environment Variables Reference\n\nAll configuration can be overridden via environment variables:\n\n```bash\n# Core settings\nexport MARKATA_GO_URL=https://example.com\nexport MARKATA_GO_TITLE=\"My Site\"\nexport MARKATA_GO_OUTPUT_DIR=dist\nexport MARKATA_GO_CONCURRENCY=4\n\n# Feature flags\nexport MARKATA_GO_DRAFT_MODE=true           # Include drafts\nexport MARKATA_GO_FUTURE_POSTS=true         # Include scheduled posts\n\n# Feed settings\nexport MARKATA_GO_FEED_DEFAULTS_ITEMS_PER_PAGE=20\n```\n\n### CI/CD Integration\n\n#### GitHub Actions\n\n```yaml\nname: Deploy\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Setup Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: '1.22'\n          cache: true\n\n      - name: Install markata-go\n        run: go install github.com/example/markata-go/cmd/markata-go@latest\n\n      - name: Build (Production)\n        if: github.ref == 'refs/heads/main'\n        run: markata-go build --clean\n        env:\n          MARKATA_GO_URL: https://example.com\n\n      - name: Build (Preview)\n        if: github.event_name == 'pull_request'\n        run: markata-go build --clean\n        env:\n          MARKATA_GO_URL: https://preview-${{ github.event.number }}.example.com\n\n      - name: Deploy\n        if: github.ref == 'refs/heads/main'\n        uses: actions/deploy-pages@v4\n```\n\n#### Netlify\n\n```toml\n# netlify.toml\n[build]\n  command = \"go install github.com/example/markata-go/cmd/markata-go@latest \u0026\u0026 markata-go build --clean\"\n  publish = \"public\"\n\n[context.production]\n  environment = { MARKATA_GO_URL = \"https://example.com\" }\n\n[context.deploy-preview]\n  environment = { MARKATA_GO_URL = \"\" }  # Uses deploy preview URL\n```\n\n#### Docker\n\n```dockerfile\n# Build stage\nFROM golang:1.22-alpine AS builder\nWORKDIR /build\n\nARG MARKATA_GO_URL=https://example.com\nENV MARKATA_GO_URL=$MARKATA_GO_URL\n\nRUN go install github.com/example/markata-go/cmd/markata-go@latest\nCOPY . .\nRUN markata-go build --clean\n\n# Production stage\nFROM nginx:alpine\nCOPY --from=builder /build/public /usr/share/nginx/html\n```\n\nBuild for different environments:\n\n```bash\n# Production\ndocker build --build-arg MARKATA_GO_URL=https://example.com -t site:prod .\n\n# Staging\ndocker build --build-arg MARKATA_GO_URL=https://staging.example.com -t site:staging .\n```\n\n---\n\n## Advanced Templates\n\nMaster template inheritance, conditionals, and reusable components.\n\n**Related guide:** [[templates-guide|Templates Guide]]\n\n### Template Inheritance Patterns\n\nCreate a flexible base template with multiple extension points:\n\n```html\n{# templates/base.html #}\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"en\"\u003e\n\u003chead\u003e\n    \u003cmeta charset=\"UTF-8\"\u003e\n    \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u003e\n\n    {# SEO block - can be fully overridden #}\n    {% block seo %}\n    \u003ctitle\u003e{% block title %}{{ config.Title }}{% endblock %}\u003c/title\u003e\n    \u003cmeta name=\"description\" content=\"{% block description %}{{ config.Description }}{% endblock %}\"\u003e\n    {% endblock %}\n\n    {# Open Graph - extendable #}\n    {% block opengraph %}\n    \u003cmeta property=\"og:title\" content=\"{% block og_title %}{{ config.Title }}{% endblock %}\"\u003e\n    \u003cmeta property=\"og:type\" content=\"{% block og_type %}website{% endblock %}\"\u003e\n    \u003cmeta property=\"og:url\" content=\"{{ config.URL }}{% block og_url %}/{% endblock %}\"\u003e\n    {% endblock %}\n\n    {# Styles - extendable #}\n    {% block styles %}\n    \u003clink rel=\"stylesheet\" href=\"/css/main.css\"\u003e\n    {% endblock %}\n\n    {# Extra head content #}\n    {% block head %}{% endblock %}\n\u003c/head\u003e\n\u003cbody class=\"{% block body_class %}{% endblock %}\"\u003e\n    {% block skip_link %}\n    \u003ca href=\"#main\" class=\"skip-link\"\u003eSkip to content\u003c/a\u003e\n    {% endblock %}\n\n    {% block header %}\n    {% include \"partials/header.html\" %}\n    {% endblock %}\n\n    {% block main %}\n    \u003cmain id=\"main\"\u003e\n        {% block content %}{% endblock %}\n    \u003c/main\u003e\n    {% endblock %}\n\n    {% block footer %}\n    {% include \"partials/footer.html\" %}\n    {% endblock %}\n\n    {% block scripts %}\n    \u003cscript src=\"/js/main.js\"\u003e\u003c/script\u003e\n    {% endblock %}\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n### Conditional Layouts\n\nUse different layouts based on post metadata:\n\n```html\n{# templates/post.html #}\n{% extends \"base.html\" %}\n\n{% block body_class %}\npost\n{% if post.Extra.featured %}featured{% endif %}\n{% if post.Extra.wide %}wide-layout{% endif %}\n{% endblock %}\n\n{% block content %}\n\u003carticle class=\"{% if post.Extra.layout %}{{ post.Extra.layout }}{% else %}standard{% endif %}\"\u003e\n\n    {# Hero section for featured posts #}\n    {% if post.Extra.hero_image %}\n    \u003cdiv class=\"hero\" style=\"background-image: url('{{ post.Extra.hero_image }}')\"\u003e\n        \u003ch1\u003e{{ post.Title }}\u003c/h1\u003e\n    \u003c/div\u003e\n    {% else %}\n    \u003cheader\u003e\n        \u003ch1\u003e{{ post.Title }}\u003c/h1\u003e\n    \u003c/header\u003e\n    {% endif %}\n\n    {# Sidebar for posts with TOC #}\n    {% if post.Extra.toc %}\n    \u003cdiv class=\"with-sidebar\"\u003e\n        \u003caside class=\"toc\"\u003e\n            {{ post.Extra.toc_html|safe }}\n        \u003c/aside\u003e\n        \u003cdiv class=\"content\"\u003e\n            {{ body|safe }}\n        \u003c/div\u003e\n    \u003c/div\u003e\n    {% else %}\n    \u003cdiv class=\"content\"\u003e\n        {{ body|safe }}\n    \u003c/div\u003e\n    {% endif %}\n\n    {# Series navigation #}\n    {% if post.Extra.series %}\n    {% include \"partials/series-nav.html\" %}\n    {% endif %}\n\n\u003c/article\u003e\n{% endblock %}\n```\n\n### Reusable Components\n\nCreate composable partial templates:\n\n```html\n{# templates/partials/card.html #}\n{#\n  Expects: post object\n  Optional: show_image, show_tags, show_excerpt\n#}\n\u003carticle class=\"card {% if post.Extra.featured %}card--featured{% endif %}\"\u003e\n    {% if show_image|default_if_none:true and post.Extra.cover_image %}\n    \u003ca href=\"{{ post.Href }}\" class=\"card__image\"\u003e\n        \u003cimg src=\"{{ post.Extra.cover_image }}\"\n             alt=\"{{ post.Title }}\"\n             loading=\"lazy\"\u003e\n    \u003c/a\u003e\n    {% endif %}\n\n    \u003cdiv class=\"card__body\"\u003e\n        \u003ch3 class=\"card__title\"\u003e\n            \u003ca href=\"{{ post.Href }}\"\u003e{{ post.Title }}\u003c/a\u003e\n        \u003c/h3\u003e\n\n        {% if show_excerpt|default_if_none:true and post.Description %}\n        \u003cp class=\"card__excerpt\"\u003e{{ post.Description|truncate:120 }}\u003c/p\u003e\n        {% endif %}\n\n        \u003cfooter class=\"card__meta\"\u003e\n            {% if post.Date %}\n            \u003ctime datetime=\"{{ post.Date|atom_date }}\"\u003e\n                {{ post.Date|date_format:\"Jan 2, 2006\" }}\n            \u003c/time\u003e\n            {% endif %}\n\n            {% if post.Extra.reading_time %}\n            \u003cspan class=\"reading-time\"\u003e{{ post.Extra.reading_time }}\u003c/span\u003e\n            {% endif %}\n        \u003c/footer\u003e\n\n        {% if show_tags|default_if_none:false and post.Tags %}\n        \u003cul class=\"card__tags\"\u003e\n            {% for tag in post.Tags|slice:\":3\" %}\n            \u003cli\u003e\u003ca href=\"/tags/{{ tag|slugify }}/\"\u003e{{ tag }}\u003c/a\u003e\u003c/li\u003e\n            {% endfor %}\n        \u003c/ul\u003e\n        {% endif %}\n    \u003c/div\u003e\n\u003c/article\u003e\n```\n\nUse the component with different configurations:\n\n```html\n{# Full card with image and tags #}\n{% with show_image=true, show_tags=true %}\n{% include \"partials/card.html\" %}\n{% endwith %}\n\n{# Minimal card without image #}\n{% with show_image=false %}\n{% include \"partials/card.html\" %}\n{% endwith %}\n\n{# Text-only card #}\n{% with show_image=false, show_excerpt=false %}\n{% include \"partials/card.html\" %}\n{% endwith %}\n```\n\n---\n\n## Wikilinks and Internal Linking\n\nUse `[[wikilink]]` syntax for easy cross-referencing between posts.\n\n### Basic Wikilink Syntax\n\nLink to other posts using their slug:\n\n```markdown\n---\ntitle: \"Go Interfaces\"\n---\n\n# Understanding Go Interfaces\n\nInterfaces in Go are implicit. See [[go-structs]] for how structs work.\n\nFor more on type systems, check out [[go-type-system|the type system guide]].\n\nRelated: [[go-generics]], [[go-methods]]\n```\n\n**Syntax variants:**\n\n| Syntax | Output |\n|--------|--------|\n| `[[slug]]` | Link with auto-title |\n| `[[slug|Custom Text]]` | Link with custom text |\n| `[[slug#section]]` | Link to specific section |\n| `[[slug#section|Text]]` | Section link with text |\n\n### Cross-Referencing Posts\n\nCreate bidirectional links for a wiki-like experience:\n\n```markdown\n---\ntitle: \"Go Structs\"\nslug: \"go-structs\"\n---\n\n# Go Structs\n\nStructs are the primary way to create custom types in Go.\n\nSee also:\n- [[go-interfaces]] - How interfaces work with structs\n- [[go-methods]] - Adding methods to structs\n- [[go-embedding]] - Struct embedding patterns\n```\n\n### Broken Link Detection\n\nmarkata-go validates wikilinks during build and warns about broken links:\n\n```\n$ markata-go build\nWarning: Broken wikilink in posts/go-structs.md: [[go-embedding]] (post not found)\nWarning: Broken wikilink in posts/intro.md: [[getting-started#setup]] (section not found)\n```\n\nEnable strict mode to fail builds on broken links:\n\n```toml\n[markata-go]\nstrict_wikilinks = true    # Fail build on broken links\n```\n\n### Backlinks\n\nThe link collector provides backlinks (posts that link to the current post):\n\n```html\n{# In post.html template #}\n{% if post.inlinks %}\n\u003caside class=\"backlinks\"\u003e\n    \u003ch3\u003eLinked from\u003c/h3\u003e\n    \u003cul\u003e\n    {% for link in post.inlinks %}\n        \u003cli\u003e\u003ca href=\"{{ link.source_post.href }}\"\u003e{{ link.source_post.title }}\u003c/a\u003e\u003c/li\u003e\n    {% endfor %}\n    \u003c/ul\u003e\n\u003c/aside\u003e\n{% endif %}\n```\n\n---\n\n## Table of Contents Generation\n\nAutomatically generate navigation for long-form content.\n\n### Enable TOC Generation\n\nAdd `toc: true` to your frontmatter:\n\n```yaml\n---\ntitle: \"Complete Go Guide\"\ntoc: true\ntoc_depth: 3       # Include h1, h2, h3 (default: 2)\ntoc_min_items: 3   # Only show TOC if 3+ headings (default: 2)\n---\n\n# Introduction\n\n## Getting Started\n\n### Installation\n\n### Configuration\n\n## Core Concepts\n\n### Variables\n\n### Functions\n\n## Advanced Topics\n```\n\n### TOC Output\n\nThe TOC is available as `post.Extra.toc_html`:\n\n```html\n\u003cnav class=\"toc\"\u003e\n    \u003ch2\u003eContents\u003c/h2\u003e\n    \u003col\u003e\n        \u003cli\u003e\u003ca href=\"#introduction\"\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\n            \u003ca href=\"#getting-started\"\u003eGetting Started\u003c/a\u003e\n            \u003col\u003e\n                \u003cli\u003e\u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e\u003c/li\u003e\n                \u003cli\u003e\u003ca href=\"#configuration\"\u003eConfiguration\u003c/a\u003e\u003c/li\u003e\n            \u003c/ol\u003e\n        \u003c/li\u003e\n        \u003cli\u003e\n            \u003ca href=\"#core-concepts\"\u003eCore Concepts\u003c/a\u003e\n            \u003col\u003e\n                \u003cli\u003e\u003ca href=\"#variables\"\u003eVariables\u003c/a\u003e\u003c/li\u003e\n                \u003cli\u003e\u003ca href=\"#functions\"\u003eFunctions\u003c/a\u003e\u003c/li\u003e\n            \u003c/ol\u003e\n        \u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#advanced-topics\"\u003eAdvanced Topics\u003c/a\u003e\u003c/li\u003e\n    \u003c/ol\u003e\n\u003c/nav\u003e\n```\n\n### Template Integration\n\nInclude the TOC in your post template:\n\n```html\n{% block content %}\n\u003carticle class=\"post\"\u003e\n    \u003cheader\u003e\n        \u003ch1\u003e{{ post.Title }}\u003c/h1\u003e\n    \u003c/header\u003e\n\n    {% if post.Extra.toc_html %}\n    \u003caside class=\"toc-sidebar\"\u003e\n        {{ post.Extra.toc_html|safe }}\n    \u003c/aside\u003e\n    {% endif %}\n\n    \u003cdiv class=\"post-content\"\u003e\n        {{ body|safe }}\n    \u003c/div\u003e\n\u003c/article\u003e\n{% endblock %}\n```\n\n### Styling the TOC\n\n```css\n.toc {\n    position: sticky;\n    top: 2rem;\n    max-height: calc(100vh - 4rem);\n    overflow-y: auto;\n    padding: 1rem;\n    background: var(--bg-secondary);\n    border-radius: 8px;\n}\n\n.toc ol {\n    list-style: none;\n    padding-left: 0;\n}\n\n.toc ol ol {\n    padding-left: 1rem;\n    margin-top: 0.5rem;\n}\n\n.toc a {\n    display: block;\n    padding: 0.25rem 0;\n    color: var(--text-secondary);\n    text-decoration: none;\n}\n\n.toc a:hover,\n.toc a.active {\n    color: var(--text-primary);\n}\n\n/* Highlight current section with JavaScript */\n.toc a.active {\n    font-weight: 600;\n    color: var(--accent);\n}\n```\n\n---\n\n## Admonitions and Callouts\n\nCreate visually distinct callout blocks for notes, warnings, tips, and more.\n\n### Admonition Syntax\n\nUse fenced blocks with type indicators:\n\n```markdown\n:::note\nThis is a note. Use it for additional information.\n:::\n\n:::tip\nPro tip! This helps users work more efficiently.\n:::\n\n:::warning\nBe careful! This action has consequences.\n:::\n\n:::danger\nCritical warning! This could cause data loss.\n:::\n\n:::info\nInformational callout for context.\n:::\n```\n\n### Admonition with Custom Title\n\n```markdown\n:::note Custom Title\nThis note has a custom title instead of \"Note\".\n:::\n\n:::warning Before You Continue\nMake sure you've completed the prerequisites.\n:::\n```\n\n### Rendered Output\n\nAdmonitions render as styled HTML:\n\n```html\n\u003cdiv class=\"admonition admonition-note\"\u003e\n    \u003cdiv class=\"admonition-title\"\u003eNote\u003c/div\u003e\n    \u003cdiv class=\"admonition-content\"\u003e\n        \u003cp\u003eThis is a note. Use it for additional information.\u003c/p\u003e\n    \u003c/div\u003e\n\u003c/div\u003e\n```\n\n### Available Types\n\n| Type | Icon | Use Case |\n|------|------|----------|\n| `note` | Info icon | Additional context |\n| `tip` | Lightbulb | Helpful suggestions |\n| `info` | Info circle | Background information |\n| `warning` | Warning triangle | Potential issues |\n| `danger` | X circle | Critical warnings |\n| `success` | Checkmark | Confirmations |\n| `example` | Code icon | Code examples |\n| `quote` | Quote icon | Quotations |\n| `abstract` | Document | Summaries |\n\n### Custom Admonition Types\n\nDefine custom types in your configuration:\n\n```toml\n[markata-go.admonitions]\n# Define a custom \"exercise\" type\n[markata-go.admonitions.exercise]\nicon = \"pencil\"\ncolor = \"#6366f1\"    # Indigo\n```\n\nUse in markdown:\n\n```markdown\n:::exercise Practice Problem\nWrite a function that reverses a string.\n:::\n```\n\n### Styling Admonitions\n\n```css\n.admonition {\n    margin: 1.5rem 0;\n    padding: 1rem;\n    border-left: 4px solid;\n    border-radius: 4px;\n    background: var(--bg-secondary);\n}\n\n.admonition-title {\n    font-weight: 600;\n    margin-bottom: 0.5rem;\n    display: flex;\n    align-items: center;\n    gap: 0.5rem;\n}\n\n.admonition-note { border-color: #3b82f6; }\n.admonition-tip { border-color: #22c55e; }\n.admonition-warning { border-color: #f59e0b; }\n.admonition-danger { border-color: #ef4444; }\n.admonition-info { border-color: #06b6d4; }\n\n.admonition-note .admonition-title { color: #3b82f6; }\n.admonition-tip .admonition-title { color: #22c55e; }\n.admonition-warning .admonition-title { color: #f59e0b; }\n.admonition-danger .admonition-title { color: #ef4444; }\n.admonition-info .admonition-title { color: #06b6d4; }\n```\n\n### Collapsible Admonitions\n\nMake admonitions collapsible with the `collapse` modifier:\n\n```markdown\n:::tip collapse Expand for Pro Tips\nThese tips are hidden by default to keep the content focused.\n\n- Tip 1: Use keyboard shortcuts\n- Tip 2: Enable caching\n- Tip 3: Run in parallel\n:::\n```\n\nRenders as:\n\n```html\n\u003cdetails class=\"admonition admonition-tip\"\u003e\n    \u003csummary class=\"admonition-title\"\u003eExpand for Pro Tips\u003c/summary\u003e\n    \u003cdiv class=\"admonition-content\"\u003e\n        \u003cp\u003eThese tips are hidden by default...\u003c/p\u003e\n    \u003c/div\u003e\n\u003c/details\u003e\n```\n\n---\n\n## See Also\n\n- [[feeds-guide|Feeds Guide]] - Complete feed system documentation\n- [[templates-guide|Templates Guide]] - Template system reference\n- [[configuration-guide|Configuration Guide]] - Full configuration options\n- [[plugin-development|Plugin Development]] - Create custom plugins\n- [[dynamic-content|Dynamic Content]] - Jinja-in-Markdown guide\n- [[deployment-guide|Deployment]] - Deployment and CI/CD\n- [[frontmatter-guide|Frontmatter]] - Frontmatter field reference\n- [[syndication-feeds|Syndication Feeds]] - RSS, Atom, JSON feeds\n",
      "summary": "Power user guide covering complex configurations, optimization techniques, and advanced patterns",
      "date_published": "2024-01-15T00:00:00Z",
      "date_modified": "2024-01-15T00:00:00Z",
      "tags": [
        "documentation",
        "advanced"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/post-css-loading/",
      "url": "https://markata.dev/docs/guides/post-css-loading/",
      "title": "Progressive article styles",
      "content_html": "\u003cp\u003eMarkata-go avoids loading the feed-card stylesheet on an ordinary \u003ccode\u003epost.html\u003c/code\u003e\nreading page when its article has no embedded feed or card markup.\nFeed archives and posts embedding cards keep their styles, as do custom\ntemplates. No content is hidden and the article text remains server-rendered.\u003c/p\u003e\n\u003cp\u003eThis is an initial optimization, not a fully generated per-page critical CSS\nsystem. If a custom post relies on card styling without markup the generator\ncan recognize, use a custom template and the regular stylesheet stack.\u003c/p\u003e\n\u003cp\u003eAfter a shared template change, run \u003ccode\u003emarkata-go build --clean\u003c/code\u003e and inspect\nthe generated post \u003ccode\u003e\u0026lt;head\u0026gt;\u003c/code\u003e. Compare a representative text post, card-heavy\narticle, feed archive, and navigation between page types in real browsers.\u003c/p\u003e\n",
      "content_text": "\n\nMarkata-go avoids loading the feed-card stylesheet on an ordinary `post.html`\nreading page when its article has no embedded feed or card markup.\nFeed archives and posts embedding cards keep their styles, as do custom\ntemplates. No content is hidden and the article text remains server-rendered.\n\nThis is an initial optimization, not a fully generated per-page critical CSS\nsystem. If a custom post relies on card styling without markup the generator\ncan recognize, use a custom template and the regular stylesheet stack.\n\nAfter a shared template change, run `markata-go build --clean` and inspect\nthe generated post `\u003chead\u003e`. Compare a representative text post, card-heavy\narticle, feed archive, and navigation between page types in real browsers.\n",
      "summary": "Skip unnecessary feed-card CSS on ordinary reading posts.",
      "date_modified": "1970-01-01T00:00:00Z",
      "tags": [
        "performance",
        "css",
        "posts"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/page-weight/",
      "url": "https://markata.dev/docs/guides/page-weight/",
      "title": "Find heavy posts during builds",
      "content_html": "\u003cp\u003eRun a normal build:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --clean\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAfter a successful build, markata-go reports unusually large HTML and writes\n\u003ccode\u003eoutput/.markata/page-weight.json\u003c/code\u003e (or under your configured \u003ccode\u003eoutput_dir\u003c/code\u003e).\nThe report is intended for agents, scripts and humans. It sorts the heaviest\npages first and includes each page\u0026rsquo;s path, byte breakdown, stable warning codes,\nbudgets, and suggested improvements.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Disable diagnostics for a build.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --page-weight\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Warn on posts larger than 96 KiB of uncompressed HTML source.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go build --page-weight-html-kb\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e96\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe default post warning is 160 KiB of uncompressed HTML; other page types get\n320 KiB. Embedded JSON over 32 KiB, inline JS over 24 KiB, and sidebar JSON\nover 16 KiB each produce additional warnings.\u003c/p\u003e\n\u003ch2 id=\"working-through-a-warning\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWorking through a warning\u003c/span\u003e \u003ca href=\"#working-through-a-warning\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGive your coding agent the affected \u003ccode\u003epath\u003c/code\u003e, \u003ccode\u003efindings[].code\u003c/code\u003e,\n\u003ccode\u003efindings[].bytes\u003c/code\u003e, and \u003ccode\u003efindings[].advice\u003c/code\u003e from the JSON. Compare clean\nbuilds before and after changing templates; do not hide warnings by trimming\nuseful article or sidebar content. Prefer loading supplementary features on\ninteraction, using static files for shared logic, and removing duplicated data\nfrom HTML.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eImportant:\u003c/strong\u003e These are source-size checks, not measured compressed transfer\nor Lighthouse metrics. Validate consequential optimizations with cold-browser\nLighthouse and browser network traces before claiming a performance win.\nThe report is local and does not upload visitor or site data.\u003c/p\u003e\n",
      "content_text": "\n\nRun a normal build:\n\n```sh\nmarkata-go build --clean\n```\n\nAfter a successful build, markata-go reports unusually large HTML and writes\n`output/.markata/page-weight.json` (or under your configured `output_dir`).\nThe report is intended for agents, scripts and humans. It sorts the heaviest\npages first and includes each page's path, byte breakdown, stable warning codes,\nbudgets, and suggested improvements.\n\n```sh\n# Disable diagnostics for a build.\nmarkata-go build --page-weight=false\n\n# Warn on posts larger than 96 KiB of uncompressed HTML source.\nmarkata-go build --page-weight-html-kb=96\n```\n\nThe default post warning is 160 KiB of uncompressed HTML; other page types get\n320 KiB. Embedded JSON over 32 KiB, inline JS over 24 KiB, and sidebar JSON\nover 16 KiB each produce additional warnings.\n\n## Working through a warning\n\nGive your coding agent the affected `path`, `findings[].code`,\n`findings[].bytes`, and `findings[].advice` from the JSON. Compare clean\nbuilds before and after changing templates; do not hide warnings by trimming\nuseful article or sidebar content. Prefer loading supplementary features on\ninteraction, using static files for shared logic, and removing duplicated data\nfrom HTML.\n\n**Important:** These are source-size checks, not measured compressed transfer\nor Lighthouse metrics. Validate consequential optimizations with cold-browser\nLighthouse and browser network traces before claiming a performance win.\nThe report is local and does not upload visitor or site data.\n",
      "summary": "Use markata-go page-weight warnings and JSON reports to prioritize post performance work.",
      "date_modified": "1970-01-01T00:00:00Z",
      "tags": [
        "performance",
        "build"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/native-navigation/",
      "url": "https://markata.dev/docs/guides/native-navigation/",
      "title": "Try native post navigation",
      "content_html": "\u003ch2 id=\"try-browser-native-navigation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTry browser-native navigation\u003c/span\u003e \u003ca href=\"#try-browser-native-navigation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor a staging or local site, add:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eview_transitions\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003enative\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRun a \u003cstrong\u003eclean build\u003c/strong\u003e. This replaces markata-go\u0026rsquo;s JavaScript SPA interception\nand DOM swapping with ordinary links plus native cross-document view\ntransitions on browsers that support them. Older browsers keep regular links.\u003c/p\u003e\n\u003cp\u003eIn native mode the generated page can prefetch post/sidebar navigation\ntargets at conservative click intent using the Speculation Rules API.\nThis is deliberately \u003cstrong\u003enot prerendering\u003c/strong\u003e and does not fetch arbitrary\ncontent at startup. Visitors who prefer reduced motion receive no\nview-transition animation.\u003c/p\u003e\n\u003cp\u003eTo return to established behavior, set \u003ccode\u003enative = false\u003c/code\u003e or omit it.\u003c/p\u003e\n\u003cp\u003eThe default remains the existing navigation system while comparing\nfull-document first paint, return navigation, LCP, CLS, theme controls,\nscroll positions, focus, and keyboard behaviors on multiple browsers.\nBrowsers lacking either feature must still navigate normally. This option\nis experimental and does not guarantee better Lighthouse scores.\u003c/p\u003e\n",
      "content_text": "\n## Try browser-native navigation\n\nFor a staging or local site, add:\n\n```toml\n[markata-go.view_transitions]\nenabled = true\nnative = true\n```\n\nRun a **clean build**. This replaces markata-go's JavaScript SPA interception\nand DOM swapping with ordinary links plus native cross-document view\ntransitions on browsers that support them. Older browsers keep regular links.\n\nIn native mode the generated page can prefetch post/sidebar navigation\ntargets at conservative click intent using the Speculation Rules API.\nThis is deliberately **not prerendering** and does not fetch arbitrary\ncontent at startup. Visitors who prefer reduced motion receive no\nview-transition animation.\n\nTo return to established behavior, set `native = false` or omit it.\n\nThe default remains the existing navigation system while comparing\nfull-document first paint, return navigation, LCP, CLS, theme controls,\nscroll positions, focus, and keyboard behaviors on multiple browsers.\nBrowsers lacking either feature must still navigate normally. This option\nis experimental and does not guarantee better Lighthouse scores.\n",
      "summary": "Experiment with browser-native cross-document transitions and conservative prefetch.",
      "date_modified": "1970-01-01T00:00:00Z",
      "tags": [
        "performance",
        "navigation",
        "experiment"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/native-mermaid-svg/",
      "url": "https://markata.dev/docs/guides/native-mermaid-svg/",
      "title": "Native Mermaid SVG renderer",
      "content_html": "\u003ch2 id=\"native-mermaid-svg-renderer-experimental\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNative Mermaid SVG renderer (experimental)\u003c/span\u003e \u003ca href=\"#native-mermaid-svg-renderer-experimental\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMarkata can render Mermaid diagrams entirely inside its Go process, without\nstarting Chromium, launching mmdc or shipping Mermaid.js to the browser.\u003c/p\u003e\n\u003cp\u003eNative SVG is \u003cstrong\u003eopt-in\u003c/strong\u003e. Existing \u003ccode\u003eclient\u003c/code\u003e, \u003ccode\u003ecli\u003c/code\u003e and \u003ccode\u003echromium\u003c/code\u003e modes remain\navailable. Client mode remains the default until syntax, typography and visual\nverification are complete.\u003c/p\u003e\n\u003ch2 id=\"enable-in-a-site\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnable in a site\u003c/span\u003e \u003ca href=\"#enable-in-a-site\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emermaid\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;go\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003euse_css_variables\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elightbox\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emermaid\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ego\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efont_family\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;sans-serif\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efont_size\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003enode_spacing\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erank_spacing\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epadding\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecurved_edges\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etransparent_background\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe \u003ccode\u003ego\u003c/code\u003e backend reads semantic palette colors from the same site palette as\nthe other pre-rendering backends, when \u003ccode\u003euse_css_variables = true\u003c/code\u003e. The SVG\ncontains colors resolved at \u003cstrong\u003ebuild time\u003c/strong\u003e. Switching dark/light themes in\nthe browser does \u003cstrong\u003enot\u003c/strong\u003e recolor an already generated SVG; build separately\nper palette or use client-mode Mermaid for live recoloring.\u003c/p\u003e\n\u003cp\u003eFont family and size are passed to the native renderer. The generated SVG may\nrequest any CSS font family, but this library currently estimates glyph widths\nusing its built-in metrics; it does not read Markata\u0026rsquo;s bundled WOFF2 font faces\nfor exact layout. Test decorative font packs for clipped or overlapping labels\nbefore relying on them. \u003ccode\u003esans-serif\u003c/code\u003e is the conservative baseline.\u003c/p\u003e\n\u003ch2 id=\"python-fastapi-pool\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePython/FastAPI pool\u003c/span\u003e \u003ca href=\"#python-fastapi-pool\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003easync\u003c/span\u003e \u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003eRendererPool\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eworkers\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003epool\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eresponse\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003epool\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erender\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;```mermaid\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eflowchart LR\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  A[Load] --\u0026gt; B[Serve]\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e```\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003emermaid_mode\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;go\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eassert\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026lt;svg\u0026#34;\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eresponse\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ehtml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe one-shot \u003ccode\u003erender(..., mermaid_mode=\u0026quot;go\u0026quot;)\u003c/code\u003e and\n\u003ccode\u003erender_async(..., mermaid_mode=\u0026quot;go\u0026quot;)\u003c/code\u003e APIs work too.\u003c/p\u003e\n\u003cp\u003eNative mode returns SVG immediately and does not require the Mermaid.js asset.\nThe existing presentation CSS still applies. No extra subprocess is created\nper diagram; the warm pool\u0026rsquo;s Go process renders each request.\u003c/p\u003e\n\u003ch2 id=\"compatibility-performance-and-ci\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCompatibility, performance and CI\u003c/span\u003e \u003ca href=\"#compatibility-performance-and-ci\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNative SVG supports many common Mermaid families, but not every upstream\nMermaid.js diagram type. Unsupported syntax returns an explicit error rather\nthan silently turning into a wrong diagram or falling back to browser work.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNative renderer version: pinned \u003ccode\u003ego-mermaid\u003c/code\u003e v0.1.6.\u003c/li\u003e\n\u003cli\u003eBasic SVG validity and syntax are checked in Go tests and a wider fixture\ncomparison suite.\u003c/li\u003e\n\u003cli\u003eDedicated fast tests check concurrent palette isolation, unsafe input,\nnative SVG protocol output, and no bundled Mermaid browser JS.\u003c/li\u003e\n\u003cli\u003eThe render-pool benchmark measures the \u003cem\u003esame\u003c/em\u003e Markdown + Mermaid source\nwith client and native modes through identical Python APIs.\u003c/li\u003e\n\u003cli\u003eThe concurrency-1 latency bar chart includes both real full-request medians\nand separate, clearly labeled source-to-SVG microbenchmarks.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe full cross-browser/font-pack visual comparison is not complete, and a\nnative SVG is not a security sanitizer for authored diagrams.\u003c/p\u003e\n\u003cp\u003eRefer to \u003ca href=\"https://github.com/WaylonWalker/markata/pull/1891\"\u003eNative Mermaid research comparison\u003c/a\u003e\nand \u003ca href=\"https://github.com/WaylonWalker/markata/pull/1893\"\u003eNative renderer integration\u003c/a\u003e.\u003c/p\u003e\n",
      "content_text": "\n## Native Mermaid SVG renderer (experimental)\n\nMarkata can render Mermaid diagrams entirely inside its Go process, without\nstarting Chromium, launching mmdc or shipping Mermaid.js to the browser.\n\nNative SVG is **opt-in**. Existing `client`, `cli` and `chromium` modes remain\navailable. Client mode remains the default until syntax, typography and visual\nverification are complete.\n\n## Enable in a site\n\n```toml\n[markata-go.mermaid]\nenabled = true\nmode = \"go\"\nuse_css_variables = true\nlightbox = true\n\n[markata-go.mermaid.go]\nfont_family = \"sans-serif\"\nfont_size = 16\nnode_spacing = 50\nrank_spacing = 50\npadding = 16\ncurved_edges = false\ntransparent_background = false\n```\n\nThe `go` backend reads semantic palette colors from the same site palette as\nthe other pre-rendering backends, when `use_css_variables = true`. The SVG\ncontains colors resolved at **build time**. Switching dark/light themes in\nthe browser does **not** recolor an already generated SVG; build separately\nper palette or use client-mode Mermaid for live recoloring.\n\nFont family and size are passed to the native renderer. The generated SVG may\nrequest any CSS font family, but this library currently estimates glyph widths\nusing its built-in metrics; it does not read Markata's bundled WOFF2 font faces\nfor exact layout. Test decorative font packs for clipped or overlapping labels\nbefore relying on them. `sans-serif` is the conservative baseline.\n\n## Python/FastAPI pool\n\n```python\nasync with RendererPool(workers=2) as pool:\n    response = await pool.render(\n        \"```mermaid\\nflowchart LR\\n  A[Load] --\u003e B[Serve]\\n```\",\n        mermaid_mode=\"go\",\n    )\n    assert \"\u003csvg\" in response.html\n```\n\nThe one-shot `render(..., mermaid_mode=\"go\")` and\n`render_async(..., mermaid_mode=\"go\")` APIs work too.\n\nNative mode returns SVG immediately and does not require the Mermaid.js asset.\nThe existing presentation CSS still applies. No extra subprocess is created\nper diagram; the warm pool's Go process renders each request.\n\n## Compatibility, performance and CI\n\nNative SVG supports many common Mermaid families, but not every upstream\nMermaid.js diagram type. Unsupported syntax returns an explicit error rather\nthan silently turning into a wrong diagram or falling back to browser work.\n\n- Native renderer version: pinned `go-mermaid` v0.1.6.\n- Basic SVG validity and syntax are checked in Go tests and a wider fixture\n  comparison suite.\n- Dedicated fast tests check concurrent palette isolation, unsafe input,\n  native SVG protocol output, and no bundled Mermaid browser JS.\n- The render-pool benchmark measures the *same* Markdown + Mermaid source\n  with client and native modes through identical Python APIs.\n- The concurrency-1 latency bar chart includes both real full-request medians\n  and separate, clearly labeled source-to-SVG microbenchmarks.\n\nThe full cross-browser/font-pack visual comparison is not complete, and a\nnative SVG is not a security sanitizer for authored diagrams.\n\nRefer to [Native Mermaid research comparison](https://github.com/WaylonWalker/markata/pull/1891)\nand [Native renderer integration](https://github.com/WaylonWalker/markata/pull/1893).\n",
      "summary": "Opt-in browser-free Mermaid diagrams with Go, Markata palettes and warm Python rendering",
      "date_modified": "1970-01-01T00:00:00Z",
      "tags": [
        "mermaid",
        "performance",
        "diagrams"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/lazy-sidebars/",
      "url": "https://markata.dev/docs/guides/lazy-sidebars/",
      "title": "Progressive feed sidebars",
      "content_html": "\u003cp\u003eA post\u0026rsquo;s current feed remains in the HTML for immediate browsing and\nno-JavaScript navigation. If the post belongs to several feeds, other feed\npost lists are deferred \u003cstrong\u003ewhen a verified public sidebar sidecar exists\u003c/strong\u003e.\nChoosing another feed loads the matching \u003ccode\u003e/\u0026lt;feed\u0026gt;/_sidebar/NNNN.json\u003c/code\u003e window\nand enables normal feed cycling and incremental scrolling.\u003c/p\u003e\n\u003cp\u003eThe browser preserves existing navigation if fetching an alternate feed fails;\nselect the feed again to retry. Synthetic and private-unavailable feeds without\na safe sidecar are not deferred.\u003c/p\u003e\n\u003cp\u003eUse \u003ccode\u003emarkata-go build --clean\u003c/code\u003e to refresh both HTML and sidebar assets when\ntesting changes to shared templates. Inspect the new\n\u003ccode\u003eoutput/.markata/page-weight.json\u003c/code\u003e report for changes in embedded JSON bytes.\nNo full feed is arbitrarily capped: additional navigation is available on\ndemand.\u003c/p\u003e\n",
      "content_text": "\n\nA post's current feed remains in the HTML for immediate browsing and\nno-JavaScript navigation. If the post belongs to several feeds, other feed\npost lists are deferred **when a verified public sidebar sidecar exists**.\nChoosing another feed loads the matching `/\u003cfeed\u003e/_sidebar/NNNN.json` window\nand enables normal feed cycling and incremental scrolling.\n\nThe browser preserves existing navigation if fetching an alternate feed fails;\nselect the feed again to retry. Synthetic and private-unavailable feeds without\na safe sidecar are not deferred.\n\nUse `markata-go build --clean` to refresh both HTML and sidebar assets when\ntesting changes to shared templates. Inspect the new\n`output/.markata/page-weight.json` report for changes in embedded JSON bytes.\nNo full feed is arbitrarily capped: additional navigation is available on\ndemand.\n",
      "summary": "How markata-go loads alternate feed navigation only when you need it.",
      "date_modified": "1970-01-01T00:00:00Z",
      "tags": [
        "performance",
        "navigation",
        "feeds"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/icons/",
      "url": "https://markata.dev/docs/guides/icons/",
      "title": "Icon Shortcodes",
      "content_html": "\u003cp\u003emarkata-go renders Zensical-style icon shortcodes directly in Markdown.\u003c/p\u003e\n\u003cp\u003eLucide is ready by default. You can write:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eA friendly icon :lucide-smile: inline with text.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eor the slash alias:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eA friendly icon :lucide/smile: inline with text.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNo icon directory or configuration is required. The first unresolved Lucide shortcode vendors a pinned \u003ccode\u003elucide-static\u003c/code\u003e pack through markata-go\u0026rsquo;s existing icon-vendor cache, indexes the resulting local SVGs, and renders the requested icon. Builds that never use a Lucide shortcode do not download the pack.\u003c/p\u003e\n\u003cp\u003eThe default Lucide version is pinned by markata-go rather than following an upstream \u003ccode\u003elatest\u003c/code\u003e tag. Once vendored, later builds reuse the local materialization/cache and do not need to fetch it again.\u003c/p\u003e\n\u003ch2 id=\"icons-in-cards-diagrams-and-feature-lists\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIcons in cards, diagrams, and feature lists\u003c/span\u003e \u003ca href=\"#icons-in-cards-diagrams-and-feature-lists\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThese are the same thin line icons shown in modern ChatGPT-style feature\ncards. \u003cstrong\u003eNo new icon plugin or browser JavaScript is needed.\u003c/strong\u003e The \u003ccode\u003eicons\u003c/code\u003e\nplugin already emits inline SVG, and the default article theme supplies\nopt-in containers to size and position it.\u003c/p\u003e\n\u003ch3 id=\"centered-icons-in-side-by-side-cards\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCentered icons in side-by-side cards\u003c/span\u003e \u003ca href=\"#centered-icons-in-side-by-side-cards\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: md-columns\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-card {data-align=\u0026#34;center\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::: md-icon {data-size=\u0026#34;lg\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:lucide-server:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Falcon2\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eK3s node\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-card {data-align=\u0026#34;center\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::: md-icon {data-size=\u0026#34;lg\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:lucide-database:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### Falcon3\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eNAS + ZFS\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003emd-icon\u003c/code\u003e also supports \u003ccode\u003edata-size=\u0026quot;sm\u0026quot;\u003c/code\u003e (1rem) and the default 1.25rem\nsize. The \u003ccode\u003edata-size\u003c/code\u003e values affect only presentation; the source SVG\nremains a 1em icon that inherits the current text color.\u003c/p\u003e\n\u003ch3 id=\"icon-first-feature-rows\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIcon-first feature rows\u003c/span\u003e \u003ca href=\"#icon-first-feature-rows\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: md-feature\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-feature-icon\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:lucide-rocket:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-feature-body\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### 1. Verify production\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eConfirm the new image and the live page revision. Test without JavaScript.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: md-feature\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-feature-icon\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:lucide-gauge:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::: md-feature-body\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e### 2. Protect performance\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTest slow 3G and keep page-weight budgets.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::::\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe icon tile and text reflow within the article width, including on narrow\nmobile screens. The icon itself is \u003cem\u003edecorative\u003c/em\u003e and is hidden from assistive\ntechnology; the visible heading conveys the meaning. Avoid icon-only buttons\nwithout a readable text label.\u003c/p\u003e\n\u003ch3 id=\"which-syntax-should-an-agent-choose\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhich syntax should an agent choose?\u003c/span\u003e \u003ca href=\"#which-syntax-should-an-agent-choose\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eIn ordinary prose, use \u003ccode\u003e:lucide-rocket:\u003c/code\u003e (or \u003ccode\u003e:lucide/rocket:\u003c/code\u003e).\u003c/li\u003e\n\u003cli\u003eIn a card, wrap the shortcode with \u003ccode\u003e::: md-icon\u003c/code\u003e for centered/sized display.\u003c/li\u003e\n\u003cli\u003eIn a list like a feature roadmap, use a \u003ccode\u003emd-feature\u003c/code\u003e row with nested\n\u003ccode\u003emd-feature-icon\u003c/code\u003e and \u003ccode\u003emd-feature-body\u003c/code\u003e containers.\u003c/li\u003e\n\u003cli\u003eFor arbitrary connected graphs, prefer Mermaid; use \u003ccode\u003emd-feature\u003c/code\u003e for\nicon-plus-text rows rather than inventing new HTML/CSS.\u003c/li\u003e\n\u003cli\u003eIn a custom post template, reuse existing icons and styles where appropriate;\ndo not hardcode a second SVG library, icon font, or CDN.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe diagram and layout syntax is also documented under\n\u003ca href=\"/docs/guides/markdown-containers/\"\u003eMarkdown Containers\u003c/a\u003e. See the bundled\nagent skill\u0026rsquo;s \u003ccode\u003etopics/rich-markdown.md\u003c/code\u003e for authoring examples that agents\ncan use outside the Markata source repository.\u003c/p\u003e\n\u003ch2 id=\"local-icons-and-overrides\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLocal icons and overrides\u003c/span\u003e \u003ca href=\"#local-icons-and-overrides\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eProject-local SVG packs still work and take precedence over automatically vendored Lucide icons. Put SVG files under \u003ccode\u003e.icons/\u003c/code\u003e or \u003ccode\u003estatic/.icons/\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eFor this asset:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003estatic/.icons/lucide/smile.svg\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eboth \u003ccode\u003e:lucide-smile:\u003c/code\u003e and \u003ccode\u003e:lucide/smile:\u003c/code\u003e use your local SVG.\u003c/p\u003e\n\u003cp\u003eUnknown names are left unchanged, so normal emoji shortcodes such as \u003ccode\u003e:smile:\u003c/code\u003e can still be handled by the Markdown emoji extension.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfiguration\u003c/span\u003e \u003ca href=\"#configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIcon rendering and the default Lucide fallback are enabled by default:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eicons\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_vendor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epaths\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;.icons\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;static/.icons\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo disable the automatic Lucide fallback while continuing to use local icons:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eicons\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_vendor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo use only selected packs:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eicons\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epacks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;lucide\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;simple-icons\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf \u003ccode\u003epacks\u003c/code\u003e is set and does not include \u003ccode\u003elucide\u003c/code\u003e, the automatic Lucide fallback is not used.\u003c/p\u003e\n\u003cp\u003eTo use one custom icon root:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eicons\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epath\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;assets/icons\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo disable icon shortcodes entirely:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eicons\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor explicit pinning, additional icon packs, custom sources, or strict build-time vendoring, see \u003ca href=\"/docs/guides/icon-vendoring/\"\u003eVendoring Icon Packs\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"offline-builds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOffline builds\u003c/span\u003e \u003ca href=\"#offline-builds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe automatic Lucide fallback reuses markata-go\u0026rsquo;s icon vendor cache. If the pack has already been cached or materialized, it works offline.\u003c/p\u003e\n\u003cp\u003eWith \u003ccode\u003eMARKATA_GO_OFFLINE=1\u003c/code\u003e, markata-go never downloads a missing pack. If a Lucide shortcode cannot be resolved from local or cached assets, the shortcode is left unchanged instead of failing the whole site build.\u003c/p\u003e\n\u003ch2 id=\"naming\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNaming\u003c/span\u003e \u003ca href=\"#naming\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe path below an icon root becomes the logical icon name. Slashes are replaced with hyphens for the canonical Markdown alias:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSVG file\u003c/th\u003e\n\u003cth\u003eCanonical shortcode\u003c/th\u003e\n\u003cth\u003eSlash alias\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elucide/smile.svg\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e:lucide-smile:\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e:lucide/smile:\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esimple-icons/github.svg\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e:simple-icons-github:\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e:simple-icons/github:\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecustom/arrows/left.svg\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e:custom-arrows-left:\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e:custom/arrows/left:\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eIf two paths flatten to the same hyphenated alias, markata-go leaves that ambiguous alias unresolved. The explicit slash spellings continue to work.\u003c/p\u003e\n\u003ch2 id=\"code-examples-stay-literal\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCode examples stay literal\u003c/span\u003e \u003ca href=\"#code-examples-stay-literal\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIcon shortcodes are not expanded or vendored inside inline code or fenced code blocks:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis renders: :lucide-smile:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis stays literal: \u003cspan class=\"sb\"\u003e`:lucide-smile:`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```markdown\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:lucide-smile:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"svg-behavior\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSVG behavior\u003c/span\u003e \u003ca href=\"#svg-behavior\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIcons are inlined into the generated HTML, so rendered pages do not need browser-time requests for SVG files. Fixed source \u003ccode\u003ewidth\u003c/code\u003e and \u003ccode\u003eheight\u003c/code\u003e values are normalized to \u003ccode\u003e1em\u003c/code\u003e so icons follow surrounding text size.\u003c/p\u003e\n\u003cp\u003eBecause inline SVG becomes part of the page, markata-go rejects SVGs containing scripts, \u003ccode\u003eforeignObject\u003c/code\u003e, JavaScript URLs, or inline event handlers. Local and vendored SVGs go through the same safety check.\u003c/p\u003e\n\u003cp\u003eShortcodes are treated as decorative (\u003ccode\u003earia-hidden\u003c/code\u003e). When an icon communicates meaning, include readable text next to it rather than relying on the glyph alone.\u003c/p\u003e\n",
      "content_text": "\n\nmarkata-go renders Zensical-style icon shortcodes directly in Markdown.\n\nLucide is ready by default. You can write:\n\n```markdown\nA friendly icon :lucide-smile: inline with text.\n```\n\nor the slash alias:\n\n```markdown\nA friendly icon :lucide/smile: inline with text.\n```\n\nNo icon directory or configuration is required. The first unresolved Lucide shortcode vendors a pinned `lucide-static` pack through markata-go's existing icon-vendor cache, indexes the resulting local SVGs, and renders the requested icon. Builds that never use a Lucide shortcode do not download the pack.\n\nThe default Lucide version is pinned by markata-go rather than following an upstream `latest` tag. Once vendored, later builds reuse the local materialization/cache and do not need to fetch it again.\n\n## Icons in cards, diagrams, and feature lists\n\nThese are the same thin line icons shown in modern ChatGPT-style feature\ncards. **No new icon plugin or browser JavaScript is needed.** The `icons`\nplugin already emits inline SVG, and the default article theme supplies\nopt-in containers to size and position it.\n\n### Centered icons in side-by-side cards\n\n````markdown\n::: md-columns\n\n:::: md-card {data-align=\"center\"}\n\n::::: md-icon {data-size=\"lg\"}\n:lucide-server:\n\n:::::\n\n### Falcon2\nK3s node\n\n::::\n\n:::: md-card {data-align=\"center\"}\n\n::::: md-icon {data-size=\"lg\"}\n:lucide-database:\n\n:::::\n\n### Falcon3\nNAS + ZFS\n\n::::\n\n:::\n````\n\n`md-icon` also supports `data-size=\"sm\"` (1rem) and the default 1.25rem\nsize. The `data-size` values affect only presentation; the source SVG\nremains a 1em icon that inherits the current text color.\n\n### Icon-first feature rows\n\n````markdown\n::: md-feature\n\n:::: md-feature-icon\n:lucide-rocket:\n\n::::\n\n:::: md-feature-body\n### 1. Verify production\n\nConfirm the new image and the live page revision. Test without JavaScript.\n\n::::\n\n:::\n\n::: md-feature\n\n:::: md-feature-icon\n:lucide-gauge:\n\n::::\n\n:::: md-feature-body\n### 2. Protect performance\n\nTest slow 3G and keep page-weight budgets.\n\n::::\n\n:::\n````\n\nThe icon tile and text reflow within the article width, including on narrow\nmobile screens. The icon itself is *decorative* and is hidden from assistive\ntechnology; the visible heading conveys the meaning. Avoid icon-only buttons\nwithout a readable text label.\n\n### Which syntax should an agent choose?\n\n- In ordinary prose, use `:lucide-rocket:` (or `:lucide/rocket:`).\n- In a card, wrap the shortcode with `::: md-icon` for centered/sized display.\n- In a list like a feature roadmap, use a `md-feature` row with nested\n  `md-feature-icon` and `md-feature-body` containers.\n- For arbitrary connected graphs, prefer Mermaid; use `md-feature` for\n  icon-plus-text rows rather than inventing new HTML/CSS.\n- In a custom post template, reuse existing icons and styles where appropriate;\n  do not hardcode a second SVG library, icon font, or CDN.\n\nThe diagram and layout syntax is also documented under\n[Markdown Containers](/docs/guides/markdown-containers/). See the bundled\nagent skill's `topics/rich-markdown.md` for authoring examples that agents\ncan use outside the Markata source repository.\n\n## Local icons and overrides\n\nProject-local SVG packs still work and take precedence over automatically vendored Lucide icons. Put SVG files under `.icons/` or `static/.icons/`.\n\nFor this asset:\n\n```text\nstatic/.icons/lucide/smile.svg\n```\n\nboth `:lucide-smile:` and `:lucide/smile:` use your local SVG.\n\nUnknown names are left unchanged, so normal emoji shortcodes such as `:smile:` can still be handled by the Markdown emoji extension.\n\n## Configuration\n\nIcon rendering and the default Lucide fallback are enabled by default:\n\n```toml\n[icons]\nenabled = true\nauto_vendor = true\npaths = [\".icons\", \"static/.icons\"]\n```\n\nTo disable the automatic Lucide fallback while continuing to use local icons:\n\n```toml\n[icons]\nauto_vendor = false\n```\n\nTo use only selected packs:\n\n```toml\n[icons]\npacks = [\"lucide\", \"simple-icons\"]\n```\n\nIf `packs` is set and does not include `lucide`, the automatic Lucide fallback is not used.\n\nTo use one custom icon root:\n\n```toml\n[icons]\npath = \"assets/icons\"\n```\n\nTo disable icon shortcodes entirely:\n\n```toml\n[icons]\nenabled = false\n```\n\nFor explicit pinning, additional icon packs, custom sources, or strict build-time vendoring, see [Vendoring Icon Packs](/docs/guides/icon-vendoring/).\n\n## Offline builds\n\nThe automatic Lucide fallback reuses markata-go's icon vendor cache. If the pack has already been cached or materialized, it works offline.\n\nWith `MARKATA_GO_OFFLINE=1`, markata-go never downloads a missing pack. If a Lucide shortcode cannot be resolved from local or cached assets, the shortcode is left unchanged instead of failing the whole site build.\n\n## Naming\n\nThe path below an icon root becomes the logical icon name. Slashes are replaced with hyphens for the canonical Markdown alias:\n\n| SVG file | Canonical shortcode | Slash alias |\n|---|---|---|\n| `lucide/smile.svg` | `:lucide-smile:` | `:lucide/smile:` |\n| `simple-icons/github.svg` | `:simple-icons-github:` | `:simple-icons/github:` |\n| `custom/arrows/left.svg` | `:custom-arrows-left:` | `:custom/arrows/left:` |\n\nIf two paths flatten to the same hyphenated alias, markata-go leaves that ambiguous alias unresolved. The explicit slash spellings continue to work.\n\n## Code examples stay literal\n\nIcon shortcodes are not expanded or vendored inside inline code or fenced code blocks:\n\n````markdown\nThis renders: :lucide-smile:\n\nThis stays literal: `:lucide-smile:`\n\n```markdown\n:lucide-smile:\n```\n````\n\n## SVG behavior\n\nIcons are inlined into the generated HTML, so rendered pages do not need browser-time requests for SVG files. Fixed source `width` and `height` values are normalized to `1em` so icons follow surrounding text size.\n\nBecause inline SVG becomes part of the page, markata-go rejects SVGs containing scripts, `foreignObject`, JavaScript URLs, or inline event handlers. Local and vendored SVGs go through the same safety check.\n\nShortcodes are treated as decorative (`aria-hidden`). When an icon communicates meaning, include readable text next to it rather than relying on the glyph alone.\n",
      "summary": "Use Lucide and local SVG icon packs directly in Markdown",
      "date_modified": "1970-01-01T00:00:00Z",
      "tags": [
        "documentation",
        "markdown",
        "icons"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/icon-vendoring/",
      "url": "https://markata.dev/docs/guides/icon-vendoring/",
      "title": "Vendoring Icon Packs",
      "content_html": "\u003cp\u003emarkata-go has two related icon-vendoring paths:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eLucide is automatic on first use.\u003c/strong\u003e A shortcode such as \u003ccode\u003e:lucide-smile:\u003c/code\u003e can be used with no configuration. If no local Lucide asset exists, markata-go vendors its pinned default \u003ccode\u003elucide-static\u003c/code\u003e pack, then resolves the shortcode from the resulting local SVG tree.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eExplicit vendoring remains available\u003c/strong\u003e for custom Lucide pins, additional packs, custom archive sources, or builds that want missing packs to be a hard error.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eOrdinary builds that never reference a missing Lucide icon do not download the default pack.\u003c/p\u003e\n\u003ch2 id=\"explicit-lucide-pin-from-npm\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExplicit Lucide pin from npm\u003c/span\u003e \u003ca href=\"#explicit-lucide-pin-from-npm\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eicons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evendor\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eicons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evendor\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epacks\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;lucide\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eversion\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1.48.0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esource\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;npm\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epackage\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;lucide-static\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eicons_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;icons\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elicense_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;LICENSE\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOn the first build, markata-go downloads and caches the pinned npm tarball, copies its SVGs to \u003ccode\u003estatic/.icons/lucide/\u003c/code\u003e, and writes the pack license to \u003ccode\u003estatic/.icons/licenses/lucide.txt\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eYou can then use the local icons normally:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:lucide-smile: Hello!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:lucide/github: Source code\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe first form follows Zensical\u0026rsquo;s hyphenated shortcode spelling. The slash form is a markata-go alias for the same local asset.\u003c/p\u003e\n\u003cp\u003eExplicit vendoring runs during Configure, so it downloads/materializes configured packs whether or not a particular icon appears in the current content. The zero-config Lucide fallback is different: it waits until a missing Lucide shortcode is encountered.\u003c/p\u003e\n\u003ch2 id=\"disable-the-automatic-lucide-fallback\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDisable the automatic Lucide fallback\u003c/span\u003e \u003ca href=\"#disable-the-automatic-lucide-fallback\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf you want icon rendering to remain strictly local unless \u003ccode\u003e[icons.vendor]\u003c/code\u003e is explicitly configured:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eicons\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eauto_vendor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis does not disable explicitly configured \u003ccode\u003e[icons.vendor]\u003c/code\u003e packs.\u003c/p\u003e\n\u003ch2 id=\"pin-versions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePin versions\u003c/span\u003e \u003ca href=\"#pin-versions\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEvery explicitly vendored pack requires a version. This keeps the cache key and generated icon tree deterministic rather than silently following \u003ccode\u003elatest\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThe built-in Lucide fallback is also pinned by markata-go. When markata-go updates that pin, already cached/materialized packs continue to follow the normal vendor fingerprint and replacement behavior.\u003c/p\u003e\n\u003cp\u003eWhen you explicitly upgrade a pack, change its configured version and rebuild. markata-go replaces that pack\u0026rsquo;s materialized icon directory so icons removed upstream do not remain as stale files.\u003c/p\u003e\n\u003ch2 id=\"custom-cache-and-target\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom cache and target\u003c/span\u003e \u003ca href=\"#custom-cache-and-target\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eicons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evendor\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecache_dir\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.cache/markata-icons\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;static/.icons\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDefaults for explicit vendoring are:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecache: \u003ccode\u003e.markata/cache/icon-packs\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003etarget: \u003ccode\u003estatic/.icons\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe zero-config Lucide fallback reuses those same vendor/cache mechanics and selects an icon root that the shortcode renderer already scans.\u003c/p\u003e\n\u003ch2 id=\"pack-specific-archive-layout\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePack-specific archive layout\u003c/span\u003e \u003ca href=\"#pack-specific-archive-layout\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDifferent packages arrange SVGs and licenses differently. Configure those archive-relative paths per pack:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eicons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evendor\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epacks\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;my-pack\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eversion\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2.4.0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esource\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;npm\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epackage\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;my-icon-package\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003earchive_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;package\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eicons_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dist/icons\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elicense_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;LICENSE.md\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003earchive_path\u003c/code\u003e defaults to \u003ccode\u003epackage\u003c/code\u003e, which matches standard npm tarballs. \u003ccode\u003eicons_path\u003c/code\u003e defaults to \u003ccode\u003eicons\u003c/code\u003e, and \u003ccode\u003elicense_path\u003c/code\u003e defaults to \u003ccode\u003eLICENSE\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"direct-tgz-archives\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDirect \u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e.tgz\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e archives\u003c/span\u003e \u003ca href=\"#direct-tgz-archives\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou can also use a versioned HTTP or HTTPS tarball directly:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eicons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evendor\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epacks\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;house-icons\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eversion\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2026.09.1\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esource\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/house-icons-2026.09.1.tgz\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003earchive_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;package\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eicons_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;svg\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elicense_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;LICENSE.txt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDirect sources use the same archive cache and extraction safety checks as other markata-go vendored assets.\u003c/p\u003e\n\u003ch2 id=\"offline-builds\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOffline builds\u003c/span\u003e \u003ca href=\"#offline-builds\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe vendor plugin reuses markata-go\u0026rsquo;s asset cache. After a successful online build, deleting a materialized icon directory and rebuilding can recreate it from the cache without downloading the archive again.\u003c/p\u003e\n\u003cp\u003eTo prohibit runtime network access entirely:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMARKATA_GO_OFFLINE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e markata-go build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor \u003cstrong\u003eexplicit\u003c/strong\u003e \u003ccode\u003e[icons.vendor]\u003c/code\u003e packs, offline mode requires the archive cache or an existing materialized pack; otherwise the build fails.\u003c/p\u003e\n\u003cp\u003eFor the \u003cstrong\u003eautomatic Lucide fallback\u003c/strong\u003e, a cache miss does not fail the site build. The unresolved shortcode remains literal. This lets normal offline builds keep working even when a previously unused Lucide icon appears.\u003c/p\u003e\n\u003ch2 id=\"licenses\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLicenses\u003c/span\u003e \u003ca href=\"#licenses\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEach vendored pack must provide the file named by \u003ccode\u003elicense_path\u003c/code\u003e. markata-go copies it to:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003estatic/.icons/licenses/\u0026lt;pack-name\u0026gt;.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThat preserves the upstream license alongside the files being redistributed. You are still responsible for confirming that a pack\u0026rsquo;s license is appropriate for your site.\u003c/p\u003e\n\u003ch2 id=\"svg-safety\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSVG safety\u003c/span\u003e \u003ca href=\"#svg-safety\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDownloaded SVGs are checked before publication. markata-go rejects a pack if an SVG contains common active-content constructs such as scripts, \u003ccode\u003eforeignObject\u003c/code\u003e, JavaScript URLs, or inline event handlers.\u003c/p\u003e\n\u003cp\u003eOnly \u003ccode\u003e.svg\u003c/code\u003e files under the configured icon directory are copied; symlinks are ignored.\u003c/p\u003e\n\u003ch2 id=\"multiple-packs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMultiple packs\u003c/span\u003e \u003ca href=\"#multiple-packs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAdd more \u003ccode\u003e[[icons.vendor.packs]]\u003c/code\u003e blocks as needed. Pack names must be unique because the name becomes the first directory component and shortcode namespace.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eicons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evendor\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eenabled\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eicons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evendor\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epacks\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;lucide\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eversion\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1.48.0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esource\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;npm\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003epackage\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;lucide-static\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"nx\"\u003eicons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003evendor\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epacks\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;brand\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eversion\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1.3.0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esource\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://example.com/brand-icons-1.3.0.tgz\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eicons_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;svg\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003elicense_path\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;LICENSE.txt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBecause vendoring only populates local files, rendered pages do not perform browser-time requests to an icon service or CDN.\u003c/p\u003e\n",
      "content_text": "\n\nmarkata-go has two related icon-vendoring paths:\n\n1. **Lucide is automatic on first use.** A shortcode such as `:lucide-smile:` can be used with no configuration. If no local Lucide asset exists, markata-go vendors its pinned default `lucide-static` pack, then resolves the shortcode from the resulting local SVG tree.\n2. **Explicit vendoring remains available** for custom Lucide pins, additional packs, custom archive sources, or builds that want missing packs to be a hard error.\n\nOrdinary builds that never reference a missing Lucide icon do not download the default pack.\n\n## Explicit Lucide pin from npm\n\n```toml\n[icons.vendor]\nenabled = true\n\n[[icons.vendor.packs]]\nname = \"lucide\"\nversion = \"1.48.0\"\nsource = \"npm\"\npackage = \"lucide-static\"\nicons_path = \"icons\"\nlicense_path = \"LICENSE\"\n```\n\nOn the first build, markata-go downloads and caches the pinned npm tarball, copies its SVGs to `static/.icons/lucide/`, and writes the pack license to `static/.icons/licenses/lucide.txt`.\n\nYou can then use the local icons normally:\n\n```markdown\n:lucide-smile: Hello!\n\n:lucide/github: Source code\n```\n\nThe first form follows Zensical's hyphenated shortcode spelling. The slash form is a markata-go alias for the same local asset.\n\nExplicit vendoring runs during Configure, so it downloads/materializes configured packs whether or not a particular icon appears in the current content. The zero-config Lucide fallback is different: it waits until a missing Lucide shortcode is encountered.\n\n## Disable the automatic Lucide fallback\n\nIf you want icon rendering to remain strictly local unless `[icons.vendor]` is explicitly configured:\n\n```toml\n[icons]\nauto_vendor = false\n```\n\nThis does not disable explicitly configured `[icons.vendor]` packs.\n\n## Pin versions\n\nEvery explicitly vendored pack requires a version. This keeps the cache key and generated icon tree deterministic rather than silently following `latest`.\n\nThe built-in Lucide fallback is also pinned by markata-go. When markata-go updates that pin, already cached/materialized packs continue to follow the normal vendor fingerprint and replacement behavior.\n\nWhen you explicitly upgrade a pack, change its configured version and rebuild. markata-go replaces that pack's materialized icon directory so icons removed upstream do not remain as stale files.\n\n## Custom cache and target\n\n```toml\n[icons.vendor]\nenabled = true\ncache_dir = \".cache/markata-icons\"\ntarget = \"static/.icons\"\n```\n\nDefaults for explicit vendoring are:\n\n- cache: `.markata/cache/icon-packs`\n- target: `static/.icons`\n\nThe zero-config Lucide fallback reuses those same vendor/cache mechanics and selects an icon root that the shortcode renderer already scans.\n\n## Pack-specific archive layout\n\nDifferent packages arrange SVGs and licenses differently. Configure those archive-relative paths per pack:\n\n```toml\n[[icons.vendor.packs]]\nname = \"my-pack\"\nversion = \"2.4.0\"\nsource = \"npm\"\npackage = \"my-icon-package\"\narchive_path = \"package\"\nicons_path = \"dist/icons\"\nlicense_path = \"LICENSE.md\"\n```\n\n`archive_path` defaults to `package`, which matches standard npm tarballs. `icons_path` defaults to `icons`, and `license_path` defaults to `LICENSE`.\n\n## Direct `.tgz` archives\n\nYou can also use a versioned HTTP or HTTPS tarball directly:\n\n```toml\n[[icons.vendor.packs]]\nname = \"house-icons\"\nversion = \"2026.09.1\"\nsource = \"url\"\nurl = \"https://example.com/house-icons-2026.09.1.tgz\"\narchive_path = \"package\"\nicons_path = \"svg\"\nlicense_path = \"LICENSE.txt\"\n```\n\nDirect sources use the same archive cache and extraction safety checks as other markata-go vendored assets.\n\n## Offline builds\n\nThe vendor plugin reuses markata-go's asset cache. After a successful online build, deleting a materialized icon directory and rebuilding can recreate it from the cache without downloading the archive again.\n\nTo prohibit runtime network access entirely:\n\n```bash\nMARKATA_GO_OFFLINE=1 markata-go build\n```\n\nFor **explicit** `[icons.vendor]` packs, offline mode requires the archive cache or an existing materialized pack; otherwise the build fails.\n\nFor the **automatic Lucide fallback**, a cache miss does not fail the site build. The unresolved shortcode remains literal. This lets normal offline builds keep working even when a previously unused Lucide icon appears.\n\n## Licenses\n\nEach vendored pack must provide the file named by `license_path`. markata-go copies it to:\n\n```text\nstatic/.icons/licenses/\u003cpack-name\u003e.txt\n```\n\nThat preserves the upstream license alongside the files being redistributed. You are still responsible for confirming that a pack's license is appropriate for your site.\n\n## SVG safety\n\nDownloaded SVGs are checked before publication. markata-go rejects a pack if an SVG contains common active-content constructs such as scripts, `foreignObject`, JavaScript URLs, or inline event handlers.\n\nOnly `.svg` files under the configured icon directory are copied; symlinks are ignored.\n\n## Multiple packs\n\nAdd more `[[icons.vendor.packs]]` blocks as needed. Pack names must be unique because the name becomes the first directory component and shortcode namespace.\n\n```toml\n[icons.vendor]\nenabled = true\n\n[[icons.vendor.packs]]\nname = \"lucide\"\nversion = \"1.48.0\"\nsource = \"npm\"\npackage = \"lucide-static\"\n\n[[icons.vendor.packs]]\nname = \"brand\"\nversion = \"1.3.0\"\nsource = \"url\"\nurl = \"https://example.com/brand-icons-1.3.0.tgz\"\nicons_path = \"svg\"\nlicense_path = \"LICENSE.txt\"\n```\n\nBecause vendoring only populates local files, rendered pages do not perform browser-time requests to an icon service or CDN.\n",
      "summary": "Download pinned SVG icon packs for local icon shortcodes",
      "date_modified": "1970-01-01T00:00:00Z",
      "tags": [
        "documentation",
        "markdown",
        "icons",
        "assets"
      ]
    },
    {
      "id": "https://markata.dev/docs/guides/editor-frontmatter/",
      "url": "https://markata.dev/docs/guides/editor-frontmatter/",
      "title": "Editing page properties",
      "content_html": "\u003cp\u003eIn the Markata workbench, \u003cstrong\u003eProperties\u003c/strong\u003e (beside the current file name) opens the\nvisual frontmatter editor. You can also use the command palette\n(\u003cstrong\u003ePage: Edit Properties\u003c/strong\u003e) or \u003cstrong\u003eCtrl/Cmd+Alt+Shift+M\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eProperties start \u003cstrong\u003eclosed\u003c/strong\u003e and the underlying YAML header is folded away, so\nwriting feels like editing a document rather than configuring a build.\u003c/p\u003e\n\u003ch2 id=\"common-editing-tasks\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommon editing tasks\u003c/span\u003e \u003ca href=\"#common-editing-tasks\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTitle, description, slug, date, tags:\u003c/strong\u003e edit the corresponding form field.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePublished and Draft:\u003c/strong\u003e separate switches, since these have distinct meaning.\n`draft: true` excludes a page from output; `published: false` excludes it\nfrom public listings but can leave a directly accessible shadow page.\nThe form warns when both `published` and `draft` are true.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFeatured image, authors, layout, templates, series, canonical URL:\u003c/strong\u003e add these\nfrom the property picker, or edit them when already present.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOther metadata:\u003c/strong\u003e enter a custom property name and select its value type.\nMarkata permits plugin/site-specific extra properties, so the form does not\nreject an unrecognized but safe YAML property name.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNested maps and lists:\u003c/strong\u003e expand the object/list editor, add or remove\nentries, and set the type of nested values.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eEdit YAML\u003c/strong\u003e reveals the original source header in the CodeMirror editor\nwithout creating a second copy of frontmatter. Use this for YAML aliases,\nanchors, merge keys, unusual custom keys, or when you prefer the full syntax.\n\u003cstrong\u003eHide YAML\u003c/strong\u003e folds the header again. Both modes modify the same Markdown file.\u003c/p\u003e\n\u003ch2 id=\"what-gets-written\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat gets written\u003c/span\u003e \u003ca href=\"#what-gets-written\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe form patches the single changed top-level field using Markata\u0026rsquo;s Go YAML\nparser. Other frontmatter fields keep their existing syntax, comments,\norder, and quotation style. The Markdown body is not re-rendered into source or\nrewritten. An edited field may be normalized to standard YAML (including its\nnested value), so use raw YAML if you need exact formatting within that field.\u003c/p\u003e\n\u003cp\u003eThe editor sends changes through the \u003cstrong\u003esame autosave, preview, diagnostics and\nGit publish-review\u003c/strong\u003e flow as normal typing. Opening the form does not publish\nanything, and no new frontmatter defaults are silently added. A missing\nproperty stays missing until you explicitly add it.\u003c/p\u003e\n\u003cp\u003eMalformed YAML is never silently replaced; fix it in source mode before using\nthe form. Workbench frontmatter requests are restricted to the local\nsame-origin workspace, have source-size limits, and do not write files directly.\u003c/p\u003e\n\u003cp\u003eSee the \u003ca href=\"/docs/guides/frontmatter/\"\u003efrontmatter field guide\u003c/a\u003e for the detailed\nMarkata semantics and accepted date/metadata formats.\u003c/p\u003e\n",
      "content_text": "\n\nIn the Markata workbench, **Properties** (beside the current file name) opens the\nvisual frontmatter editor. You can also use the command palette\n(**Page: Edit Properties**) or **Ctrl/Cmd+Alt+Shift+M**.\n\nProperties start **closed** and the underlying YAML header is folded away, so\nwriting feels like editing a document rather than configuring a build.\n\n## Common editing tasks\n\n- **Title, description, slug, date, tags:** edit the corresponding form field.\n- **Published and Draft:** separate switches, since these have distinct meaning.\n  \\`draft: true\\` excludes a page from output; \\`published: false\\` excludes it\n  from public listings but can leave a directly accessible shadow page.\n  The form warns when both \\`published\\` and \\`draft\\` are true.\n- **Featured image, authors, layout, templates, series, canonical URL:** add these\n  from the property picker, or edit them when already present.\n- **Other metadata:** enter a custom property name and select its value type.\n  Markata permits plugin/site-specific extra properties, so the form does not\n  reject an unrecognized but safe YAML property name.\n- **Nested maps and lists:** expand the object/list editor, add or remove\n  entries, and set the type of nested values.\n\n**Edit YAML** reveals the original source header in the CodeMirror editor\nwithout creating a second copy of frontmatter. Use this for YAML aliases,\nanchors, merge keys, unusual custom keys, or when you prefer the full syntax.\n**Hide YAML** folds the header again. Both modes modify the same Markdown file.\n\n## What gets written\n\nThe form patches the single changed top-level field using Markata's Go YAML\nparser. Other frontmatter fields keep their existing syntax, comments,\norder, and quotation style. The Markdown body is not re-rendered into source or\nrewritten. An edited field may be normalized to standard YAML (including its\nnested value), so use raw YAML if you need exact formatting within that field.\n\nThe editor sends changes through the **same autosave, preview, diagnostics and\nGit publish-review** flow as normal typing. Opening the form does not publish\nanything, and no new frontmatter defaults are silently added. A missing\nproperty stays missing until you explicitly add it.\n\nMalformed YAML is never silently replaced; fix it in source mode before using\nthe form. Workbench frontmatter requests are restricted to the local\nsame-origin workspace, have source-size limits, and do not write files directly.\n\nSee the [frontmatter field guide](/docs/guides/frontmatter/) for the detailed\nMarkata semantics and accepted date/metadata formats.\n",
      "summary": "In the Markata workbench, ** (beside the current file name) opens the visual frontmatter editor. You can also use the command palette (**) or **.",
      "date_modified": "1970-01-01T00:00:00Z",
      "tags": [
        "documentation",
        "editor",
        "frontmatter"
      ]
    }
  ]
}